diff --git a/.github/workflows/AppFwkUnitTest.yml b/.github/workflows/AppFwkUnitTest.yml index e187311735..b4d20fcadb 100644 --- a/.github/workflows/AppFwkUnitTest.yml +++ b/.github/workflows/AppFwkUnitTest.yml @@ -10,33 +10,25 @@ jobs: os: [ubuntu-latest, windows-latest] steps: - name: Checkout - uses: actions/checkout@v2 - - - name: Cache Qt - id: cache-qt - uses: actions/cache@v2 - with: - path: ${{ github.workspace }}/Qt/ - key: ${{ runner.os }}-QtCache-5-12-12 + uses: actions/checkout@v3 - name: Install Qt - uses: jurplel/install-qt-action@v2 + uses: jurplel/install-qt-action@v3 with: version: 5.12.12 modules: qtscript dir: "${{ github.workspace }}/Qt/" - cached: ${{ steps.cache-qt.outputs.cache-hit }} + cache: true - name: Install Linux dependencies if: "contains( matrix.os, 'ubuntu')" run: sudo apt-get install libxkbcommon-x11-0 libgl1-mesa-dev mesa-common-dev libglfw3-dev libglu1-mesa-dev - name: Build AppFwk with Unit Tests - uses: lukka/run-cmake@v1 + uses: lukka/run-cmake@v3 with: cmakeListsOrSettingsJson: CMakeListsTxtAdvanced cmakeListsTxtPath: "${{ github.workspace }}/Fwk/AppFwk/CMakeLists.txt" - cmakeAppendedArgs: buildDirectory: ${{ github.workspace }}/cmakebuild buildWithCMakeArgs: "--config Release" useVcpkgToolchainFile: false diff --git a/.github/workflows/ResInsightWithCache.yml b/.github/workflows/ResInsightWithCache.yml index 57c75dcbc2..72c28918ed 100644 --- a/.github/workflows/ResInsightWithCache.yml +++ b/.github/workflows/ResInsightWithCache.yml @@ -22,7 +22,7 @@ jobs: config: - { name: "Windows Latest MSVC", - os: windows-latest, + os: windows-2022, cc: "cl", cxx: "cl", vcpkg-response-file: vcpkg_x64-windows.txt, @@ -32,7 +32,7 @@ jobs: } - { name: "Ubuntu Latest gcc", - os: ubuntu-latest, + os: ubuntu-20.04, cc: "gcc", cxx: "g++", vcpkg-response-file: vcpkg_x64-linux.txt, @@ -42,7 +42,7 @@ jobs: } - { name: "Ubuntu Latest clang", - os: ubuntu-latest, + os: ubuntu-20.04, cc: "clang", cxx: "clang++", vcpkg-response-file: vcpkg_x64-linux.txt, @@ -52,7 +52,7 @@ jobs: } steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: submodules: true @@ -64,11 +64,12 @@ jobs: run: python -c "import sys; print(sys.version)" - name: Get Python executable path + shell: bash id: python-path - run: echo "::set-output name=PYTHON_EXECUTABLE::$(python -c 'import sys; import pathlib; print (pathlib.PurePath(sys.executable).as_posix())')" + run: echo "PYTHON_EXECUTABLE=$(python -c 'import sys; import pathlib; print (pathlib.PurePath(sys.executable).as_posix())')" >> $GITHUB_OUTPUT - name: Print Python path - run: echo ${{ steps.python-path.outputs.PYTHON_EXECUTABLE }} + run: echo "${{ steps.python-path.outputs.PYTHON_EXECUTABLE }}" - name: Install dependencies # Make sure protobuf version is compatible with grpc - https://github.com/OPM/ResInsight/issues/9304 @@ -105,18 +106,21 @@ jobs: ) endif() - - name: Prepare cache timestamp - id: cache_timestamp_string - shell: cmake -P {0} - run: | - string(TIMESTAMP current_date "%Y-%m-%d" UTC) - message("::set-output name=timestamp::${current_date}") + - name: Get current time + uses: josStorer/get-current-time@v2.0.2 + id: current-time + with: + format: YYYY-MM-DD + + - name: Print time stamp + run: echo "timestamp ${{ steps.current-time.outputs.formattedTime }}" + - name: Cache Buildcache id: cache-buildcache uses: actions/cache@v3 with: path: ${{ env.BUILDCACHE_DIR }} - key: ${{ matrix.config.os }}-${{ matrix.config.cc }}-cache-v02-${{ steps.cache_timestamp_string.outputs.timestamp }} + key: ${{ matrix.config.os }}-${{ matrix.config.cc }}-cache-v02-${{ steps.current-time.outputs.formattedTime }} - name: Create Folder for buildcache run: New-Item ${{ env.BUILDCACHE_DIR }} -ItemType "directory" -Force shell: pwsh @@ -124,20 +128,13 @@ jobs: run: echo "${{github.workspace}}/buildcache/bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 shell: pwsh - - name: Cache Qt - id: cache-qt - uses: actions/cache@v3 - with: - path: ${{ github.workspace }}/Qt/ - key: ${{ matrix.config.os }}-QtCache-5-12-12 - name: Install Qt - uses: jurplel/install-qt-action@v2 + uses: jurplel/install-qt-action@v3 with: - setup-python: false version: 5.12.12 - modules: qtscript qtcharts + modules: qtscript dir: "${{ github.workspace }}/Qt/" - cached: ${{ steps.cache-qt.outputs.cache-hit }} + cache: true - name: Install Linux dependencies if: "contains( matrix.config.os, 'ubuntu')" diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml index 1437d42268..59e6464644 100644 --- a/.github/workflows/clang-format.yml +++ b/.github/workflows/clang-format.yml @@ -6,32 +6,30 @@ jobs: clang-format-job: runs-on: ubuntu-20.04 steps: - - name: Install clang-format 10.0 - run: | - sudo apt install clang-format - clang-format --version - - uses: actions/checkout@v2 - - name: Check format - ApplicationLibCode - run: | - cd ApplicationLibCode - find -name *.h -o -name *.cpp -o -name *.inl | xargs clang-format -i - git diff - - name: Check format - ApplicationExeCode - run: | - cd ApplicationExeCode - find -name *.h -o -name *.cpp -o -name *.inl | xargs clang-format -i - git diff - - name: Check format - AppFwk - run: | - cd Fwk/AppFwk - find -name *.h -o -name *.cpp -o -name *.inl | grep -v gtest | xargs clang-format -i - git diff - - uses: peter-evans/create-pull-request@v3 - with: - token: ${{ secrets.GITHUB_TOKEN }} - commit-message: 'Fixes by clang-format' - title: 'Fixes by clang-format' - branch: clang-format-patches - branch-suffix: random - - \ No newline at end of file + - name: Install clang-format 10.0 + run: | + sudo apt install clang-format + clang-format --version + - uses: actions/checkout@v3 + - name: Check format - ApplicationLibCode + run: | + cd ApplicationLibCode + find -name *.h -o -name *.cpp -o -name *.inl | xargs clang-format -i + git diff + - name: Check format - ApplicationExeCode + run: | + cd ApplicationExeCode + find -name *.h -o -name *.cpp -o -name *.inl | xargs clang-format -i + git diff + - name: Check format - AppFwk + run: | + cd Fwk/AppFwk + find -name *.h -o -name *.cpp -o -name *.inl | grep -v gtest | xargs clang-format -i + git diff + - uses: peter-evans/create-pull-request@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: "Fixes by clang-format" + title: "Fixes by clang-format" + branch: clang-format-patches + branch-suffix: random diff --git a/.github/workflows/clang-tidy.yml b/.github/workflows/clang-tidy.yml index c125691c7b..4075464693 100644 --- a/.github/workflows/clang-tidy.yml +++ b/.github/workflows/clang-tidy.yml @@ -4,7 +4,7 @@ on: workflow_dispatch: schedule: # Once every night - - cron: '0 1 * * * ' + - cron: "0 1 * * * " jobs: ResInsight-x64-buildcache: @@ -13,32 +13,29 @@ jobs: fail-fast: false matrix: config: - - { - name: "Ubuntu 20.04", - os: ubuntu-20.04, - cc: "gcc", cxx: "g++", - vcpkg-response-file: vcpkg_x64-linux.txt, - vcpkg-triplet: x64-linux, - cmake-toolchain: 'ThirdParty/vcpkg/scripts/buildsystems/vcpkg.cmake' - } + - { + name: "Ubuntu 20.04", + os: ubuntu-20.04, + cc: "gcc", + cxx: "g++", + vcpkg-response-file: vcpkg_x64-linux.txt, + vcpkg-triplet: x64-linux, + cmake-toolchain: "ThirdParty/vcpkg/scripts/buildsystems/vcpkg.cmake", + } steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: submodules: true - - name: Cache Qt - id: cache-qt - uses: actions/cache@v2 - with: - path: ${{ github.workspace }}/Qt/ - key: ${{ matrix.config.os }}-QtCache-5-12-12 + - name: Install Qt - uses: jurplel/install-qt-action@v2 + uses: jurplel/install-qt-action@v3 with: version: 5.12.12 - modules: qtscript qtcharts - dir: '${{ github.workspace }}/Qt/' - cached: ${{ steps.cache-qt.outputs.cache-hit }} + modules: qtscript + dir: "${{ github.workspace }}/Qt/" + cache: true + - name: Install Linux dependencies if: "contains( matrix.config.os, 'ubuntu')" run: sudo apt-get install libxkbcommon-x11-0 libgl1-mesa-dev mesa-common-dev libglfw3-dev libglu1-mesa-dev libhdf5-dev @@ -50,9 +47,10 @@ jobs: uses: lukka/run-vcpkg@v7 id: runvcpkg with: - vcpkgArguments: '@${{ github.workspace }}/${{ matrix.config.vcpkg-response-file }}' - vcpkgDirectory: '${{ github.workspace }}/ThirdParty/vcpkg' - # Ensure the cache key changes any time the content of the response file changes. + vcpkgArguments: "@${{ github.workspace }}/${{ matrix.config.vcpkg-response-file }}" + vcpkgDirectory: + "${{ github.workspace }}/ThirdParty/vcpkg" + # Ensure the cache key changes any time the content of the response file changes. appendedCacheKey: ${{ hashFiles(env.VCPKGRESPONSEFILE) }}-clang-tidy-v01 - name: Create compile commands and run clang-tidy # https://clang.llvm.org/extra/doxygen/run-clang-tidy_8py_source.html @@ -89,10 +87,10 @@ jobs: cd ThirdParty/vcpkg git reset --hard HEAD git clean -fxd - - uses: peter-evans/create-pull-request@v3 + - uses: peter-evans/create-pull-request@v4 with: token: ${{ secrets.GITHUB_TOKEN }} - commit-message: 'Fixes by clang-tidy' - title: 'Fixes by clang-tidy' + commit-message: "Fixes by clang-tidy" + title: "Fixes by clang-tidy" branch: clang-tidy-patches branch-suffix: random diff --git a/.github/workflows/cmake-format.yml b/.github/workflows/cmake-format.yml index ceff186c2a..73989b74fa 100644 --- a/.github/workflows/cmake-format.yml +++ b/.github/workflows/cmake-format.yml @@ -4,34 +4,34 @@ on: [push] jobs: cmake-format-job: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 steps: - - name: Install cmakelang for cmake-format - run: | - python3 -m pip install --user cmakelang - - uses: actions/checkout@v2 - - name: Check format - ApplicationLibCode - run: | - ~/.local/bin/cmake-format -c ${{ github.workspace }}/cmake/cmake-format.py -i CMakeLists.txt + - name: Install cmakelang for cmake-format + run: | + python3 -m pip install --user cmakelang + - uses: actions/checkout@v3 + - name: Check format - ApplicationLibCode + run: | + ~/.local/bin/cmake-format -c ${{ github.workspace }}/cmake/cmake-format.py -i CMakeLists.txt - cd ApplicationLibCode - find -name CMake*.txt | xargs ~/.local/bin/cmake-format -c ${{ github.workspace }}/cmake/cmake-format.py -i - find -name CMake*.cmake | xargs ~/.local/bin/cmake-format -c ${{ github.workspace }}/cmake/cmake-format.py -i - cd .. + cd ApplicationLibCode + find -name CMake*.txt | xargs ~/.local/bin/cmake-format -c ${{ github.workspace }}/cmake/cmake-format.py -i + find -name CMake*.cmake | xargs ~/.local/bin/cmake-format -c ${{ github.workspace }}/cmake/cmake-format.py -i + cd .. - cd ApplicationExeCode - find -name CMake*.txt | xargs ~/.local/bin/cmake-format -c ${{ github.workspace }}/cmake/cmake-format.py -i - cd .. + cd ApplicationExeCode + find -name CMake*.txt | xargs ~/.local/bin/cmake-format -c ${{ github.workspace }}/cmake/cmake-format.py -i + cd .. - cd Fwk/AppFwk - find -name CMake*.txt | xargs ~/.local/bin/cmake-format -c ${{ github.workspace }}/cmake/cmake-format.py -i - cd .. + cd Fwk/AppFwk + find -name CMake*.txt | xargs ~/.local/bin/cmake-format -c ${{ github.workspace }}/cmake/cmake-format.py -i + cd .. - git diff - - uses: peter-evans/create-pull-request@v3 - with: - token: ${{ secrets.GITHUB_TOKEN }} - commit-message: 'Fixes by cmake-format' - title: 'Fixes by cmake-format' - branch: cmake-format-patches - branch-suffix: random + git diff + - uses: peter-evans/create-pull-request@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: "Fixes by cmake-format" + title: "Fixes by cmake-format" + branch: cmake-format-patches + branch-suffix: random diff --git a/.github/workflows/delete_artifacts.yml b/.github/workflows/delete_artifacts.yml index 193629ee44..f187b2207a 100644 --- a/.github/workflows/delete_artifacts.yml +++ b/.github/workflows/delete_artifacts.yml @@ -3,7 +3,7 @@ name: Remove old artifacts on: schedule: # Every day at 1am - - cron: '0 1 * * *' + - cron: "0 1 * * *" jobs: remove-old-artifacts: @@ -12,9 +12,9 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: setup python - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: 3.8 - name: Remove old artifacts diff --git a/.github/workflows/python-linting.yml b/.github/workflows/python-linting.yml index 29d727d62a..f0ee1f4e78 100644 --- a/.github/workflows/python-linting.yml +++ b/.github/workflows/python-linting.yml @@ -4,20 +4,20 @@ on: [push, pull_request] jobs: lint: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 - name: (Python) Use black to do linting run: | pip install black cd GrpcInterface black . - - uses: peter-evans/create-pull-request@v3 + - uses: peter-evans/create-pull-request@v4 with: token: ${{ secrets.GITHUB_TOKEN }} - commit-message: 'Python code linting changes detected by black' - title: 'Fixes by black (Python)' + commit-message: "Python code linting changes detected by black" + title: "Fixes by black (Python)" branch: python-black-patches branch-suffix: random base: ${{ github.head_ref }} diff --git a/.github/workflows/spell-check.yml b/.github/workflows/spell-check.yml index 4f2451d074..542f162d38 100644 --- a/.github/workflows/spell-check.yml +++ b/.github/workflows/spell-check.yml @@ -5,20 +5,16 @@ on: jobs: build: - - runs-on: ubuntu-latest - + runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@v2 - - uses: sobolevn/misspell-fixer-action@master - with: - options: '-rsvnuR ApplicationLibCode/' - - uses: peter-evans/create-pull-request@v3 - with: - token: ${{ secrets.GITHUB_TOKEN }} - commit-message: 'Fixes by misspell-fixer' - title: 'Typos fix by misspell-fixer' - branch: spell-check-patches - branch-suffix: random - - + - uses: actions/checkout@v3 + - uses: sobolevn/misspell-fixer-action@master + with: + options: "-rsvnuR ApplicationLibCode/" + - uses: peter-evans/create-pull-request@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: "Fixes by misspell-fixer" + title: "Typos fix by misspell-fixer" + branch: spell-check-patches + branch-suffix: random diff --git a/.gitmodules b/.gitmodules index 199a9aa3d9..12478201a1 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,3 +13,6 @@ [submodule "ThirdParty/custom-opm-common/opm-common"] path = ThirdParty/custom-opm-common/opm-common url = https://github.com/CeetronSolutions/opm-common +[submodule "ThirdParty/roffcpp"] + path = ThirdParty/roffcpp + url = https://github.com/CeetronSolutions/roffcpp diff --git a/ApplicationExeCode/CMakeLists.txt b/ApplicationExeCode/CMakeLists.txt index 6212817d17..7fb931713a 100644 --- a/ApplicationExeCode/CMakeLists.txt +++ b/ApplicationExeCode/CMakeLists.txt @@ -30,7 +30,6 @@ if(Qt5Core_FOUND) Gui OpenGL Network - Script Widgets Xml Concurrent @@ -43,7 +42,6 @@ if(Qt5Core_FOUND) Qt5::Gui Qt5::Network Qt5::OpenGL - Qt5::Script Qt5::Widgets Qt5::Xml Qt5::Concurrent diff --git a/ApplicationLibCode/Adm/LicenseInformation.txt b/ApplicationLibCode/Adm/LicenseInformation.txt index f712971dbd..40ac91b60d 100644 --- a/ApplicationLibCode/Adm/LicenseInformation.txt +++ b/ApplicationLibCode/Adm/LicenseInformation.txt @@ -559,3 +559,60 @@ https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/blob/master/LICEN [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] + +=============================================================================== + Notice for the fmtlib library +=============================================================================== + +https://github.com/fmtlib/fmt + + +Copyright (c) 2012 - present, Victor Zverovich + +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. + +--- Optional exception to the license --- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into a machine-executable object form of such +source code, you may redistribute such embedded portions in such object form +without including the above copyright and permission notices. + +=============================================================================== + Notice for the roffcpp library +=============================================================================== + +https://github.com/CeetronSolutions/roffcpp + + +Copyright (C) 2023- Equinor ASA + +roffcpp 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 3 of the License, or +(at your option) any later version. + +roffcpp 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 at +for more details. + diff --git a/ApplicationLibCode/Adm/projectfilekeywords/2023.01/ri-fieldKeywords.txt b/ApplicationLibCode/Adm/projectfilekeywords/2023.01/ri-fieldKeywords.txt new file mode 100644 index 0000000000..a2947219c2 --- /dev/null +++ b/ApplicationLibCode/Adm/projectfilekeywords/2023.01/ri-fieldKeywords.txt @@ -0,0 +1,4890 @@ +// ResInsight version string : 2023.01.0 +// Report generated : Tue Jan 10 12:36:28 2023 +// +// + +AnalysisPlot - class RimAnalysisPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + RowSpan + ColSpan + AnalysisPlotData + TimeStepFilter + TimeSteps + ReferenceCase + IsUsingAutoName + PlotDescription + BarOrientation + MajorGroupType + MediumGroupType + MinorGroupType + ValueSortOperation + groupForColors + UseTopBarsFilter + MaxBarCount + UseBarText + UseCaseInBarText + UseEnsembleInBarText + UseSummaryItemInBarText + UseTimeStepInBarText + UseQuantityInBarText + BarTextFontSize + ValueAxisProperties + PlotDataFilterCollection + +AnalysisPlotCollection - class RimAnalysisPlotCollection + AnalysisPlots + +AnalysisPlotDataEntry - class RimAnalysisPlotDataEntry + SummaryCase + Ensemble + SummaryAddress + IsEnsembleCurve + +Annotations - class RimAnnotationInViewCollection + IsActive + TextAnnotations + AnnotationPlaneDepth + SnapAnnotations + TextAnnotationsInView + ReachCircleAnnotationsInView + UserDefinedPolylinesAnnotationsInView + PolylinesFromFileAnnotationsInView + AnnotationFontSize + +AsciiDataCurve - class RimAsciiDataCurve + Show + CurveName + TemplateText + CurveNamingMethod + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + AdditionalDataSources + PlotAxis + TimeSteps + Values + Title + +CalcScript - class RimCalcScript + AbsolutePath + +CalculatedSummaryCase - class RimCalculatedSummaryCase + ShortName + NameSetting + ShowSubNodesInTree + AutoShortyName + SummaryHeaderFilename + Id + (A)CaseId + +CellEdgeResultSlot - class RimCellEdgeColors + EnableCellEdgeColors + propertyType + CellEdgeVariable + UseXVariable + UseYVariable + UseZVariable + LegendDefinition + SelectedProperties + ShowTextValuesIfItemIsUnchecked + SingleVarEdgeResult + +CellFilterCollection - class RimCellFilterCollection + Active + CellFilters + RangeFilters + +CellPropertyFilter - class RimEclipsePropertyFilter + UserDescription + Active + FilterType + GridIndex + PropagateToSubGrids + SelectedValues + ResultDefinition + LowerBound + UpperBound + CategorySelection + IsDuplicatedFromLinkedView + +CellPropertyFilters - class RimEclipsePropertyFilterCollection + Active + PropertyFilters + +CellRangeFilter - class RimCellRangeFilter + UserDescription + Active + FilterType + GridIndex + PropagateToSubGrids + StartIndexI + CellCountI + StartIndexJ + CellCountJ + StartIndexK + CellCountK + +CellRangeFilterCollection - class RimCellFilterCollection + Active + CellFilters + RangeFilters + +ChangeDataSourceFeatureUi - class RimWellLogCurveCommonDataSource + CurveCase + SummaryCase + TrajectoryType + CurveWellPath + CurveReferenceWellPath + SimulationWellName + BranchDetection + Allow3DSelectionLink + Branch + CurveTimeStep + WBSSmoothing + WBSSmoothingThreshold + RftTimeStep + RftWellName + SegmentBranchIndex + SegmentBranchType + +CmdSelectionChangeExecData - class caf::CmdSelectionChangeExecData + selectionLevel + previousSelection + newSelection + +ColorLegend - class RimColorLegend + ColorLegendName + ColorLegendItems + +ColorLegendCollection - class RimColorLegendCollection + CustomColorLegends + +ColorLegendItem - class RimColorLegendItem + Color + CategoryValue + CategoryName + +CompletionTemplateCollection - class RimCompletionTemplateCollection + FractureTemplates + StimPlanModelTemplates + ValveTemplates + FractureGroupStatisticsCollection + +CorrelationMatrixPlot - class RimCorrelationMatrixPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + RowSpan + ColSpan + AnalysisPlotData + TimeStepFilter + TimeStep + AutoTitle + PlotTitle + LabelFontSize + AxisTitleFontSize + AxisValueFontSize + UseCaseFilter + CurveSetForFiltering + EditCaseFilter + CorrelationAbsValues + CorrelationSorting + CorrelationAbsSorting + ExcludeParamsWithoutVariation + ShowOnlyTopNCorrelations + TopNFilterCount + LegendConfig + SelectedParameters + +CorrelationPlot - class RimCorrelationPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + RowSpan + ColSpan + AnalysisPlotData + TimeStepFilter + TimeStep + AutoTitle + PlotTitle + LabelFontSize + AxisTitleFontSize + AxisValueFontSize + UseCaseFilter + CurveSetForFiltering + EditCaseFilter + CorrelationAbsValues + CorrelationAbsSorting + ExcludeParamsWithoutVariation + ShowOnlyTopNCorrelations + TopNFilterCount + SelectedParameters + +CorrelationPlotCollection - class RimCorrelationPlotCollection + CorrelationPlots + CorrelationReports + +CorrelationReportPlot - class RimCorrelationReportPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + PlotWindowTitle + MatrixPlot + CorrelationPlot + CrossPlot + SubTitleFontSize + LabelFontSize + AxisTitleFontSize + AxisValueFontSize + +CrossSection - class RimExtrudedCurveIntersection + Active + ShowInactiveCells + UseSeparateIntersectionDataSource + SeparateIntersectionDataSource + UserDescription + Type + Direction + WellPath + SimulationWell + Points + PointsUi + AzimuthAngle + DipAngle + CustomExtrusionPoints + TwoAzimuthPoints + Branch + ExtentLength + lengthUp + lengthDown + SurfaceIntersections + UpperThreshold + LowerThreshold + DepthFilter + CollectionUpperThreshold + CollectionLowerThreshold + ThresholdOverridden + CollectionDepthFilterType + +CrossSectionCollection - class RimIntersectionCollection + CrossSections + IntersectionBoxes + Active + UpperDepthThreshold + LowerDepthThreshold + DepthFilterOverride + CollectionDepthFilterType + +CurveIntersection - class RimExtrudedCurveIntersection + Active + ShowInactiveCells + UseSeparateIntersectionDataSource + SeparateIntersectionDataSource + UserDescription + Type + Direction + WellPath + SimulationWell + Points + PointsUi + AzimuthAngle + DipAngle + CustomExtrusionPoints + TwoAzimuthPoints + Branch + ExtentLength + lengthUp + lengthDown + SurfaceIntersections + UpperThreshold + LowerThreshold + DepthFilter + CollectionUpperThreshold + CollectionLowerThreshold + ThresholdOverridden + CollectionDepthFilterType + +DataContainerFloat - class RimcDataContainerDouble + values + +DataContainerString - class RimcDataContainerString + values + +DataContainerTime - class RimcDataContainerTime + values + +DepthTrackPlot - class RimDepthTrackPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + PlotDescription + TemplateText + PlotNamingMethod + DepthType + DepthUnit + MinimumDepth + MaximumDepth + ShowDepthGridLines + AutoScaleDepthEnabled + DepthAxisVisibility + ShowDepthMarkerLine + AutoZoomMinDepthFactor + AutoZoomMaxDepthFactor + DepthAnnotations + SubTitleFontSize + AxisTitleFontSize + AxisValueFontSize + NameConfig + FilterEnsembleCurveSet + DepthEqualization + Tracks + DepthOrientation + +DoubleParameter - class RimDoubleParameter + Name + Label + Description + Advanced + Valid + Value + +Eclipse2dViewCollection - class RimEclipseContourMapViewCollection + EclipseViews + +EclipseCase - class RimEclipseResultCase + Name + (A)CaseUserDescription + NameSetting + Id + (A)CaseId + FilePath + (A)CaseFileName + (A)GridFileName + DefaultFormationNames + TimeStepFilter + IntersectionViewCollection + ReservoirViews + MatrixModelResults + FractureModelResults + FlipXAxis + FlipYAxis + ContourMaps + InputPropertyCollection + UnitSystem + FlowDiagSolutions + SourSimFileName + +EclipseGeometrySelectionItem - class RimEclipseGeometrySelectionItem + EclipseCase + GridIndex + CellIndex + LocalIntersectionPoint + +EclipseResultAddress - class RimEclipseResultAddress + ResultName + ResultType + EclipseCase + +ElasticProperties - class RimElasticProperties + FilePath + ShowScaledProperties + PropertyScalingCollection + +ElasticPropertyScaling - class RimElasticPropertyScaling + Name + IsChecked + Formation + Facies + Property + Scale + +ElasticPropertyScalingCollection - class RimElasticPropertyScalingCollection + ElasticPropertyScalings + +EnsembleFractureStatistics - class RimEnsembleFractureStatistics + Name + FilePaths + ExcludeZeroWidthFractures + MeshAlignmentType + MeshType + NumberOfSamplesX + NumberOfSamplesY + AdaptiveMeanType + AdaptiveNumLayersType + AdaptiveNumLayers + SelectedStatisticsType + ComputeStatistics + +EnsembleFractureStatisticsPlot - class RimEnsembleFractureStatisticsPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + PlotDescription + NumHistogramBins + HistogramBarColor + HistogramGapWidth + HistogramFrequencyType + Precision + TickNumberFormat + GraphType + EnsembleFractureStatistics + Property + +EnsembleFractureStatisticsPlotCollection - class RimEnsembleFractureStatisticsPlotCollection + EnsembleFractureStatisticsPlots + +EnsembleStatisticsSurface - class RimEnsembleStatisticsSurface + SurfaceUserDecription + SurfaceColor + DepthOffset + StatisticsType + +EnsembleSurface - class RimEnsembleSurface + SurfaceUserDecription + SubCollections + SurfacesField + FilterEnsembleCurveSet + +EnsembleWellLogStatisticsCurve - class RimEnsembleWellLogStatisticsCurve + Show + CurveName + TemplateText + CurveNamingMethod + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + AdditionalDataSources + StackCurve + StackPhaseColors + ReferenceWellPath + UseReferenceWellPath + TrajectoryType + CurveWellPath + SimulationWellName + BranchDetection + Branch + CurveCase + CurveEclipseResult + CurveGeomechResult + CurveTimeStep + AddCaseNameToCurveName + AddPropertyToCurveName + AddWellNameToCurveName + AddTimestepToCurveName + AddDateToCurveName + EnsembleWellLogCurveSet + StatisticsType + +EnsembleWellLogs - class RimEnsembleWellLogs + Name + WellLogFiles + +EnsembleWellLogsCollection - class RimEnsembleWellLogsCollection + EnsembleWellLogsCollection + +FaciesInitialPressureConfig - class RimFaciesInitialPressureConfig + IsChecked + FaciesName + FaciesValue + Fraction + +FaciesProperties - class RimFaciesProperties + FilePath + FaciesDefinition + ColorLegend + +Fault - class RimFaultInView + FaultName + ShowFault + Color + +Faults - class RimFaultInViewCollection + Active + ShowFaultFaces + ShowOppositeFaultFaces + ShowFaultsOutsideFilters + OnlyShowWithDefNeighbor + FaultFaceCulling + ShowFaultLabel + FaultLabelColor + ShowNNCs + HideNncsWhenNoResultIsAvailable + Faults + +FileSummaryCase - class RimFileSummaryCase + ShortName + NameSetting + ShowSubNodesInTree + AutoShortyName + SummaryHeaderFilename + Id + (A)CaseId + IncludeRestartFiles + AdditionalSummaryFilePath + RftCase + +FileSurface - class RimFileSurface + SurfaceUserDecription + SurfaceColor + DepthOffset + SurfaceFilePath + +FishbonesCollection - class RimFishbonesCollection + Name + IsChecked + FishbonesSubs + StartMD + MainBoreDiameter + MainBoreSkinFactor + +FishbonesMultipleSubs - class RimFishbones + Active + Name + Color + LateralCountPerSub + LateralLength + LateralExitAngle + LateralBuildAngle + LateralTubingDiameter + LateralOpenHoleRoghnessFactor + LateralTubingRoghnessFactor + LateralInstallSuccessFraction + IcdCount + IcdOrificeDiameter + IcdFlowCoefficient + SubsLocationMode + RangeStart + RangeEnd + RangeSubSpacing + RangeSubCount + LocationOfSubs + ValveLocations + SubsOrientationMode + InstallationRotationAngles + FixedInstallationRotationAngle + PipeProperties + +FishbonesPipeProperties - class RimFishbonesPipeProperties + LateralHoleDiameter + SkinFactor + +FlowCharacteristicsPlot - class RimFlowCharacteristicsPlot + WindowController + ShowWindow + WindowGeometry + FlowCase + FlowDiagSolution + TimeSelectionType + SelectedTimeSteps + SelectedTimeStepsUi + CellPVThreshold + ShowLegend + CellFilter + CellFilterView + TracerFilter + SelectedTracerNames + MinCommunication + MaxTof + +FlowDiagSolution - class RimFlowDiagSolution + UserDescription + +FlowPlotCollection - class RimFlowPlotCollection + FlowCharacteristicsPlot + DefaultWellAllocationPlot + WellDistributionPlotCollection + StoredWellAllocationPlots + StoredFlowCharacteristicsPlots + +FormationNames - class RimFormationNames + FormationNamesFileName + +FormationNamesCollectionObject - class RimFormationNamesCollection + FormationNamesList + +FractureContainment - class RimFractureContainment + IsUsingFractureContainment + TopKLayer + BaseKLayer + TruncateAtFaults + FaultThrowValue + +FractureDefinitionCollection - class RimFractureTemplateCollection + DefaultUnitForTemplates + FractureDefinitions + NextValidFractureTemplateId + +FractureGroupStatisticsCollection - class RimEnsembleFractureStatisticsCollection + FractureGroupStatistics + +FractureTemplateCollection - class RimFractureTemplateCollection + DefaultUnitForTemplates + FractureDefinitions + NextValidFractureTemplateId + +GeoMech2dViewCollection - class RimGeoMechContourMapViewCollection + GeoMechViews + +GeoMechGeometrySelectionItem - class RimGeoMechGeometrySelectionItem + GeoMechCase + m_gridIndex + m_cellIndex + m_elementFace + m_hasIntersectionTriangle + m_intersectionTriangle_0 + m_intersectionTriangle_1 + m_intersectionTriangle_2 + m_localIntersectionPoint + +GeoMechPart - class RimGeoMechPart + Name + IsChecked + PartId + +GeoMechPartCollection - class RimGeoMechPartCollection + Parts + +GeoMechPropertyFilter - class RimGeoMechPropertyFilter + UserDescription + Active + FilterType + GridIndex + PropagateToSubGrids + SelectedValues + ResultDefinition + LowerBound + UpperBound + +GeoMechPropertyFilters - class RimGeoMechPropertyFilterCollection + Active + PropertyFilters + +GeoMechResultDefinition - class RimGeoMechResultDefinition + IsChecked + ResultPositionType + ResultFieldName + ResultComponentName + TimeLapseBaseTimeStep + ReferenceTimeStep + CompactionRefLayer + NormalizeByHSP + NormalizationAirGap + +GeoMechResultSlot - class RimGeoMechCellColors + IsChecked + ResultPositionType + ResultFieldName + ResultComponentName + TimeLapseBaseTimeStep + ReferenceTimeStep + CompactionRefLayer + NormalizeByHSP + NormalizationAirGap + LegendDefinition + +GeoMechView - class RimGeoMechView + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + NameConfig + CameraPosition + CameraPointOfInterest + PerspectiveProjection + GridZScale + BackgroundColor + (A)ViewBackgroundColor + MaximumFrameRate + CurrentTimeStep + MeshMode + SurfaceMode + ShowGridBox + DisableLighting + ShowZScale + ComparisonView + FontSize + CrossSections + IntersectionResultDefColl + ReservoirSurfaceResultDefColl + GridCollection + OverlayInfoConfig + WellMeasurements + SurfaceInViewCollection + RangeFilters + GridCellResult + TensorResults + PropertyFilters + Parts + ShowDisplacement + DisplacementScaling + +GridCaseSurface - class RimGridCaseSurface + SurfaceUserDecription + SurfaceColor + DepthOffset + SourceCase + SliceIndex + Watertight + +GridCollection - class RimGridCollection + IsActive + MainGrid + PersistentLgrs + +GridCrossPlotCurve - class RimGridCrossPlotCurve + Show + CurveName + TemplateText + CurveNamingMethod + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + AdditionalDataSources + +GridCrossPlotCurveSet - class RimGridCrossPlotDataSet + Name + IsChecked + Case + TimeStep + VisibleCellView + Grouping + XAxisProperty + YAxisProperty + GroupingProperty + NameConfig + CrossPlotCurves + UseCustomColor + CustomColor + PlotCellFilterCollection + +GridInfo - class RimGridInfo + IsActive + GridName + GridIndex + +GridInfoCollection - class RimGridInfoCollection + IsActive + GridInfos + +GridStatisticsPlot - class RimGridStatisticsPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + PlotDescription + NumHistogramBins + HistogramBarColor + HistogramGapWidth + HistogramFrequencyType + Precision + TickNumberFormat + GraphType + Case + TimeStep + VisibleCellView + Property + +GridStatisticsPlotCollection - class RimGridStatisticsPlotCollection + GridStatisticsPlots + +GridSummaryCase - class RimGridSummaryCase + ShortName + NameSetting + ShowSubNodesInTree + AutoShortyName + SummaryHeaderFilename + Id + (A)CaseId + Associated3DCase + CachedCasename + Associated3DCaseGridFileName + IncludeRestartFiles + +GridTimeHistoryCurve - class RimGridTimeHistoryCurve + Show + CurveName + TemplateText + CurveNamingMethod + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + AdditionalDataSources + GeometrySelectionText + EclipseResultDefinition + GeoMechResultDefinition + GeometrySelectionItem + PlotAxis + +IntegerParameter - class RimIntegerParameter + Name + Label + Description + Advanced + Valid + Value + +Intersection2dView - class Rim2dIntersectionView + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + NameConfig + CameraPosition + CameraPointOfInterest + PerspectiveProjection + GridZScale + BackgroundColor + (A)ViewBackgroundColor + MaximumFrameRate + CurrentTimeStep + MeshMode + SurfaceMode + ShowGridBox + DisableLighting + ShowZScale + ComparisonView + FontSize + Intersection + ShowDefiningPoints + ShowAxisLines + +Intersection2dViewCollection - class Rim2dIntersectionViewCollection + IntersectionViews + +IntersectionBox - class RimBoxIntersection + Active + ShowInactiveCells + UseSeparateIntersectionDataSource + SeparateIntersectionDataSource + UserDescription + singlePlaneState + MinXCoord + MaxXCoord + MinYCoord + MaxYCoord + MinDepth + MaxDepth + xySliderStepSize + DepthSliderStepSize + +IntersectionCollection - class RimIntersectionCollection + CrossSections + IntersectionBoxes + Active + UpperDepthThreshold + LowerDepthThreshold + DepthFilterOverride + CollectionDepthFilterType + +IntersectionResultDefinition - class RimIntersectionResultDefinition + IsActive + Case + TimeStep + IntersectionResultDefinitionDescription + EclipseResultDef + GeoMechResultDef + LegendConfig + TernaryLegendConfig + +Legend - class RimRegularLegendConfig + ShowLegend + NumberOfLevels + Precision + TickNumberFormat + ColorRangeMode + ColorLegend + MappingMode + RangeType + UserDefinedMax + UserDefinedMin + CategoryColorMode + ResultVariableUsage + ResetDefaultValues + CenterLegendAroundZero + +ListParameter - class RimListParameter + Name + Label + Description + Advanced + Valid + Value + +MainPlotCollection - class RimMainPlotCollection + Show + WellLogPlotCollection + RftPlotCollection + PltPlotCollection + SummaryMultiPlotCollection + AnalysisPlotCollection + CorrelationPlotCollection + SummaryCrossPlotCollection + FlowPlotCollection + Rim3dCrossPlotCollection + RimSaturationPressurePlotCollection + RimMultiPlotCollection + StimPlanModelPlotCollection + VfpPlotCollection + GridStatisticsPlotCollection + EnsembleFractureStatisticsPlotCollection + SummaryPlotCollection + +MdiWindowController - class RimMdiWindowController + MainWindowID + xPos + yPos + Width + Height + IsMaximized + +MockModelSettings - class RimMockModelSettings + CellCountX + CellCountY + CellCountZ + TotalCellCount + ResultCount + TimeStepCount + +ModeledWellPath - class RimModeledWellPath + Name + (A)WellPathName + AirGap + DatumElevation + UnitSystem + SimWellName + SimBranchIndex + ShowWellPathLabel + ShowWellPath + WellPathRadiusScale + WellPathColor + Completions + CompletionSettings + WellLogFiles + CollectionOf3dWellLogCurves + WellPathFormationKeyInFile + WellPathFormationFilePath + WellPathAttributes + WellPathTieIn + WellIASettings + WellPathGeometryDef + +MultiPlot - class RimMultiPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + ProjectFileVersionString + ShowTitleInPlot + PlotDescription + Plots + NumberOfColumns + RowsPerPage + ShowPlotTitles + MajorTickmarkCount + SubTitleFontSize + PagePreviewMode + +MultiSnapshotDefinition - class RimAdvancedSnapshotExportDefinition + IsActive + View + EclipseResultType + SelectedEclipseResults + TimeStepStart + TimeStepEnd + SnapShotDirection + RangeFilterStart + RangeFilterEnd + AdditionalCases + +MultiSummaryPlot - class RimSummaryMultiPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + ProjectFileVersionString + ShowTitleInPlot + PlotDescription + Plots + NumberOfColumns + RowsPerPage + ShowPlotTitles + MajorTickmarkCount + SubTitleFontSize + PagePreviewMode + AutoPlotTitle + AutoSubPlotTitle + LinkSubPlotAxes + LinkTimeAxis + AutoAdjustAppearance + Allow3DSelectionLink + AxisRangeAggregation + PlotFilterYAxisThreshold + DefaultStepDimension + +NonNetLayers - class RimNonNetLayers + IsChecked + Cutoff + Facies + FaciesDefinition + +ObservedDataCollection - class RimObservedDataCollection + ObservedDataArray + ObservedFmuRftDataArray + +ObservedFmuRftData - class RimObservedFmuRftData + Name + Directory + +ParameterGroup - class RimParameterGroup + Parameters + Name + Label + Comment + Expanded + ParameterLists + +ParameterList - class RimParameterList + ParameterNames + Name + Label + +ParameterResultCrossPlot - class RimParameterResultCrossPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + RowSpan + ColSpan + AnalysisPlotData + TimeStepFilter + TimeStep + AutoTitle + PlotTitle + LabelFontSize + AxisTitleFontSize + AxisValueFontSize + UseCaseFilter + CurveSetForFiltering + EditCaseFilter + EnsembleParameter + +PdmDocument - class caf::PdmDocument + DocumentFileName + +PdmObjectCollection - class caf::PdmObjectCollection + PdmObjects + +PdmObjectGroup - class caf::PdmObjectGroup + +Perforation - class RimPerforationInterval + Name + IsChecked + StartMeasuredDepth + EndMeasuredDepth + Diameter + SkinFactor + StartOfHistory + UseCustomStartDate + StartDate + UseCustomEndDate + EndDate + Valves + +PerforationCollection - class RimPerforationCollection + Name + IsChecked + Perforations + NonDarcyParameters + +PlotDataFilterCollection - class RimPlotDataFilterCollection + IsActive + PlotDataFiltersField + +PlotDataFilterItem - class RimPlotDataFilterItem + IsActive + FilterTarget + FilterAddressField + QuantityText + FilterOperation + MinTopN + Max + Min + EnsembleParameterValueCategories + ConsideredTimestepsType + ExplicitlySelectedTimeSteps + +PlotTemplateCollection - class RimPlotTemplateFolderItem + FolderName + FileNames + SubFolders + +PlotTemplateFileItem - class RimPlotTemplateFileItem + AbsolutePath + +PolyLineFilter - class RimPolygonFilter + UserDescription + Active + FilterType + GridIndex + PropagateToSubGrids + PolygonFilterType + PolyIncludeType + Targets + Case + ShowLines + ShowSpheres + LineThickness + SphereRadiusFactor + LineColor + SphereColor + EnableFiltering + EnableKFilter + KRangeFilter + PolygonPlaneDepth + LockPolygon + +PolygonFilter - class RimPolygonFilter + UserDescription + Active + FilterType + GridIndex + PropagateToSubGrids + PolygonFilterType + PolyIncludeType + Targets + Case + ShowLines + ShowSpheres + LineThickness + SphereRadiusFactor + LineColor + SphereColor + EnableFiltering + EnableKFilter + KRangeFilter + PolygonPlaneDepth + LockPolygon + +PolylineTarget - class RimPolylineTarget + IsEnabled + TargetPointXyd + +PolylinesFromFileAnnotation - class RimPolylinesFromFileAnnotation + IsActive + ClosePolyline + ShowLines + ShowSpheres + Appearance + PolyLineFilePath + PolyLineDescription + +PressureTable - class RimPressureTable + Items + PressureDate + +PressureTableItem - class RimPressureTableItem + Depth + InitialPressure + Pressure + +PropertyFilter - class RimPropertyFilter + UserDescription + Active + FilterType + GridIndex + PropagateToSubGrids + SelectedValues + +ResInsightAnalysisModels - class RimEclipseCaseCollection + Reservoirs + CaseGroups + +ResInsightGeoMechCase - class RimGeoMechCase + Name + (A)CaseUserDescription + NameSetting + Id + (A)CaseId + FilePath + (A)CaseFileName + (A)GridFileName + DefaultFormationNames + TimeStepFilter + IntersectionViewCollection + GeoMechViews + CaseCohesion + FrctionAngleDeg + ElementPropertyFileNames + BiotCoefficientType + BiotFixedCoefficient + BiotResultAddress + InitialPermeabilityType + InitialPermeabilityFixed + InitialPermeabilityAddress + PermeabilityExponent + WaterDensityShearSlipIndicator + ContourMaps + MudWeightWindowParameters + +ResInsightGeoMechModels - class RimGeoMechModels + Cases + +ResInsightOilField - class RimOilField + AnalysisModels + GeoMechModels + WellPathCollection + CompletionTemplateCollection + SummaryCaseCollection + FormationNamesCollection + ObservedDataCollection + AnnotationCollection + EnsembleWellLogsCollection + FractureDefinitionCollection + SurfaceCollection + +ResInsightProject - class RimProject + DocumentFileName + ProjectFileVersionString + ReferencedExternalFiles + OilFields + ColorLegendCollection + WellPathImport + MainPlotCollection + LinkedViews + CalculationCollection + GridCalculationCollection + CommandObjects + MultiSnapshotDefinitions + TreeViewStates + TreeViewCurrentModelIndexPaths + PlotWindowTreeViewStates + PlotWindowTreeViewCurrentModelIndexPaths + show3DWindow + showPlotWindow + tiled3DWindow + tiledPlotWindow + DialogData + Reservoirs + CaseGroups + TileMode3DWindow + TileModePlotWindow + +ResampleData - class RimcSummaryResampleData + TimeSteps + Values + +ReservoirCellResultStorage - class RimReservoirCellResultsStorage + ResultCacheFileName + ResultCacheEntries + +ReservoirView - class RimEclipseView + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + NameConfig + CameraPosition + CameraPointOfInterest + PerspectiveProjection + GridZScale + BackgroundColor + (A)ViewBackgroundColor + MaximumFrameRate + CurrentTimeStep + MeshMode + SurfaceMode + ShowGridBox + DisableLighting + ShowZScale + ComparisonView + FontSize + CrossSections + IntersectionResultDefColl + ReservoirSurfaceResultDefColl + GridCollection + OverlayInfoConfig + WellMeasurements + SurfaceInViewCollection + RangeFilters + GridCellResult + GridCellEdgeResult + ElementVectorResult + FaultResultSettings + StimPlanColors + VirtualPerforationResult + WellCollection + FaultCollection + AnnotationCollection + StreamlineCollection + PropertyFilters + ShowInactiveCells + ShowInvalidCells + AdditionalResultsForResultInfo + +ResultDefinition - class RimEclipseResultDefinition + IsChecked + ResultType + PorosityModelType + ResultVariable + FlowDiagSolution + TimeLapseBaseTimeStep + DifferenceCase + DivideByCellFaceArea + SelectedInjectorTracers + SelectedProducerTracers + SelectedSouringTracers + FlowTracerSelectionMode + PhaseSelection + ShowOnlyVisibleCategoriesInLegend + MSyncSelectedInjProd + MSyncSelectedProdInj + +ResultSlot - class RimEclipseCellColors + IsChecked + ResultType + PorosityModelType + ResultVariable + FlowDiagSolution + TimeLapseBaseTimeStep + DifferenceCase + DivideByCellFaceArea + SelectedInjectorTracers + SelectedProducerTracers + SelectedSouringTracers + FlowTracerSelectionMode + PhaseSelection + ShowOnlyVisibleCategoriesInLegend + MSyncSelectedInjProd + MSyncSelectedProdInj + LegendDefinition + ResultVarLegendDefinitionList + TernaryLegendDefinition + LegendDefinitionPtrField + +ResultStorageEntryInfo - class RimReservoirCellResultsStorageEntryInfo + ResultType + ResultName + TimeSteps + DaysSinceSimulationStart + FilePositionDataStart + +RftAddress - class RimDataSourceForRftPlt + SourceType + EclipseCase + WellLogFile + Ensemble + ObservedFmuRftData + +RiaMemoryCleanup - class RiaMemoryCleanup + DataCase + ResultsToDelete + +RiaPreferences - class RiaPreferences + navigationPolicy + enableGrpcServer + defaultGrpcPort + scriptDirectory + scriptEditorExecutable + MaxScriptFoldersDepth + octaveExecutable + octaveShowHeaderInfoWhenExecutingScripts + pythonExecutable + pythonDebugInfo + ssihubAddress + defaultMeshModeType + defaultGridLineColors + defaultFaultGridLineColors + defaultWellLableColor + defaultViewerBackgroundColor + defaultScaleFactorZ + defaultSceneFontSizePt + defaultAnnotationFontSizePt + defaultWellLabelFontSizePt + defaultPlotFontSizePt + showLegendBackground + enableFaultsByDefault + showInfoBox + showGridBox + lastUsedProjectFileName + autocomputeDepth + loadAndShowSoil + holoLensDisableCertificateVerification + csvTextExportFieldSeparator + readerSettings + dateFormat + timeFormat + useUndoRedo + plotTemplateFolders + MaxPlotTemplateFoldersDepth + defaultPlotTemplate + pageSize + pageOrientation + pageLeftMargin + pageTopMargin + pageRightMargin + pageBottomMargin + openExportedPdfInViewer + useQtChartsPlotByDefault + SurfaceImportResamplingDistance + MultiLateralWellPattern + guiTheme + summaryPreferences + geoMechPreferences + systemPreferences + +RiaPreferencesGeoMech - class RiaPreferencesGeoMech + geomechWIADefaultXML + geomechWIACommand + keepTemporaryFile + waitForInputFileEdit + +RiaPreferencesSummary - class RiaPreferencesSummary + summaryRestartFilesShowImportDialog + summaryImportMode + gridImportMode + summaryEnsembleImportMode + defaultSummaryHistoryCurveStyle + defaultSummaryCurvesTextFilter + defaultSummaryPlot + defaultSummaryTemplates + createEnhancedSummaryDataFile_v01 + useEnhancedSummaryDataFile + createH5SummaryDataFile_v01 + createH5SummaryFileThreadCount + summaryReaderType_v01 + showSummaryTimeAsLongString + useMultipleThreadsWhenLoadingSummaryCases + DefaultNumberOfColumns + DefaultRowsPerPage + curveColorByPhase + appendHistoryVectorForDragDrop + historyCurveContrastColor + +RiaPreferencesSystem - class RiaPreferencesSystem + useShaders + showHud + appendClassNameToUiText + appendFieldKeywordToToolTipText + showViewIdInTree + showTestToolbar + includeFractureDebugInfoFile + holoLensExportFolder + showProjectChangedDialog + showProgressBar + showPdfExportDialog + gtestFilter + exportScalingFactor + eclipseReaderMode + +RiaRegressionTest - class RiaRegressionTest + workingFolder + folderContainingDiffTool + folderContainingGitTool + regressionTestFolder + showInteractiveDiffImages + useOpenMPForGeometryCreation + openReportInBrowser + testFilter + appendTestsAfterTestFilter + invalidateExternalFilePaths + forcePlotEngine + exportSnapshots3dViews + exportSnapshotsPlots + +RicCaseAndFileExportSettingsUi - class RicCaseAndFileExportSettingsUi + Folder + CaseToApply + +RicCellRangeUi - class RicCellRangeUi + Case + GridIndex + StartIndexI + StartIndexJ + StartIndexK + CellCountI + CellCountJ + CellCountK + +RicCreateEnsembleSurfaceUi - class RicCreateEnsembleSurfaceUi + Layers + AutoCreateEnsembleSurfaces + MinLayer + MaxLayer + +RicCreateEnsembleWellLogUi - class RicCreateEnsembleWellLogUi + AutoCreateEnsembleWellLogs + TimeStep + WellPathSource + WellPath + WellFilePath + SelectedProperties + +RicCreateMultipleWellPathLateralsUi - class RicCreateMultipleWellPathLateralsUi + SourceLaterals + TopLevelWellPath + Locations + +RicDeleteItemExecData - class RicDeleteItemExecData + PathToField + Description + indexToObject + deletedObjectAsXml + +RicExportCarfinUi - class RicExportCarfinUi + CellRange + ExportFileName + CaseToApply + CellCountI + CellCountJ + CellCountK + MaxWellCount + +RicExportCompletionDataSettingsUi - class RicExportCompletionDataSettingsUi + Folder + CaseToApply + FileSplit + compdatExport + TimeStepIndex + IncludeMSW + UseLateralNTG + IncludePerforations + IncludeFishbones + IncludeFractures + TransScalingType + TransScalingTimeStep + TransScalingWBHPSource + TransScalingWBHP + ExcludeMainBoreForFishbones + ReportCompletionTypesSeparately + ExportDataSourceAsComment + ExportWelspec + CompletionWelspecAfterMainBore + UseCustomFileName + CustomFileName + +RicExportContourMapToTextUi - class RicExportContourMapToTextUi + ExportFileName + ExportLocalCoordinates + UndefinedValueLabel + ExcludeUndefinedValues + +RicExportEclipseInputGridUi - class RicExportEclipseSectorModelUi + ExportGrid + ExportGridFilename + ExportInLocalCoords + InvisibleCellActnum + GridBoxSelection + MinI + MinJ + MinK + MaxI + MaxJ + MaxK + ExportFaults + ExportFaultsFilename + RefinementCountI + RefinementCountJ + RefinementCountK + ExportParams + ExportParamsFilename + ExportMainKeywords + ExportFolder + +RicExportLgrUi - class RicExportLgrUi + ExportFolder + CaseToApply + TimeStepIndex + IncludePerforations + IncludeFractures + IncludeFishbones + CellCountI + CellCountJ + CellCountK + SplitType + +RicExportToLasFileObj - class RicExportToLasFileObj + tvdrkbOffset + +RicExportToLasFileResampleUi - class RicExportToLasFileResampleUi + ExportFolder + FilePrefix + CapitalizeFileName + CurveUnitConversion + ActivateResample + ResampleInterval + ExportTvdrkb + tvdrkbOffsets + +RicExportWellPathsUi - class RicExportWellPathsUi + ExportFolder + MdStepSize + +RicGridCalculator - class RicGridCalculatorUi + CurrentCalculation + NewCalculation + DeleteCalculation + +RicHoloLensCreateSessionUi - class RicHoloLensCreateSessionUi + SessionName + SessionPinCode + ServerSettings + +RicHoloLensExportToFolderUi - class RicHoloLensExportToFolderUi + ViewForExport + ExportFolder + +RicHoloLensServerSettings - class RicHoloLensServerSettings + ServerAddress + +RicLinkVisibleViewsFeatureUi - class RicLinkVisibleViewsFeatureUi + MasterView + +RicPasteAsciiDataToSummaryPlotFeatureUi - class RicPasteAsciiDataToSummaryPlotFeatureUi + PlotTitle + CurvePrefix + DecimalSeparator + DateFormat + TimeFormat + UseCustomDateFormat + CustomDateTimeFormat + LineStyle + Symbol + SymbolSkipDinstance + CellSeparator + TimeColumnName + PreviewText + +RicSaturationPressureUi - class RicSaturationPressureUi + CaseToApply + TimeStep + +RicSaveEclipseInputVisibleCellsUi - class RicSaveEclipseInputVisibleCellsUi + ExportFilename + ExportKeyword + VisibleActiveCellsValue + HiddenActiveCellsValue + InactiveCellsValue + +RicSaveMultiPlotTemplateFeatureSettings - class RicSaveMultiPlotTemplateFeatureSettings + FilePath + Name + PersistObjectNameWells + PersistObjectNameGroups + PersistObjectNameRegions + +RicSelectCaseOrEnsembleUi - class RicSelectCaseOrEnsembleUi + SelectedSummaryCase + SelectedEnsemble + +RicSelectPlotTemplateUi - class RicSelectPlotTemplateUi + SelectedPlotTemplates + +RicSelectSummaryPlotUI - class RicSelectSummaryPlotUI + SelectedSummaryPlot + CreateNewPlot + NewViewName + +RicSelectViewUI - class RicSelectViewUI + MasterView + CreateNewView + NewViewName + +RicSummaryAddressSelection - class RiuSummaryVectorSelectionUi + SummaryCases + CurrentSummaryCategory + SelectedSummaryCategories + FieldVectors + Aquifers + AquiferVectors + NetworkVectors + MiscVectors + Regions + RegionsVectors + Region2RegionRegions + Region2RegionVectors + WellGroupWellGroupNames + WellGroupVectors + WellWellName + WellVectors + WellCompletionWellName + WellCompletionIjk + WellCompletionVectors + WellCompletionLgrLgrName + WellCompletionLgrWellName + WellCompletionLgrIjk + WellCompletionLgrVectors + WellLgrLgrName + WellLgrWellName + WellLgrVectors + WellSegmentWellName + WellSegmentNumber + WellSegmentVectors + BlockIjk + BlockVectors + BlockLgrLgrName + BlockLgrIjk + BlockLgrVectors + CalculatedVectors + ImportedVectors + +RicSummaryCurveCalculator - class RicSummaryCurveCalculatorUi + CurrentCalculation + NewCalculation + DeleteCalculation + +RicSummaryCurveCreator - class RicSummaryPlotEditorUi + TargetPlot + UseAutoAppearanceAssignment + AppearanceApplyButton + CaseAppearanceType + VariableAppearanceType + WellAppearanceType + GroupAppearanceType + RegionAppearanceType + UseAutoPlotTitle + ApplySelection + Close + OK + SummaryCurveNameConfig + +RicWellPathsUnitSystemSettingsUi - class RicWellPathsUnitSystemSettingsUi + UnitSystem + +RifReaderSettings - class RifReaderSettings + importFaults + importSimulationNNCs + includeInactiveCellsInFaultGeometry + importAdvancedMswData + useResultIndexFile + skipWellData + includeFileAbsolutePathPrefix + importSummaryData + +Rim3dWellLogCurveCollection - class Rim3dWellLogCurveCollection + Show3dWellLogCurves + PlaneWidthScaling + Show3dWellLogGrid + Show3dWellLogBackground + ArrayOf3dWellLogCurves + +Rim3dWellLogExtractionCurve - class Rim3dWellLogExtractionCurve + Show3dWellLogCurve + MinCurveValue + MaxCurveValue + DrawPlane + CurveColor + CurveCase + CurveTimeStep + CurveEclipseResult + CurveGeomechResult + NameConfig + +Rim3dWellLogFileCurve - class Rim3dWellLogFileCurve + Show3dWellLogCurve + MinCurveValue + MaxCurveValue + DrawPlane + CurveColor + CurveWellLogChannel + WellLogFile + NameConfig + +Rim3dWellLogRftCurve - class Rim3dWellLogRftCurve + Show3dWellLogCurve + MinCurveValue + MaxCurveValue + DrawPlane + CurveColor + eclipseResultCase + timeStep + wellLogChannelName + NameConfig + +RimAnnotationCollection - class RimAnnotationCollection + IsActive + TextAnnotations + ReachCircleAnnotations + UserDefinedPolylineAnnotations + PolylineFromFileAnnotations + +RimAnnotationCollectionBase - class RimAnnotationCollectionBase + IsActive + TextAnnotations + +RimAnnotationGroupCollection - class RimAnnotationGroupCollection + IsActive + Annotations + +RimAnnotationLineAppearance - class RimAnnotationLineAppearance + LineFieldsHidden + Color + Thickness + +RimAnnotationTextAppearance - class RimAnnotationTextAppearance + FontSize + FontColor + BackgroundColor + AnchorLineColor + +RimBinaryExportSettings - class RimBinaryExportSettings + Filename + EclipseKeyword + UndefinedValue + +RimCaseCollection - class RimCaseCollection + Reservoirs + +RimCellFilterCollection - class RimCellFilterCollection + Active + CellFilters + RangeFilters + +RimCommandExecuteScript - class RimCommandExecuteScript + Name + ScriptText + IsEnabled + +RimCommandIssueFieldChanged - class RimCommandIssueFieldChanged + CommandName + ObjectName + FieldName + FieldValueToApply + +RimCommandObject - class RimCommandObject + +RimCommandRouter - class RimCommandRouter + +RimContourMapView - class RimEclipseContourMapView + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + NameConfig + CameraPosition + CameraPointOfInterest + PerspectiveProjection + GridZScale + BackgroundColor + (A)ViewBackgroundColor + MaximumFrameRate + CurrentTimeStep + MeshMode + SurfaceMode + ShowGridBox + DisableLighting + ShowZScale + ComparisonView + FontSize + CrossSections + IntersectionResultDefColl + ReservoirSurfaceResultDefColl + GridCollection + OverlayInfoConfig + WellMeasurements + SurfaceInViewCollection + RangeFilters + GridCellResult + GridCellEdgeResult + ElementVectorResult + FaultResultSettings + StimPlanColors + VirtualPerforationResult + WellCollection + FaultCollection + AnnotationCollection + StreamlineCollection + PropertyFilters + ShowInactiveCells + ShowInvalidCells + AdditionalResultsForResultInfo + ContourMapProjection + ShowAxisLines + ShowScaleLegend + +RimCsvUserData - class RimCsvUserData + ShortName + NameSetting + ShowSubNodesInTree + AutoShortyName + SummaryHeaderFilename + Id + (A)CaseId + UseCustomIdentifier + SummaryType + IdentifierName + ParseOptions + +RimCustomObjectiveFunction - class RimCustomObjectiveFunction + FunctionTitle + CustomFunctionTitle + Weights + ObjectiveFunctions + +RimCustomObjectiveFunctionCollection - class RimCustomObjectiveFunctionCollection + ObjectiveFunctions + +RimCustomObjectiveFunctionWeight - class RimCustomObjectiveFunctionWeight + WeightTitle + ObjectiveSummaryAddress + WeightValue + ObjectiveFunction + +RimDerivedEnsembleCase - class RimDerivedSummaryCase + ShortName + NameSetting + ShowSubNodesInTree + AutoShortyName + SummaryHeaderFilename + Id + (A)CaseId + SummaryCase1 + Operator + SummaryCase2 + UseFixedTimeStep + FixedTimeStepIndex + InUse + +RimDerivedEnsembleCaseCollection - class RimDerivedEnsembleCaseCollection + SummaryCases + SummaryCollectionName + CreateAutoName + NameCount + IsEnsemble + Id + (A)EnsembleId + Ensemble1 + Ensemble2 + Operator + CaseCount + MatchOnParameters + UseFixedTimeStep + FixedTimeStepIndex + +RimDialogData - class RimDialogData + ExportCarfin + ExportCompletionData + MultipleFractionsData + HoloLenseExportToFolderData + ExportwellPathsData + ExportLgr + ExportSectorModel + MockModelSettings + CreateEnsembleSurfaceUi + CreateEnsembleWellLogUi + +RimEclipseContourMapProjection - class RimEclipseContourMapProjection + Name + IsChecked + SampleSpacing + ResultAggregation + ContourLines + ContourLabels + SmoothContourLines + WeightByParameter + WeightingResult + +RimEclipseResultAddressCollection - class RimEclipseResultAddressCollection + Name + Addresses + ResultType + +RimElementVectorResult - class RimElementVectorResult + LegendDefinition + ShowOil + ShowGas + ShowWater + ShowResult + VectorView + VectorSurfaceCrossingLocation + ShowVectorI + ShowVectorJ + ShowVectorK + ShowNncData + Threshold + VectorColor + UniformVectorColor + SizeScale + +RimEllipseFractureTemplate - class RimEllipseFractureTemplate + Id + UserDescription + UnitSystem + Orientation + UserDefinedPerforationLength + AzimuthAngle + SkinFactor + PerforationLength + PerforationEfficiency + WellDiameter + ConductivityType + WellPathDepthAtFracture + FractureContainmentField + NonDarcyFlowType + UserDefinedDFactor + FractureWidthType + FractureWidth + BetaFactorType + InertialCoefficient + PermeabilityType + RelativePermeability + EffectivePermeability + RelativeGasDensity + GasViscosity + HeightScaleFactor + WidthScaleFactor + DFactorScaleFactor + ConductivityFactor + HalfLength + Height + Width + Permeability + +RimEnsembleCurveFilter - class RimEnsembleCurveFilter + FilterTitle + Active + FilterMode + EnsembleParameter + ObjectiveSummaryAddress + ObjectiveFunction + CustomObjectiveFunction + MinValue + MaxValue + Categories + +RimEnsembleCurveFilterCollection - class RimEnsembleCurveFilterCollection + Active + CurveFilters + NewEnsembleFilter + +RimEnsembleCurveSet - class RimEnsembleCurveSet + EnsembleCurveSet + IsActive + SummaryGroup + SummaryAddress + Resampling + ColorMode + Color + EnsembleParameter + EnsembleParameterSorting + ObjectiveSummaryAddress + CustomObjectiveFunction + ShowObjectiveFunctionFormula + MinDateRange + MinTimeStep + MaxDateRange + MaxTimeStep + TimeStepFilter + TimeSteps + PlotAxis + Axis + LegendConfig + CurveFilters + CustomObjectiveFunctions + ObjectiveFunction + Statistics + UserDefinedName + AutoName + SummaryAddressNameTools + +RimEnsembleCurveSetCollection - class RimEnsembleCurveSetCollection + EnsembleCurveSets + IsActive + +RimEnsembleStatistics - class RimEnsembleStatistics + Active + HideEnsembleCurves + BasedOnFilteredCases + ShowP10Curve + ShowP50Curve + ShowP90Curve + ShowMeanCurve + ShowCurveLabels + IncludeIncompleteCurves + Color + +RimEnsembleWellLogCurveSet - class RimEnsembleWellLogCurveSet + EnsembleCurveSet + IsActive + EnsembleWellLogs + WellLogChannelName + FilterEnsembleCurveSet + DepthEqualization + ColorMode + Color + Statistics + UserDefinedName + AutoName + PlotCurveAppearance + +RimEquilibriumAxisAnnotation - class RimEquilibriumAxisAnnotation + Active + Name + Value + RangeStart + RangeEnd + PenStyle + AnnotationType + Associated3DCase + m_equilNum + +RimExportInputSettings - class RimExportInputSettings + Filename + Keyword + +RimFaultResultSlot - class RimEclipseFaultColors + ShowCustomFaultResult + CustomResultSlot + +RimFractureExportSettings - class RimFractureExportSettings + Filename + CaseToApply + +RimGeoMechContourMapProjection - class RimGeoMechContourMapProjection + Name + IsChecked + SampleSpacing + ResultAggregation + ContourLines + ContourLabels + SmoothContourLines + LimitToPorRegion + VerticalLimit + PaddingAroundPorRegion + +RimGeoMechContourMapView - class RimGeoMechContourMapView + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + NameConfig + CameraPosition + CameraPointOfInterest + PerspectiveProjection + GridZScale + BackgroundColor + (A)ViewBackgroundColor + MaximumFrameRate + CurrentTimeStep + MeshMode + SurfaceMode + ShowGridBox + DisableLighting + ShowZScale + ComparisonView + FontSize + CrossSections + IntersectionResultDefColl + ReservoirSurfaceResultDefColl + GridCollection + OverlayInfoConfig + WellMeasurements + SurfaceInViewCollection + RangeFilters + GridCellResult + TensorResults + PropertyFilters + Parts + ShowDisplacement + DisplacementScaling + ContourMapProjection + ShowAxisLines + ShowScaleLegend + +RimGridCalculation - class RimGridCalculation + Description + Expression + Unit + Variables + CalculatedValues + TimeSteps + Id + VisibleCellView + DefaultValueType + DefaultValue + DestinationCase + DefaultPropertyVariableName + +RimGridCalculationCollection - class RimGridCalculationCollection + Calculations + +RimGridCalculationVariable - class RimGridCalculationVariable + VariableName + ResultType + ResultVariable + EclipseGridCase + TimeStep + +RimGridCrossPlot - class RimGridCrossPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + RowSpan + ColSpan + ShowInfoBox + NameConfig + xAxisProperties + yAxisProperties + CrossPlotCurve + +RimGridCrossPlotCollection - class RimGridCrossPlotCollection + GridCrossPlots + +RimGridCrossPlotCurveSetNameConfig - class RimGridCrossPlotDataSetNameConfig + CustomCurveName + AddCaseName + AddAxisVariables + AddTimeStep + AddGrouping + +RimGridCrossPlotNameConfig - class RimGridCrossPlotNameConfig + CustomCurveName + AddDataSetNames + +RimIdenticalGridCaseGroup - class RimIdenticalGridCaseGroup + UserDescription + GroupId + StatisticsCaseCollection + CaseCollection + +RimInputProperty - class RimEclipseInputProperty + ResultName + EclipseKeyword + FileName + +RimInputPropertyCollection - class RimEclipseInputPropertyCollection + InputProperties + +RimInputReservoir - class RimEclipseInputCase + Name + (A)CaseUserDescription + NameSetting + Id + (A)CaseId + FilePath + (A)CaseFileName + (A)GridFileName + DefaultFormationNames + TimeStepFilter + IntersectionViewCollection + ReservoirViews + MatrixModelResults + FractureModelResults + FlipXAxis + FlipYAxis + ContourMaps + InputPropertyCollection + AdditionalFileNamesProxy + +RimIntersectionResultsDefinitionCollection - class RimIntersectionResultsDefinitionCollection + isActive + IntersectionResultDefinitions + +RimMeasurement - class RimMeasurement + +RimMswCompletionParameters - class RimMswCompletionParameters + RefMDType + RefMD + CustomValuesForLateral + LinerDiameter + RoughnessFactor + PressureDrop + LengthAndDepth + EnforceMaxSegmentLength + MaxSegmentLength + +RimMudWeightWindowParameters - class RimMudWeightWindowParameters + WellDeviationSourceType + WellDeviationFixed + WellDeviationAddress + WellAzimuthSourceType + WellAzimuthFixed + WellAzimuthAddress + UCSSourceType + UCSFixed + UCSAddress + PoissonsRatioSourceType + PoissonsRatioFixed + PoissonsRatioAddress + K0_FGSourceType + K0_FGFixed + K0_FGAddress + obg0SourceType + obg0Fixed + obg0Address + AirGap + SHMultiplier + UpperLimitType + LowerLimitType + FractureGradientCalculationType + PorePressureNonReservoirSource + UserPPNonReservoir + PPNonReservoirAddress + ReferenceLayer + +RimMultiPlotCollection - class RimMultiPlotCollection + MultiPlots + +RimMultipleEclipseResults - class RimMultipleEclipseResults + IsChecked + SelectedProperties + +RimMultipleLocations - class RimMultipleLocations + LocationMode + RangeStart + RangeEnd + Spacing + RangeValveCount + Locations + +RimMultipleValveLocations - class RimMultipleValveLocations + LocationMode + RangeStart + RangeEnd + ValveSpacing + RangeValveCount + LocationOfValves + +RimNonDarcyPerforationParameters - class RimNonDarcyPerforationParameters + NonDarcyFlowType + UserDefinedDFactor + GridPermeabilityScalingFactor + WellRadius + RelativeGasDensity + GasViscosity + InertialCoefficientBeta0 + PermeabilityScalingFactor + PorosityScalingFactor + +RimObjectiveFunction - class RimObjectiveFunction + FunctionType + NormalizeByNumberOfObservations + NormalizeByNumberOfVectors + ErrorEstimatePercentage + UseSquaredError + +RimObservedEclipseUserData - class RimObservedEclipseUserData + ShortName + NameSetting + ShowSubNodesInTree + AutoShortyName + SummaryHeaderFilename + Id + (A)CaseId + UseCustomIdentifier + SummaryType + IdentifierName + +RimOilFieldEntry - class RimOilFieldEntry + OilFieldName + EdmId + Selected + wellsFilePath + Wells + +RimOilRegionEntry - class RimOilRegionEntry + OilRegionEntry + Fields + Selected + +RimPlotAxisAnnotation - class RimPlotAxisAnnotation + Active + Name + Value + RangeStart + RangeEnd + PenStyle + +RimPlotCellFilterCollection - class RimPlotCellFilterCollection + Name + IsChecked + FilterMode + CellFilters + +RimPlotCellPropertyFilter - class RimPlotCellPropertyFilter + Name + IsChecked + FilterMode + ResultDefinition + LowerBound + UpperBound + +RimPolylineAppearance - class RimPolylineAppearance + LineFieldsHidden + Color + Thickness + SphereFieldsHidden + SphereColor + SphereRadiusFactor + +RimPolylinesAnnotationInView - class RimPolylinesAnnotationInView + IsActive + SourceAnnotation + +RimPolylinesFromFileAnnotationInView - class RimPolylinesFromFileAnnotationInView + IsActive + SourceAnnotation + +RimProcess - class RimProcess + Command + Description + ID + +RimReachCircleAnnotation - class RimReachCircleAnnotation + IsActive + CenterPointXyd + Radius + Name + Appearance + +RimReachCircleAnnotationInView - class RimReachCircleAnnotationInView + IsActive + SourceAnnotation + +RimRftCase - class RimRftCase + RftFilePath + DataDeckFilePath + +RimRftTopologyCurve - class RimRftTopologyCurve + Show + CurveName + TemplateText + CurveNamingMethod + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + AdditionalDataSources + StackCurve + StackPhaseColors + ReferenceWellPath + UseReferenceWellPath + SummaryCase + TimeStep + WellName + SegmentBranchIndex + SegmentBranchType + CurveType + +RimRoffCase - class RimRoffCase + Name + (A)CaseUserDescription + NameSetting + Id + (A)CaseId + FilePath + (A)CaseFileName + (A)GridFileName + DefaultFormationNames + TimeStepFilter + IntersectionViewCollection + ReservoirViews + MatrixModelResults + FractureModelResults + FlipXAxis + FlipYAxis + ContourMaps + InputPropertyCollection + +RimSaturationPressurePlot - class RimSaturationPressurePlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + RowSpan + ColSpan + ShowInfoBox + NameConfig + xAxisProperties + yAxisProperties + CrossPlotCurve + +RimSaturationPressurePlotCollection - class RimSaturationPressurePlotCollection + SaturationPressurePlots + +RimStatisticalCalculation - class RimEclipseStatisticsCase + Name + (A)CaseUserDescription + NameSetting + Id + (A)CaseId + FilePath + (A)CaseFileName + (A)GridFileName + DefaultFormationNames + TimeStepFilter + IntersectionViewCollection + ReservoirViews + MatrixModelResults + FractureModelResults + FlipXAxis + FlipYAxis + ContourMaps + InputPropertyCollection + ResultType + PorosityModel + DynamicPropertiesToCalculate + StaticPropertiesToCalculate + GeneratedPropertiesToCalculate + InputPropertiesToCalculate + FractureDynamicPropertiesToCalculate + FractureStaticPropertiesToCalculate + FractureGeneratedPropertiesToCalculate + FractureInputPropertiesToCalculate + CalculatePercentiles + PercentileCalculationType + LowPercentile + MidPercentile + HighPercentile + WellDataSourceCase + UseZeroAsInactiveCellValue + +RimStatisticalCollection - class RimEclipseStatisticsCaseCollection + Reservoirs + +RimStimPlanColors - class RimStimPlanColors + IsChecked + ResultName + DefaultColor + LegendConfigurations + ShowStimPlanMesh + StimPlanCellVizMode + +RimStimPlanFractureTemplate - class RimStimPlanFractureTemplate + Id + UserDescription + UnitSystem + Orientation + UserDefinedPerforationLength + AzimuthAngle + SkinFactor + PerforationLength + PerforationEfficiency + WellDiameter + ConductivityType + WellPathDepthAtFracture + FractureContainmentField + NonDarcyFlowType + UserDefinedDFactor + FractureWidthType + FractureWidth + BetaFactorType + InertialCoefficient + PermeabilityType + RelativePermeability + EffectivePermeability + RelativeGasDensity + GasViscosity + HeightScaleFactor + WidthScaleFactor + DFactorScaleFactor + ConductivityFactor + StimPlanFileName + UserDefinedWellPathDepthAtFracture + BorderPolygonResultName + ActiveTimeStepIndex + ConductivityResultName + ShowStimPlanMesh + +RimStimPlanLegendConfig - class RimStimPlanLegendConfig + Name + Legend + +RimSummaryAddressCollection - class RimSummaryAddressCollection + Name + ContentsType + SummaryAddresses + AddressSubfolders + CaseId + EnsembleId + +RimSummaryCalculation - class RimSummaryCalculation + Description + Expression + Unit + Variables + CalculatedValues + TimeSteps + Id + +RimSummaryCalculationCollection - class RimSummaryCalculationCollection + Calculations + +RimSummaryCalculationVariable - class RimSummaryCalculationVariable + VariableName + SummaryCase + SummaryAddress + +RimSummaryCurveCollection - class RimSummaryCurveCollection + CollectionCurves + IsActive + +RimSummaryCurveCollectionModifier - class RimSummaryPlotSourceStepping + StepDimension + CurveCase + IncludeEnsembleCasesForCaseStepping + WellName + GroupName + Region + VectorName + CellBlock + Segment + Completion + Aquifer + Ensemble + Placeholder + AutoUpdateAppearance + +RimSummaryMultiPlotCollection - class RimSummaryMultiPlotCollection + MultiSummaryPlots + +RimSummaryPlotManager - class RimSummaryPlotManager + SummaryPlot + FilterText + AddressCandidates + SelectedDataSources + IncludeDiffCurves + PushButtonReplace + PushButtonNewPlot + PushButtonAppend + IndividualPlotPerObject + IndividualPlotPerVector + IndividualPlotPerDataSource + CreateMultiPlot + +RimSurfaceIntersectionBand - class RimSurfaceIntersectionBand + IsChecked + LineAppearance + BandColor + BandOpacity + BandPolygonOffsetUnit + Surfaces + NameProxy + +RimSurfaceIntersectionCollection - class RimSurfaceIntersectionCollection + IsChecked + IntersectionBands + IntersectionCurves + +RimSurfaceIntersectionCurve - class RimSurfaceIntersectionCurve + IsChecked + LineAppearance + Surface1 + NameProxy + +RimTensorResults - class RimTensorResults + LegendDefinition + ResultVariable + ShowTensors + Principal1 + Principal2 + Principal3 + Threshold + VectorColor + ScaleMethod + SizeScale + RangeType + +RimTernaryLegendConfig - class RimTernaryLegendConfig + ShowTernaryLegend + Precision + RangeType + ternaryRangeSummary + UserDefinedMaxSoil + UserDefinedMinSoil + UserDefinedMaxSgas + UserDefinedMinSgas + UserDefinedMaxSwat + UserDefinedMinSwat + +RimTextAnnotation - class RimTextAnnotation + AnchorPointXyd + LabelPointXyd + Text + IsActive + TextAppearance + +RimTextAnnotationInView - class RimTextAnnotationInView + IsActive + SourceAnnotation + +RimThermalFractureTemplate - class RimThermalFractureTemplate + Id + UserDescription + UnitSystem + Orientation + UserDefinedPerforationLength + AzimuthAngle + SkinFactor + PerforationLength + PerforationEfficiency + WellDiameter + ConductivityType + WellPathDepthAtFracture + FractureContainmentField + NonDarcyFlowType + UserDefinedDFactor + FractureWidthType + FractureWidth + BetaFactorType + InertialCoefficient + PermeabilityType + RelativePermeability + EffectivePermeability + RelativeGasDensity + GasViscosity + HeightScaleFactor + WidthScaleFactor + DFactorScaleFactor + ConductivityFactor + StimPlanFileName + UserDefinedWellPathDepthAtFracture + BorderPolygonResultName + ActiveTimeStepIndex + ConductivityResultName + FilterCakePressureDrop + +RimTimeAxisAnnotation - class RimTimeAxisAnnotation + Active + Name + Value + RangeStart + RangeEnd + PenStyle + +RimTimeStepFilter - class RimTimeStepFilter + FilterType + FirstTimeStep + LastTimeStep + Interval + DateFormat + TimeStepIndicesToImport + +RimUserDefinedPolylinesAnnotationInView - class RimUserDefinedPolylinesAnnotationInView + IsActive + SourceAnnotation + +RimVfpPlotCollection - class RimVfpPlotCollection + VfpPlots + +RimViewLinkerCollection - class RimViewLinkerCollection + Active + ViewLinkers + +RimViewNameConfig - class RimViewNameConfig + CustomCurveName + AddCaseName + AddAggregationType + AddProperty + AddSampleSpacing + +RimVirtualPerforationResults - class RimVirtualPerforationResults + ShowConnectionFactors + ShowClosedConnections + GeometryScaleFactor + LegendDefinition + +RimWellIASettings - class RimWellIASettings + Name + IsChecked + GeomechCase + BaseDir + StartMeasuredDepth + EndMeasuredDepth + BufferXY + ModelingParameters + TimeStepParameters + showBox + startDate + boxValid + +RimWellIASettingsCollection - class RimWellIASettingsCollection + WellIASettings + +RimWellLogExtractionCurve - class RimWellLogExtractionCurve + Show + CurveName + TemplateText + CurveNamingMethod + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + AdditionalDataSources + StackCurve + StackPhaseColors + ReferenceWellPath + UseReferenceWellPath + TrajectoryType + CurveWellPath + SimulationWellName + BranchDetection + Branch + CurveCase + CurveEclipseResult + CurveGeomechResult + CurveTimeStep + AddCaseNameToCurveName + AddPropertyToCurveName + AddWellNameToCurveName + AddTimestepToCurveName + AddDateToCurveName + +RimWellLogExtractionCurveNameConfig - class RimWellLogExtractionCurveNameConfig + CustomCurveName + AddCaseName + AddProperty + AddWellName + AddTimeStep + AddDate + +RimWellLogFileCurveNameConfig - class RimWellLogFileCurveNameConfig + CustomCurveName + +RimWellLogPlotNameConfig - class RimWellLogPlotNameConfig + CustomCurveName + +RimWellLogRftCurveNameConfig - class RimWellLogRftCurveNameConfig + CustomCurveName + +RimWellLogWbsCurve - class RimWellLogWbsCurve + Show + CurveName + TemplateText + CurveNamingMethod + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + AdditionalDataSources + StackCurve + StackPhaseColors + ReferenceWellPath + UseReferenceWellPath + TrajectoryType + CurveWellPath + SimulationWellName + BranchDetection + Branch + CurveCase + CurveEclipseResult + CurveGeomechResult + CurveTimeStep + AddCaseNameToCurveName + AddPropertyToCurveName + AddWellNameToCurveName + AddTimestepToCurveName + AddDateToCurveName + SmoothCurve + SmoothingThreshold + +RimWellPathEntry - class RimWellPathEntry + Name + Selected + WellPathType + surveyType + requestUrl + wellPathFilePath + +RimWellPathImport - class RimWellPathImport + WellTypeSurvey + WellTypePlans + UtmMode + UtmNorth + UtmSouth + UtmEast + UtmWest + Regions + +RimWellPathTieIn - class RimWellPathTieIn + ParentWellPath + ChildWellPath + TieInMeasuredDepth + AddValveAtConnection + Valve + +RiuCreateMultipleFractionsUi - class RiuCreateMultipleFractionsUi + SourceCase + MinDistanceFromWellTd + MaxFracturesPerWell + Options + FractureCreationSummary + +RiuMultipleFractionsOptions - class RicCreateMultipleFracturesOptionItemUi + TopKLayer + BaseKLayer + Template + MinSpacing + +ScriptLocation - class RimScriptCollection + ScriptDirectory + CalcScripts + SubDirectories + +SimWellFracture - class RimSimWellFracture + Name + IsChecked + FractureDef + EditTemplate + CreateEllipseTemplate + CreateStimPlanTemplate + AutoUpdateWellPathDepthAtFractureFromTemplate + WellPathDepthAtFracture + Azimuth + PerforationLength + PerforationEfficiency + WellDiameter + Dip + Tilt + FractureUnit + TimeIndexToPlot + MeasuredDepth + Branch + +SimWellFractureCollection - class RimSimWellFractureCollection + Fractures + +StimPlanFractureTemplate - class RimStimPlanFractureTemplate + Id + UserDescription + UnitSystem + Orientation + UserDefinedPerforationLength + AzimuthAngle + SkinFactor + PerforationLength + PerforationEfficiency + WellDiameter + ConductivityType + WellPathDepthAtFracture + FractureContainmentField + NonDarcyFlowType + UserDefinedDFactor + FractureWidthType + FractureWidth + BetaFactorType + InertialCoefficient + PermeabilityType + RelativePermeability + EffectivePermeability + RelativeGasDensity + GasViscosity + HeightScaleFactor + WidthScaleFactor + DFactorScaleFactor + ConductivityFactor + StimPlanFileName + UserDefinedWellPathDepthAtFracture + BorderPolygonResultName + ActiveTimeStepIndex + ConductivityResultName + ShowStimPlanMesh + +StimPlanModel - class RimStimPlanModel + Name + IsChecked + StimPlanModelTemplate + EditModelTemplate + EclipseCase + TimeStep + InitialPressureEclipseCase + StaticEclipseCase + MeasuredDepth + ExtractionOffsetTop + ExtractionOffsetBottom + ExtractionDepthTop + ExtractionDepthBottom + ExtractionType + ThicknessDirectionWellPath + BoundingBoxHorizontal + BoundingBoxVertical + UseDetailedFluidLoss + RelativePermeabilityFactor + PoroElasticConstant + ThermalExpansionCoefficient + PerforationLength + FractureOrientation + AzimuthAngle + FormationDip + AutoComputeBarrier + Barrier + DistanceToBarrier + BarrierDip + WellPenetrationLayer + ShowOnlyBarrierFault + ShowAllFaults + BarrierFaultName + BarrierTextAnnotation + PerforationInterval + +StimPlanModelCollection - class RimStimPlanModelCollection + Name + IsChecked + StimPlanModels + +StimPlanModelCurve - class RimStimPlanModelCurve + Show + CurveName + TemplateText + CurveNamingMethod + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + AdditionalDataSources + StackCurve + StackPhaseColors + ReferenceWellPath + UseReferenceWellPath + TrajectoryType + CurveWellPath + SimulationWellName + BranchDetection + Branch + CurveCase + CurveEclipseResult + CurveGeomechResult + CurveTimeStep + AddCaseNameToCurveName + AddPropertyToCurveName + AddWellNameToCurveName + AddTimestepToCurveName + AddDateToCurveName + StimPlanModel + CurveProperty + +StimPlanModelPlot - class RimStimPlanModelPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + PlotDescription + TemplateText + PlotNamingMethod + DepthType + DepthUnit + MinimumDepth + MaximumDepth + ShowDepthGridLines + AutoScaleDepthEnabled + DepthAxisVisibility + ShowDepthMarkerLine + AutoZoomMinDepthFactor + AutoZoomMaxDepthFactor + DepthAnnotations + SubTitleFontSize + AxisTitleFontSize + AxisValueFontSize + NameConfig + FilterEnsembleCurveSet + DepthEqualization + Tracks + DepthOrientation + StimPlanModel + EditModel + EclipseCase + TimeStep + +StimPlanModelPlotCollection - class RimStimPlanModelPlotCollection + StimPlanModelPlots + +StimPlanModelTemplate - class RimStimPlanModelTemplate + Name + Id + DynamicEclipseCase + TimeStep + InitialPressureEclipseCase + UseForInitialPressure + UseForPressure + EditPressureTable + StaticEclipseCase + UseEqlNumForPressureInterpolation + DefaultPorosity + DefaultPermeability + VerticalStress + VerticalStressGradient + StressDepth + ReferenceTemperature + ReferenceTemperatureGradient + ReferenceTemperatureDepth + OverburdenHeight + OverburdenFormation + OverburdenFacies + OverburdenPorosity + OverburdenPermeability + OverburdenFluidDensity + UnderburdenHeight + UnderburdenFormation + UnderburdenFacies + UnderburdenPorosity + UnderburdenPermeability + UnderburdenFluidDensity + FaciesInitialPressureConfigs + PressureTable + ElasticProperties + FaciesProperties + NonNetLayers + +StimPlanModelTemplateCollection - class RimStimPlanModelTemplateCollection + StimPlanModelTemplates + NextValidId + +StreamlineInViewCollection - class RimStreamlineInViewCollection + LegendDefinition + Name + FlowThreshold + LengthThreshold + Resolution + MaxDays + UseProducers + UseInjectors + Phase + isActive + VisualizationMode + ColorMode + AnimationSpeed + AnimationIndex + ScaleFactor + TracerLength + +StringParameter - class RimStringParameter + Name + Label + Description + Advanced + Valid + Value + +SummaryAddress - class RimSummaryAddress + SummaryVarType + SummaryQuantityName + SummaryRegion + SummaryRegion2 + SummaryWellGroup + SummaryWell + SummaryWellSegment + SummaryLgr + SummaryCellI + SummaryCellJ + SummaryCellK + SummaryAquifer + IsErrorResult + CalculationId + CaseId + EnsembleId + +SummaryCaseCollection - class RimSummaryCaseMainCollection + SummaryCases + SummaryCaseCollections + +SummaryCaseSubCollection - class RimSummaryCaseCollection + SummaryCases + SummaryCollectionName + CreateAutoName + NameCount + IsEnsemble + Id + (A)EnsembleId + +SummaryCrossPlot - class RimSummaryCrossPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + RowSpan + ColSpan + IsUsingAutoName + PlotDescription + normalizeCurveYValues + useQtChartsPlot + SummaryCurveCollection + EnsembleCurveSetCollection + GridTimeHistoryCurves + AsciiDataCurves + AxisProperties + SummaryPlotFilterTextCurveSetEditor + LeftYAxisProperties + RightYAxisProperties + BottomAxisProperties + TimeAxisProperties + +SummaryCrossPlotCollection - class RimSummaryCrossPlotCollection + SummaryCrossPlots + +SummaryCurve - class RimSummaryCurve + Show + CurveName + TemplateText + CurveNamingMethod + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + AdditionalDataSources + StackCurve + StackPhaseColors + SummaryCase + SummaryAddress + Resampling + SummaryCaseX + SummaryAddressX + IsEnsembleCurve + PlotAxis + Axis + SummaryCurveNameConfig + isTopZWithinCategory + +SummaryCurveAutoName - class RimSummaryCurveAutoName + LongVectorName + VectorName + Unit + RegionNumber + WellGroupName + WellName + WellSegmentNumber + LgrName + Completion + Aquifer + CaseName + +SummaryObservedDataFile - class RimSummaryObservedDataFile + ShortName + NameSetting + ShowSubNodesInTree + AutoShortyName + SummaryHeaderFilename + Id + (A)CaseId + UseCustomIdentifier + SummaryType + IdentifierName + +SummaryPageDownloadEntity - class SummaryPageDownloadEntity + Name + RequestUrl + ResponseFilename + +SummaryPlot - class RimSummaryPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + RowSpan + ColSpan + IsUsingAutoName + PlotDescription + normalizeCurveYValues + useQtChartsPlot + SummaryCurveCollection + EnsembleCurveSetCollection + GridTimeHistoryCurves + AsciiDataCurves + AxisProperties + SummaryPlotFilterTextCurveSetEditor + LeftYAxisProperties + RightYAxisProperties + BottomAxisProperties + TimeAxisProperties + +SummaryPlotCollection - class RimSummaryPlotCollection + SummaryPlots + +SummaryPlotFilterTextCurveSetEditor - class RimSummaryPlotFilterTextCurveSetEditor + CurveFilterText + SummaryCases + +SummaryTimeAxisProperties - class RimSummaryTimeAxisProperties + Active + ShowTitle + Title + AutoZoom + TimeMode + TimeUnit + VisibleDateRangeMax + VisibleDateRangeMin + VisibleTimeRangeMax + VisibleTimeRangeMin + VisibleTimeModeRangeMax + VisibleTimeModeRangeMin + TitlePosition + FontSize + ValuesFontSize + AutoDate + DateComponents + TimeComponents + DateFormat + TimeFormat + MajorTickmarkCount + Annotations + +SummaryYAxisProperties - class RimPlotAxisProperties + Active + Name + AxisTitle + AutoTitle + DisplayLongName + DisplayShortName + DisplayUnitText + CustomTitle + VisibleRangeMax + VisibleRangeMin + NumberFormat + Decimals + ScaleFactor + AutoZoom + LogarithmicScale + AxisInverted + ShowNumbers + PlotAxis + PlotAxisIndex + TitlePosition + TitleDeltaFontSize + ValueDeltaFontSize + Annotations + MajorTickmarkCount + +Surface - class RimFileSurface + SurfaceUserDecription + SurfaceColor + DepthOffset + SurfaceFilePath + +SurfaceCollection - class RimSurfaceCollection + SurfaceUserDecription + SubCollections + SurfacesField + +SurfaceInView - class RimSurfaceInView + Active + ShowInactiveCells + UseSeparateIntersectionDataSource + SeparateIntersectionDataSource + Name + SurfaceRef + ResultDefinition + +SurfaceInViewCollection - class RimSurfaceInViewCollection + Name + IsChecked + SurfacesInViewFieldCollections + SurfacesInViewField + SurfaceCollectionRef + +SurfaceResultDefinition - class RimSurfaceResultDefinition + Name + IsChecked + PropertyName + LegendConfig + SurfaceInView + +TC2 - class TC2 + ta + da + ia + ba + +TestCommand1 - class TestCommand1 + TextArgument + DoubleArgument + IntArgument + BoolArgument + +ThermalFractureTemplate - class RimThermalFractureTemplate + Id + UserDescription + UnitSystem + Orientation + UserDefinedPerforationLength + AzimuthAngle + SkinFactor + PerforationLength + PerforationEfficiency + WellDiameter + ConductivityType + WellPathDepthAtFracture + FractureContainmentField + NonDarcyFlowType + UserDefinedDFactor + FractureWidthType + FractureWidth + BetaFactorType + InertialCoefficient + PermeabilityType + RelativePermeability + EffectivePermeability + RelativeGasDensity + GasViscosity + HeightScaleFactor + WidthScaleFactor + DFactorScaleFactor + ConductivityFactor + StimPlanFileName + UserDefinedWellPathDepthAtFracture + BorderPolygonResultName + ActiveTimeStepIndex + ConductivityResultName + FilterCakePressureDrop + +TofAccumulatedPhaseFractionsPlot - class RimTofAccumulatedPhaseFractionsPlot + WindowController + ShowWindow + WindowGeometry + PlotDescription + ShowPlotTitle + MaxTof + +TotalWellAllocationPlot - class RimTotalWellAllocationPlot + WindowController + ShowWindow + WindowGeometry + PlotDescription + ShowPlotTitle + +TriangleGeometry - class RimcTriangleGeometry + XCoords + YCoords + ZCoords + Connections + MeshXCoords + MeshYCoords + MeshZCoords + FaultMeshXCoords + FaultMeshYCoords + FaultMeshZCoords + DisplayModelOffset + +UserDefinedFilter - class RimUserDefinedFilter + UserDescription + Active + FilterType + GridIndex + PropagateToSubGrids + IndividualCellIndices + +UserDefinedPolylinesAnnotation - class RimUserDefinedPolylinesAnnotation + IsActive + ClosePolyline + ShowLines + ShowSpheres + Appearance + Name + Targets + +ValveTemplate - class RimValveTemplate + Name + UnitSystem + CompletionType + UserLabel + OrificeDiameter + FlowCoefficient + AICDParameters + +ValveTemplateCollection - class RimValveTemplateCollection + ValveDefinitions + ValveUnits + +VfpPlot - class RimVfpPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + RowSpan + ColSpan + PlotTitle + FilePath + TableType + TableNumber + ReferenceDepth + FlowingPhase + FlowingWaterFraction + FlowingGasFraction + InterpolatedVariable + PrimaryVariable + FamilyVariable + LiquidFlowRateIdx + THPIdx + ArtificialLiftQuantityIdx + WaterCutIdx + GasLiquidRatioIdx + +View3dOverlayInfoConfig - class Rim3dOverlayInfoConfig + Active + ShowAnimProgress + ShowInfoText + ShowResultInfo + ShowHistogram + ShowVolumeWeightedMean + ShowVersionInfo + StatisticsTimeRange + StatisticsCellRange + +ViewController - class RimViewController + Active + Name + ManagedView + SyncCamera + ShowCursor + SyncTimeStep + SyncCellResult + SyncLegendDefinitions + SyncRangeFilters + SyncPropertyFilters + DuplicatePropertyFilters + +ViewLinker - class RimViewLinker + Name + MainView + ManagedViews + +WbsParameters - class RimWbsParameters + PorePressureReservoirSource + PorePressureNonReservoirSource + UserPPNonReservoir + PoissionRatioSource + UcsSource + OBG0Source + DFSource + K0SHSource + FGShaleSource + K0FGSource + WaterDensitySource + UserPoissonRatio + UserUcs + UserDF + UserK0FG + UserK0SH + FGMultiplier + WaterDensity + GeoMechCase + WellPath + TimeStep + +Well - class RimSimWellInView + Name + (A)WellName + ShowWell + ShowWellLabel + ShowWellHead + ShowWellPipe + ShowWellSpheres + ShowWellDisks + WellHeadScaleFactor + WellPipeRadiusScale + WellPipeColor + WellDiskColor + ShowWellCells + ShowWellCellFence + FractureCollection + +WellAllocationPlot - class RimWellAllocationPlot + WindowController + ShowWindow + WindowGeometry + PlotDescription + ShowPlotTitle + BranchDetection + CurveCase + PlotTimeStep + WellName + FlowDiagSolution + FlowType + GroupSmallContributions + SmallContributionsThreshold + AccumulatedWellFlowPlot + TotalWellFlowPlot + WellAllocLegend + TofAccumulatedPhaseFractionsPlot + +WellAllocationPlotLegend - class RimWellAllocationPlotLegend + ShowPlotLegend + +WellBoreStabilityPlot - class RimWellBoreStabilityPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + PlotDescription + TemplateText + PlotNamingMethod + DepthType + DepthUnit + MinimumDepth + MaximumDepth + ShowDepthGridLines + AutoScaleDepthEnabled + DepthAxisVisibility + ShowDepthMarkerLine + AutoZoomMinDepthFactor + AutoZoomMaxDepthFactor + DepthAnnotations + SubTitleFontSize + AxisTitleFontSize + AxisValueFontSize + NameConfig + FilterEnsembleCurveSet + DepthEqualization + Tracks + DepthOrientation + WbsParameters + +WellDistributionPlot - class RimWellDistributionPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + RowSpan + ColSpan + Case + TimeStepIndex + WellName + Phase + GroupSmallContributions + SmallContributionsRelativeThreshold + MaximumTOF + +WellDistributionPlotCollection - class RimWellDistributionPlotCollection + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + Case + TimeStepIndex + WellName + GroupSmallContributions + SmallContributionsRelativeThreshold + MaximumTOF + Plots + ShowOil + ShowGas + ShowWater + PlotDescription + +WellFlowRateCurve - class RimWellFlowRateCurve + Show + CurveName + TemplateText + CurveNamingMethod + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + AdditionalDataSources + StackCurve + StackPhaseColors + ReferenceWellPath + UseReferenceWellPath + +WellLogExtractionCurve - class RimWellLogExtractionCurve + Show + CurveName + TemplateText + CurveNamingMethod + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + AdditionalDataSources + StackCurve + StackPhaseColors + ReferenceWellPath + UseReferenceWellPath + TrajectoryType + CurveWellPath + SimulationWellName + BranchDetection + Branch + CurveCase + CurveEclipseResult + CurveGeomechResult + CurveTimeStep + AddCaseNameToCurveName + AddPropertyToCurveName + AddWellNameToCurveName + AddTimestepToCurveName + AddDateToCurveName + +WellLogFile - class RimWellLogFile + WellName + Date + FileName + Name + WellLogFileChannels + WellFlowCondition + +WellLogFileChannel - class RimWellLogFileChannel + Name + +WellLogFileCurve - class RimWellLogFileCurve + Show + CurveName + TemplateText + CurveNamingMethod + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + AdditionalDataSources + StackCurve + StackPhaseColors + ReferenceWellPath + UseReferenceWellPath + CurveWellPath + CurveWellLogChannel + WellLogFile + +WellLogPlot - class RimWellLogPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + PlotDescription + TemplateText + PlotNamingMethod + DepthType + DepthUnit + MinimumDepth + MaximumDepth + ShowDepthGridLines + AutoScaleDepthEnabled + DepthAxisVisibility + ShowDepthMarkerLine + AutoZoomMinDepthFactor + AutoZoomMaxDepthFactor + DepthAnnotations + SubTitleFontSize + AxisTitleFontSize + AxisValueFontSize + NameConfig + FilterEnsembleCurveSet + DepthEqualization + Tracks + DepthOrientation + +WellLogPlotCollection - class RimWellLogPlotCollection + WellLogPlots + +WellLogPlotTrack - class RimWellLogTrack + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + RowSpan + ColSpan + TrackDescription + Curves + VisibleXRangeMin + VisibleXRangeMax + AutoScaleX + LogarithmicScaleX + InvertPropertyValueAxis + IsPropertyAxisEnabled + ShowXGridLines + ExplicitTickIntervals + MinAndMaxTicksOnly + MajorTickIntervals + MinorTickIntervals + AxisFontSize + AnnotationType + RegionDisplay + ColorShadingLegend + ColorShadingTransparency + ShowFormationLabels + RegionLabelFontSize + FormationSource + FormationTrajectoryType + FormationWellPath + FormationWellPathForSourceWellPath + FormationSimulationWellName + FormationBranchIndex + FormationBranchDetection + FormationCase + FormationLevel + ShowFormationFluids + ShowWellPathAttributes + WellPathAttributesInLegend + ShowWellPathCompletions + WellPathCompletionsInLegend + ShowWellPathAttrBothSides + ShowWellPathAttrLabels + AttributesWellPathSource + AttributesCollection + OverburdenHeight + UnderburdenHeight + ResultDefinition + EnsembleWellLogCurveSet + +WellLogRftCurve - class RimWellLogRftCurve + Show + CurveName + TemplateText + CurveNamingMethod + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + AdditionalDataSources + StackCurve + StackPhaseColors + ReferenceWellPath + UseReferenceWellPath + CurveEclipseResultCase + CurveSummaryCase + CurveEnsemble + ObservedFmuRftData + TimeStep + WellName + BranchIndex + BranchDetection + WellLogChannelName + RftDataType + SegmentResultName + SegmentBranchIndex + SegmentBranchType + ScaleFactor + CurveColorByPhase + +WellMeasurement - class RimWellMeasurement + WellName + Depth + Date + Value + Kind + Quality + Remark + FilePath + +WellMeasurementCurve - class RimWellMeasurementCurve + Show + CurveName + TemplateText + CurveNamingMethod + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + AdditionalDataSources + StackCurve + StackPhaseColors + ReferenceWellPath + UseReferenceWellPath + CurveWellPath + CurveMeasurementKind + +WellMeasurementFilePath - class RimWellMeasurementFilePath + UserDecription + FilePath + +WellMeasurementInView - class RimWellMeasurementInView + Name + IsChecked + MeasurementKind + LegendDefinition + WellsSerialized + AvailableWellsSerialized + LowerBound + UpperBound + QualityFilter + RadiusScaleFactor + +WellMeasurements - class RimWellMeasurementCollection + Measurements + ImportedFiles + +WellMeasurementsInView - class RimWellMeasurementInViewCollection + Name + IsChecked + MeasurementKinds + +WellPath - class RimFileWellPath + AirGap + DatumElevation + UnitSystem + SimWellName + SimBranchIndex + ShowWellPathLabel + ShowWellPath + WellPathRadiusScale + WellPathColor + Completions + CompletionSettings + WellLogFiles + CollectionOf3dWellLogCurves + WellPathFormationKeyInFile + WellPathFormationFilePath + WellPathAttributes + WellPathTieIn + WellIASettings + WellPathFilepath + WellPathFilePathInCache + WellPathNumberInFile + UseAutoGeneratedPointAtSeaLevel + +WellPathAicdParameters - class RimWellPathAicdParameters + DeviceOpen + StrengthAICD + DensityCalibrationFluid + ViscosityCalibrationFluid + VolumeFlowRateExponent + ViscosityFunctionExponent + CriticalWaterLiquidFractionEmul + ViscosityTransitionRegionEmul + MaxRatioOfEmulsionVisc + MaxFlowRate + ExponentOilDensity + ExponentWaterDensity + ExponentGasDensity + ExponentOilViscosity + ExponentWaterViscosity + ExponentGasViscosity + +WellPathAttribute - class RimWellPathAttribute + CompletionType + DepthStart + DepthEnd + DiameterInInches + +WellPathAttributes - class RimWellPathAttributeCollection + Name + IsChecked + Attributes + +WellPathBase - class RimWellPath + AirGap + DatumElevation + UnitSystem + SimWellName + SimBranchIndex + ShowWellPathLabel + ShowWellPath + WellPathRadiusScale + WellPathColor + Completions + CompletionSettings + WellLogFiles + CollectionOf3dWellLogCurves + WellPathFormationKeyInFile + WellPathFormationFilePath + WellPathAttributes + WellPathTieIn + WellIASettings + +WellPathCompletionSettings - class RimWellPathCompletionSettings + WellNameForExport + WellGroupNameForExport + ReferenceDepthForExport + WellTypeForExport + DrainageRadiusForPI + GasInflowEq + AutoWellShutIn + AllowWellCrossFlow + WellBoreFluidPVTTable + HydrostaticDensity + FluidInPlaceRegion + MswParameters + +WellPathCompletions - class RimWellPathCompletions + Perforations + Fishbones + Fractures + StimPlanModels + WellNameForExport + WellGroupNameForExport + ReferenceDepthForExport + WellTypeForExport + DrainageRadiusForPI + GasInflowEq + AutoWellShutIn + AllowWellCrossFlow + WellBoreFluidPVTTable + HydrostaticDensity + FluidInPlaceRegion + +WellPathFracture - class RimWellPathFracture + Name + IsChecked + FractureDef + EditTemplate + CreateEllipseTemplate + CreateStimPlanTemplate + AutoUpdateWellPathDepthAtFractureFromTemplate + WellPathDepthAtFracture + Azimuth + PerforationLength + PerforationEfficiency + WellDiameter + Dip + Tilt + FractureUnit + TimeIndexToPlot + MeasuredDepth + +WellPathFractureCollection - class RimWellPathFractureCollection + Name + IsChecked + Fractures + +WellPathGeometry - class RimWellPathGeometryDef + ReferencePosUtmXyd + AirGap + MdAtFirstTarget + WellPathTargets + ShowAbsolutePosForWellTargets + UseTopLevelWellReferencePoint + UseAutoGeneratedTargetAtSeaLevel + LinkReferencePointUpdates + AttachedToParentWell + FixedWellPathPoints + FixedMeasuredDepths + ShowSpheres + SphereColor + SphereRadiusFactor + +WellPathGeometryDef - class RimWellPathGeometryDef + ReferencePosUtmXyd + AirGap + MdAtFirstTarget + WellPathTargets + ShowAbsolutePosForWellTargets + UseTopLevelWellReferencePoint + UseAutoGeneratedTargetAtSeaLevel + LinkReferencePointUpdates + AttachedToParentWell + FixedWellPathPoints + FixedMeasuredDepths + ShowSpheres + SphereColor + SphereRadiusFactor + +WellPathGroup - class RimWellPathGroup + AirGap + DatumElevation + UnitSystem + SimWellName + SimBranchIndex + ShowWellPathLabel + ShowWellPath + WellPathRadiusScale + WellPathColor + Completions + CompletionSettings + WellLogFiles + CollectionOf3dWellLogCurves + WellPathFormationKeyInFile + WellPathFormationFilePath + WellPathAttributes + WellPathTieIn + WellIASettings + ChildWellPaths + GroupName + AddValveAtConnection + Valve + +WellPathTarget - class RimWellPathTarget + IsEnabled + TargetPoint + TargetPointForDisplay + TargetMeasuredDepth + Dogleg1 + Dogleg2 + UseFixedAzimuth + Azimuth + UseFixedInclination + Inclination + EstimatedDogleg1 + EstimatedDogleg2 + EstimatedAzimuth + EstimatedInclination + TargetType + HasTangentConstraint + +WellPathValve - class RimWellPathValve + Name + IsChecked + ValveTemplate + StartMeasuredDepth + ValveLocations + EditTemplate + CreateTemplate + +WellPaths - class RimWellPathCollection + Active + ShowWellPathLabel + WellPathLabelColor + GlobalWellPathVisibility + WellPathRadiusScale + WellPathClip + WellPathClipZDistance + WellPaths + WellMeasurements + +WellPltPlot - class RimWellPltPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + PlotDescription + TemplateText + PlotNamingMethod + DepthType + DepthUnit + MinimumDepth + MaximumDepth + ShowDepthGridLines + AutoScaleDepthEnabled + DepthAxisVisibility + ShowDepthMarkerLine + AutoZoomMinDepthFactor + AutoZoomMaxDepthFactor + DepthAnnotations + SubTitleFontSize + AxisTitleFontSize + AxisValueFontSize + NameConfig + FilterEnsembleCurveSet + DepthEqualization + Tracks + DepthOrientation + WellLog + WellName + Sources + TimeSteps + UseStandardConditionCurves + UseReservoirConditionCurves + Phases + +WellPltPlotCollection - class RimPltPlotCollection + PltPlots + +WellRftEnsembleCurveSet - class RimWellRftEnsembleCurveSet + Ensemble + ColorMode + EnsembleParameter + LegendConfig + +WellRftPlot - class RimWellRftPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + LegendItemsClickable + TitleFontSize + LegendDeltaFontSize + LegendPosition + PlotDescription + TemplateText + PlotNamingMethod + DepthType + DepthUnit + MinimumDepth + MaximumDepth + ShowDepthGridLines + AutoScaleDepthEnabled + DepthAxisVisibility + ShowDepthMarkerLine + AutoZoomMinDepthFactor + AutoZoomMaxDepthFactor + DepthAnnotations + SubTitleFontSize + AxisTitleFontSize + AxisValueFontSize + NameConfig + FilterEnsembleCurveSet + DepthEqualization + Tracks + DepthOrientation + ShowStatisticsCurves + ShowEnsembleCurves + ShowErrorObserved + WellLog + WellName + BranchIndex + BranchDetection + EnsembleCurveSets + +WellRftPlotCollection - class RimRftPlotCollection + RftPlots + +Wells - class RimSimWellInViewCollection + Active + ShowWellsIntersectingVisibleCells + WellHeadScale + WellPipeRadiusScale + CellCenterSphereScale + WellLabelColor + ShowConnectionStatusColors + WellColorForApply + WellPipeColors + WellPipeVertexCount + WellPipeCoordType + DefaultWellFenceDirection + WellCellTransparency + IsAutoDetectingBranches + WellHeadPosition + Wells + WellDiskSummaryCase + WellDiskQuantity + WellDiskPropertyType + WellDiskPropertyConfigType + WellDiskShowQuantityLabels + WellDiskShowLabelsBackground + WellDiskScaleFactor + WellDiskColor + ShowWellCommunicationLines + +cafNamedTreeNode - class cafNamedTreeNode + ChildNodes + Name + IsChecked + +cafObjectReferenceTreeNode - class cafObjectReferenceTreeNode + ChildNodes + ReferencedObject + +cafTreeNode - class cafTreeNode + ChildNodes + +cloneView - class RicfCloneView + viewId + +closeProject - class RicfCloseProject + +computeCaseGroupStatistics - class RicfComputeCaseGroupStatistics + caseGroupId + caseIds + +createGridCaseGroup - class RicfCreateGridCaseGroup + casePaths + +createGridCaseGroupResult - class RicfCreateGridCaseGroupResult + groupId + groupName + +createLgrForCompletions - class RicfCreateLgrForCompletions + caseId + timeStep + wellPathNames + refinementI + refinementJ + refinementK + splitType + +createMultiPlot - class RicNewMultiPlotFeature + plots + +createMultipleFractures - class RicfCreateMultipleFractures + caseId + wellPathNames + minDistFromWellTd + maxFracturesPerWell + templateId + topLayer + baseLayer + spacing + action + +createSaturationPressurePlots - class RicfCreateSaturationPressurePlots + caseIds + +createStatisticsCase - class RicfCreateStatisticsCase + caseGroupId + +createStatisticsCaseResult - class RicfCreateStatisticsCaseResult + caseId + +createView - class RicfCreateView + caseId + +createViewResult - class RicfCreateViewResult + viewId + +createWbsPlotResult - class RicfCreateWbsPlotResult + viewId + +createWellBoreStabilityPlot - class RicfCreateWellBoreStabilityPlotFeature + caseId + wellPath + timeStep + wbsParameters + +exportContourMapToText - class RicExportContourMapToTextFeature + exportFileName + exportLocalCoordinates + undefinedValueLabel + excludeUndefinedValues + viewId + +exportFlowCharacteristics - class RicfExportFlowCharacteristics + caseId + timeSteps + injectors + producers + fileName + minimumCommunication + aquiferCellThreshold + +exportLgrForCompletions - class RicfExportLgrForCompletions + caseId + timeStep + wellPathNames + refinementI + refinementJ + refinementK + splitType + +exportMsw - class RicfExportMsw + caseId + wellPath + includePerforations + includeFishbones + includeFractures + fileSplit + +exportMultiCaseSnapshots - class RicfExportMultiCaseSnapshots + gridListFile + +exportProperty - class RicfExportProperty + caseId + timeStep + property + eclipseKeyword + undefinedValue + exportFile + +exportPropertyInViews - class RicfExportPropertyInViews + caseId + viewIds + viewNames + undefinedValue + +exportSimWellFractureCompletions - class RicfExportSimWellFractureCompletions + caseId + viewId + viewName + timeStep + simulationWellNames + fileSplit + compdatExport + +exportSnapshots - class RicfExportSnapshots + type + prefix + caseId + viewId + exportFolder + plotOutputFormat + +exportVisibleCells - class RicfExportVisibleCells + caseId + viewId + viewName + exportKeyword + visibleActiveCellsValue + hiddenActiveCellsValue + inactiveCellsValue + +exportWellLogPlotData - class RicfExportWellLogPlotData + exportFormat + viewId + exportFolder + filePrefix + exportTvdRkb + capitalizeFileNames + resampleInterval + convertCurveUnits + +exportWellLogPlotDataResult - class RicfExportWellLogPlotDataResult + exportedFiles + +exportWellPathCompletions - class RicfExportWellPathCompletions + caseId + timeStep + wellPathNames + fileSplit + compdatExport + combinationMode + includeMsw + useNtgHorizontally + includePerforations + includeFishbones + includeFractures + excludeMainBoreForFishbones + performTransScaling + transScalingTimeStep + transScalingWBHPFromSummary + transScalingWBHP + exportComments + exportWelspec + customFileName + +exportWellPaths - class RicfExportWellPaths + wellPathNames + mdStepSize + +importFormationNames - class RicfImportFormationNames + formationFiles + applyToCaseId + +importWellLogFiles - class RicfImportWellLogFiles + wellLogFolder + wellLogFiles + +importWellLogFilesResult - class RicfImportWellLogFilesResult + wellPathNames + +importWellPaths - class RicImportWellPaths + wellPathFolder + wellPathFiles + importGrouped + +importWellPathsResult - class RicImportWellPathsResult + wellPathNames + +loadCase - class RicfLoadCase + path + gridOnly + +loadCaseResult - class RicfLoadCaseResult + id + +openProject - class RicfOpenProject + path + +replaceCase - class RicfSingleCaseReplace + caseId + newGridFile + +replaceMultipleCases - class RicfMultiCaseReplace + +replaceSourceCases - class RicfReplaceSourceCases + caseGroupId + gridListFile + +runOctaveScript - class RicfRunOctaveScript + path + caseIds + +saveProject - class RicSaveProjectFeature + filePath + +saveProjectAs - class RicSaveProjectAsFeature + filePath + +scaleFractureTemplate - class RicfScaleFractureTemplate + id + halfLength + height + dFactor + conductivity + width + +setExportFolder - class RicfSetExportFolder + type + path + createFolder + +setFractureContainment - class RicfSetFractureContainment + id + topLayer + baseLayer + +setMainWindowSize - class RicfSetMainWindowSize + height + width + +setPlotWindowSize - class RicfSetPlotWindowSize + height + width + +setStartDir - class RicfSetStartDir + path + +setTimeStep - class RicfSetTimeStep + caseId + viewId + timeStep + +stackCurves - class RicStackSelectedCurvesFeature + curves + +unstackCurves - class RicUnstackSelectedCurvesFeature + curves + diff --git a/ApplicationLibCode/Adm/projectfilekeywords/2023.01/ri-objectKeywords.txt b/ApplicationLibCode/Adm/projectfilekeywords/2023.01/ri-objectKeywords.txt new file mode 100644 index 0000000000..89eca16b0e --- /dev/null +++ b/ApplicationLibCode/Adm/projectfilekeywords/2023.01/ri-objectKeywords.txt @@ -0,0 +1,438 @@ +// ResInsight version string : 2023.01.0 +// Report generated : Tue Jan 10 12:36:28 2023 +// +// + +AnalysisPlot +AnalysisPlotCollection +AnalysisPlotDataEntry +Annotations +AsciiDataCurve +CalcScript +CalculatedSummaryCase +CellEdgeResultSlot +CellFilterCollection +CellPropertyFilter +CellPropertyFilters +CellRangeFilter +CellRangeFilterCollection +ChangeDataSourceFeatureUi +CmdSelectionChangeExecData +ColorLegend +ColorLegendCollection +ColorLegendItem +CompletionTemplateCollection +CorrelationMatrixPlot +CorrelationPlot +CorrelationPlotCollection +CorrelationReportPlot +CrossSection +CrossSectionCollection +CurveIntersection +DataContainerFloat +DataContainerString +DataContainerTime +DepthTrackPlot +DoubleParameter +Eclipse2dViewCollection +EclipseCase +EclipseGeometrySelectionItem +EclipseResultAddress +ElasticProperties +ElasticPropertyScaling +ElasticPropertyScalingCollection +EnsembleFractureStatistics +EnsembleFractureStatisticsPlot +EnsembleFractureStatisticsPlotCollection +EnsembleStatisticsSurface +EnsembleSurface +EnsembleWellLogStatisticsCurve +EnsembleWellLogs +EnsembleWellLogsCollection +FaciesInitialPressureConfig +FaciesProperties +Fault +Faults +FileSummaryCase +FileSurface +FishbonesCollection +FishbonesMultipleSubs +FishbonesPipeProperties +FlowCharacteristicsPlot +FlowDiagSolution +FlowPlotCollection +FormationNames +FormationNamesCollectionObject +FractureContainment +FractureDefinitionCollection +FractureGroupStatisticsCollection +FractureTemplateCollection +GeoMech2dViewCollection +GeoMechGeometrySelectionItem +GeoMechPart +GeoMechPartCollection +GeoMechPropertyFilter +GeoMechPropertyFilters +GeoMechResultDefinition +GeoMechResultSlot +GeoMechView +GridCaseSurface +GridCollection +GridCrossPlotCurve +GridCrossPlotCurveSet +GridInfo +GridInfoCollection +GridStatisticsPlot +GridStatisticsPlotCollection +GridSummaryCase +GridTimeHistoryCurve +IntegerParameter +Intersection2dView +Intersection2dViewCollection +IntersectionBox +IntersectionCollection +IntersectionResultDefinition +Legend +ListParameter +MainPlotCollection +MdiWindowController +MockModelSettings +ModeledWellPath +MultiPlot +MultiSnapshotDefinition +MultiSummaryPlot +NonNetLayers +ObservedDataCollection +ObservedFmuRftData +ParameterGroup +ParameterList +ParameterResultCrossPlot +PdmDocument +PdmObjectCollection +PdmObjectGroup +Perforation +PerforationCollection +PlotDataFilterCollection +PlotDataFilterItem +PlotTemplateCollection +PlotTemplateFileItem +PolyLineFilter +PolygonFilter +PolylineTarget +PolylinesFromFileAnnotation +PressureTable +PressureTableItem +PropertyFilter +ResInsightAnalysisModels +ResInsightGeoMechCase +ResInsightGeoMechModels +ResInsightOilField +ResInsightProject +ResampleData +ReservoirCellResultStorage +ReservoirView +ResultDefinition +ResultSlot +ResultStorageEntryInfo +RftAddress +RiaMemoryCleanup +RiaPreferences +RiaPreferencesGeoMech +RiaPreferencesSummary +RiaPreferencesSystem +RiaRegressionTest +RicCaseAndFileExportSettingsUi +RicCellRangeUi +RicCreateEnsembleSurfaceUi +RicCreateEnsembleWellLogUi +RicCreateMultipleWellPathLateralsUi +RicDeleteItemExecData +RicExportCarfinUi +RicExportCompletionDataSettingsUi +RicExportContourMapToTextUi +RicExportEclipseInputGridUi +RicExportLgrUi +RicExportToLasFileObj +RicExportToLasFileResampleUi +RicExportWellPathsUi +RicGridCalculator +RicHoloLensCreateSessionUi +RicHoloLensExportToFolderUi +RicHoloLensServerSettings +RicLinkVisibleViewsFeatureUi +RicPasteAsciiDataToSummaryPlotFeatureUi +RicSaturationPressureUi +RicSaveEclipseInputVisibleCellsUi +RicSaveMultiPlotTemplateFeatureSettings +RicSelectCaseOrEnsembleUi +RicSelectPlotTemplateUi +RicSelectSummaryPlotUI +RicSelectViewUI +RicSummaryAddressSelection +RicSummaryCurveCalculator +RicSummaryCurveCreator +RicWellPathsUnitSystemSettingsUi +RifReaderSettings +Rim3dWellLogCurveCollection +Rim3dWellLogExtractionCurve +Rim3dWellLogFileCurve +Rim3dWellLogRftCurve +RimAnnotationCollection +RimAnnotationCollectionBase +RimAnnotationGroupCollection +RimAnnotationLineAppearance +RimAnnotationTextAppearance +RimBinaryExportSettings +RimCaseCollection +RimCellFilterCollection +RimCommandExecuteScript +RimCommandIssueFieldChanged +RimCommandObject +RimCommandRouter +RimContourMapView +RimCsvUserData +RimCustomObjectiveFunction +RimCustomObjectiveFunctionCollection +RimCustomObjectiveFunctionWeight +RimDerivedEnsembleCase +RimDerivedEnsembleCaseCollection +RimDialogData +RimEclipseContourMapProjection +RimEclipseResultAddressCollection +RimElementVectorResult +RimEllipseFractureTemplate +RimEnsembleCurveFilter +RimEnsembleCurveFilterCollection +RimEnsembleCurveSet +RimEnsembleCurveSetCollection +RimEnsembleStatistics +RimEnsembleWellLogCurveSet +RimEquilibriumAxisAnnotation +RimExportInputSettings +RimFaultResultSlot +RimFractureExportSettings +RimGeoMechContourMapProjection +RimGeoMechContourMapView +RimGridCalculation +RimGridCalculationCollection +RimGridCalculationVariable +RimGridCrossPlot +RimGridCrossPlotCollection +RimGridCrossPlotCurveSetNameConfig +RimGridCrossPlotNameConfig +RimIdenticalGridCaseGroup +RimInputProperty +RimInputPropertyCollection +RimInputReservoir +RimIntersectionResultsDefinitionCollection +RimMeasurement +RimMswCompletionParameters +RimMudWeightWindowParameters +RimMultiPlotCollection +RimMultipleEclipseResults +RimMultipleLocations +RimMultipleValveLocations +RimNonDarcyPerforationParameters +RimObjectiveFunction +RimObservedEclipseUserData +RimOilFieldEntry +RimOilRegionEntry +RimPlotAxisAnnotation +RimPlotCellFilterCollection +RimPlotCellPropertyFilter +RimPolylineAppearance +RimPolylinesAnnotationInView +RimPolylinesFromFileAnnotationInView +RimProcess +RimReachCircleAnnotation +RimReachCircleAnnotationInView +RimRftCase +RimRftTopologyCurve +RimRoffCase +RimSaturationPressurePlot +RimSaturationPressurePlotCollection +RimStatisticalCalculation +RimStatisticalCollection +RimStimPlanColors +RimStimPlanFractureTemplate +RimStimPlanLegendConfig +RimSummaryAddressCollection +RimSummaryCalculation +RimSummaryCalculationCollection +RimSummaryCalculationVariable +RimSummaryCurveCollection +RimSummaryCurveCollectionModifier +RimSummaryMultiPlotCollection +RimSummaryPlotManager +RimSurfaceIntersectionBand +RimSurfaceIntersectionCollection +RimSurfaceIntersectionCurve +RimTensorResults +RimTernaryLegendConfig +RimTextAnnotation +RimTextAnnotationInView +RimThermalFractureTemplate +RimTimeAxisAnnotation +RimTimeStepFilter +RimUserDefinedPolylinesAnnotationInView +RimVfpPlotCollection +RimViewLinkerCollection +RimViewNameConfig +RimVirtualPerforationResults +RimWellIASettings +RimWellIASettingsCollection +RimWellLogExtractionCurve +RimWellLogExtractionCurveNameConfig +RimWellLogFileCurveNameConfig +RimWellLogPlotNameConfig +RimWellLogRftCurveNameConfig +RimWellLogWbsCurve +RimWellPathEntry +RimWellPathImport +RimWellPathTieIn +RiuCreateMultipleFractionsUi +RiuMultipleFractionsOptions +ScriptLocation +SimWellFracture +SimWellFractureCollection +StimPlanFractureTemplate +StimPlanModel +StimPlanModelCollection +StimPlanModelCurve +StimPlanModelPlot +StimPlanModelPlotCollection +StimPlanModelTemplate +StimPlanModelTemplateCollection +StreamlineInViewCollection +StringParameter +SummaryAddress +SummaryCaseCollection +SummaryCaseSubCollection +SummaryCrossPlot +SummaryCrossPlotCollection +SummaryCurve +SummaryCurveAutoName +SummaryObservedDataFile +SummaryPageDownloadEntity +SummaryPlot +SummaryPlotCollection +SummaryPlotFilterTextCurveSetEditor +SummaryTimeAxisProperties +SummaryYAxisProperties +Surface +SurfaceCollection +SurfaceInView +SurfaceInViewCollection +SurfaceResultDefinition +TC2 +TestCommand1 +ThermalFractureTemplate +TofAccumulatedPhaseFractionsPlot +TotalWellAllocationPlot +TriangleGeometry +UserDefinedFilter +UserDefinedPolylinesAnnotation +ValveTemplate +ValveTemplateCollection +VfpPlot +View3dOverlayInfoConfig +ViewController +ViewLinker +WbsParameters +Well +WellAllocationPlot +WellAllocationPlotLegend +WellBoreStabilityPlot +WellDistributionPlot +WellDistributionPlotCollection +WellFlowRateCurve +WellLogExtractionCurve +WellLogFile +WellLogFileChannel +WellLogFileCurve +WellLogPlot +WellLogPlotCollection +WellLogPlotTrack +WellLogRftCurve +WellMeasurement +WellMeasurementCurve +WellMeasurementFilePath +WellMeasurementInView +WellMeasurements +WellMeasurementsInView +WellPath +WellPathAicdParameters +WellPathAttribute +WellPathAttributes +WellPathBase +WellPathCompletionSettings +WellPathCompletions +WellPathFracture +WellPathFractureCollection +WellPathGeometry +WellPathGeometryDef +WellPathGroup +WellPathTarget +WellPathValve +WellPaths +WellPltPlot +WellPltPlotCollection +WellRftEnsembleCurveSet +WellRftPlot +WellRftPlotCollection +Wells +cafNamedTreeNode +cafObjectReferenceTreeNode +cafTreeNode +cloneView +closeProject +computeCaseGroupStatistics +createGridCaseGroup +createGridCaseGroupResult +createLgrForCompletions +createMultiPlot +createMultipleFractures +createSaturationPressurePlots +createStatisticsCase +createStatisticsCaseResult +createView +createViewResult +createWbsPlotResult +createWellBoreStabilityPlot +exportContourMapToText +exportFlowCharacteristics +exportLgrForCompletions +exportMsw +exportMultiCaseSnapshots +exportProperty +exportPropertyInViews +exportSimWellFractureCompletions +exportSnapshots +exportVisibleCells +exportWellLogPlotData +exportWellLogPlotDataResult +exportWellPathCompletions +exportWellPaths +importFormationNames +importWellLogFiles +importWellLogFilesResult +importWellPaths +importWellPathsResult +loadCase +loadCaseResult +openProject +replaceCase +replaceMultipleCases +replaceSourceCases +runOctaveScript +saveProject +saveProjectAs +scaleFractureTemplate +setExportFolder +setFractureContainment +setMainWindowSize +setPlotWindowSize +setStartDir +setTimeStep +stackCurves +unstackCurves diff --git a/ApplicationLibCode/Application/CMakeLists_files.cmake b/ApplicationLibCode/Application/CMakeLists_files.cmake index 6a3a6e2c22..4394a57630 100644 --- a/ApplicationLibCode/Application/CMakeLists_files.cmake +++ b/ApplicationLibCode/Application/CMakeLists_files.cmake @@ -23,12 +23,14 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RiaNncDefines.h ${CMAKE_CURRENT_LIST_DIR}/RiaPlotDefines.h ${CMAKE_CURRENT_LIST_DIR}/RiaStimPlanModelDefines.h + ${CMAKE_CURRENT_LIST_DIR}/RiaThermalFractureDefines.h ${CMAKE_CURRENT_LIST_DIR}/RiaResultNames.h ${CMAKE_CURRENT_LIST_DIR}/RiaNumberFormat.h ${CMAKE_CURRENT_LIST_DIR}/RiaRftDefines.h ${CMAKE_CURRENT_LIST_DIR}/RiaDateTimeDefines.h ${CMAKE_CURRENT_LIST_DIR}/RiaPlotCollectionScheduler.h ${CMAKE_CURRENT_LIST_DIR}/RiaScheduler.h + ${CMAKE_CURRENT_LIST_DIR}/RiaSummaryDefines.h ) set(SOURCE_GROUP_SOURCE_FILES @@ -56,12 +58,14 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RiaNncDefines.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaPlotDefines.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaStimPlanModelDefines.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaThermalFractureDefines.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaResultNames.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaNumberFormat.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaRftDefines.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaDateTimeDefines.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaPlotCollectionScheduler.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaScheduler.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaSummaryDefines.cpp ) list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) diff --git a/ApplicationLibCode/Application/RiaApplication.cpp b/ApplicationLibCode/Application/RiaApplication.cpp index 759da95ba3..fba19fbf89 100644 --- a/ApplicationLibCode/Application/RiaApplication.cpp +++ b/ApplicationLibCode/Application/RiaApplication.cpp @@ -674,6 +674,7 @@ bool RiaApplication::loadProject( const QString& projectFileName, sumMainCollection->updateAutoShortName(); for ( auto sumCaseGroup : sumMainCollection->summaryCaseCollections() ) { + sumCaseGroup->ensureNameIsUpdated(); sumCaseGroup->loadDataAndUpdate(); } @@ -710,7 +711,7 @@ bool RiaApplication::loadProject( const QString& projectFileName, // Recalculate the results from grid property calculations. // Has to be done late since the results are filtered by view cell visibility - for ( auto gridCalculation : m_project->gridCalculationCollection()->calculations() ) + for ( auto gridCalculation : m_project->gridCalculationCollection()->sortedGridCalculations() ) { gridCalculation->calculate(); gridCalculation->updateDependentObjects(); @@ -1180,11 +1181,8 @@ void RiaApplication::terminateProcess() { if ( m_workerProcess ) { - m_workerProcess->close(); + m_workerProcess->kill(); } - - m_runningWorkerProcess = false; - m_workerProcess = nullptr; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/RiaCompletionTypeCalculationScheduler.cpp b/ApplicationLibCode/Application/RiaCompletionTypeCalculationScheduler.cpp index c103de733d..abfb803bdf 100644 --- a/ApplicationLibCode/Application/RiaCompletionTypeCalculationScheduler.cpp +++ b/ApplicationLibCode/Application/RiaCompletionTypeCalculationScheduler.cpp @@ -24,9 +24,7 @@ #include "RigEclipseCaseData.h" #include "RimEclipseCase.h" -#include "RimEclipseCaseCollection.h" #include "RimEclipseView.h" -#include "RimOilField.h" #include "RimProject.h" #include "RiuMainWindow.h" @@ -55,19 +53,7 @@ RiaCompletionTypeCalculationScheduler* RiaCompletionTypeCalculationScheduler::in //-------------------------------------------------------------------------------------------------- void RiaCompletionTypeCalculationScheduler::scheduleRecalculateCompletionTypeAndRedrawAllViews() { - std::vector eclipseCases = - RimProject::current()->activeOilField()->analysisModels->cases().children(); - - scheduleRecalculateCompletionTypeAndRedrawAllViews( eclipseCases ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaCompletionTypeCalculationScheduler::scheduleRecalculateCompletionTypeAndRedrawAllViews( RimEclipseCase* eclipseCase ) -{ - std::vector eclipseCases; - eclipseCases.push_back( eclipseCase ); + auto eclipseCases = RimProject::current()->eclipseCases(); scheduleRecalculateCompletionTypeAndRedrawAllViews( eclipseCases ); } @@ -93,10 +79,23 @@ void RiaCompletionTypeCalculationScheduler::scheduleRecalculateCompletionTypeAnd //-------------------------------------------------------------------------------------------------- void RiaCompletionTypeCalculationScheduler::clearCompletionTypeResultsInAllCases() { - std::vector eclipseCases = - RimProject::current()->activeOilField()->analysisModels->cases().children(); + auto eclipseCases = RimProject::current()->eclipseCases(); clearCompletionTypeResults( eclipseCases ); + + // Clear geometry cache in views to recreate potential property filter geometry + for ( auto eclipseCase : eclipseCases ) + { + if ( !eclipseCase ) continue; + + for ( auto view : eclipseCase->views() ) + { + if ( auto eclipseView = dynamic_cast( view ) ) + { + eclipseView->scheduleReservoirGridGeometryRegen(); + } + } + } } //-------------------------------------------------------------------------------------------------- @@ -124,18 +123,15 @@ void RiaCompletionTypeCalculationScheduler::performScheduledUpdates() { std::set uniqueCases( m_eclipseCasesToRecalculate.begin(), m_eclipseCasesToRecalculate.end() ); - Rim3dView* activeView = RiaApplication::instance()->activeReservoirView(); - for ( RimEclipseCase* eclipseCase : uniqueCases ) { if ( eclipseCase ) { - for ( const auto& w : eclipseCase->views() ) + for ( auto view : eclipseCase->views() ) { - RimEclipseView* eclView = dynamic_cast( w ); - if ( eclView ) + if ( auto eclipseView = dynamic_cast( view ) ) { - eclView->calculateCompletionTypeAndRedrawIfRequired(); + eclipseView->calculateCompletionTypeAndRedrawIfRequired(); } } } @@ -146,6 +142,7 @@ void RiaCompletionTypeCalculationScheduler::performScheduledUpdates() // Recalculation of completion type causes active view to be set to potentially a different view // Also current index in project tree is changed. Restore both to initial state. + Rim3dView* activeView = RiaApplication::instance()->activeReservoirView(); if ( activeView && activeView->viewer() ) { RiaApplication::instance()->setActiveReservoirView( activeView ); diff --git a/ApplicationLibCode/Application/RiaCompletionTypeCalculationScheduler.h b/ApplicationLibCode/Application/RiaCompletionTypeCalculationScheduler.h index 1f7ad10416..661aa61b29 100644 --- a/ApplicationLibCode/Application/RiaCompletionTypeCalculationScheduler.h +++ b/ApplicationLibCode/Application/RiaCompletionTypeCalculationScheduler.h @@ -38,7 +38,7 @@ class RiaCompletionTypeCalculationScheduler : public RiaScheduler void scheduleRecalculateCompletionTypeAndRedrawAllViews(); void clearCompletionTypeResultsInAllCases(); - void scheduleRecalculateCompletionTypeAndRedrawAllViews( RimEclipseCase* eclipseCase ); + void scheduleRecalculateCompletionTypeAndRedrawAllViews( const std::vector& eclipseCases ); void clearCompletionTypeResults( const std::vector& eclipseCases ); void performScheduledUpdates() override; @@ -50,8 +50,6 @@ class RiaCompletionTypeCalculationScheduler : public RiaScheduler RiaCompletionTypeCalculationScheduler( const RiaCompletionTypeCalculationScheduler& o ) = delete; void operator=( const RiaCompletionTypeCalculationScheduler& o ) = delete; - void scheduleRecalculateCompletionTypeAndRedrawAllViews( const std::vector& eclipseCases ); - private: std::vector> m_eclipseCasesToRecalculate; }; diff --git a/ApplicationLibCode/Application/RiaConsoleApplication.cpp b/ApplicationLibCode/Application/RiaConsoleApplication.cpp index 4f4fe89698..a5bb290f6b 100644 --- a/ApplicationLibCode/Application/RiaConsoleApplication.cpp +++ b/ApplicationLibCode/Application/RiaConsoleApplication.cpp @@ -104,7 +104,7 @@ void RiaConsoleApplication::initialize() RiaApplication::initialize(); RiaLogging::setLoggerInstance( std::make_unique() ); - RiaLogging::loggerInstance()->setLevel( int( RILogLevel::RI_LL_DEBUG ) ); + RiaLogging::loggerInstance()->setLevel( int( RiaLogging::logLevelBasedOnPreferences() ) ); m_socketServer = new RiaSocketServer( this ); } diff --git a/ApplicationLibCode/Application/RiaDefines.cpp b/ApplicationLibCode/Application/RiaDefines.cpp index d61157c3ee..def5921cb5 100644 --- a/ApplicationLibCode/Application/RiaDefines.cpp +++ b/ApplicationLibCode/Application/RiaDefines.cpp @@ -271,6 +271,10 @@ RiaDefines::ImportFileType RiaDefines::obtainFileTypeFromFileName( const QString { return ImportFileType::ECLIPSE_INPUT_FILE; } + else if ( fileName.endsWith( "ROFF", Qt::CaseInsensitive ) || fileName.endsWith( "ROFFASC", Qt::CaseInsensitive ) ) + { + return ImportFileType::ROFF_FILE; + } else if ( fileName.endsWith( "SMSPEC", Qt::CaseInsensitive ) ) { return ImportFileType::ECLIPSE_SUMMARY_FILE; diff --git a/ApplicationLibCode/Application/RiaDefines.h b/ApplicationLibCode/Application/RiaDefines.h index cc24d2d896..6ba9381577 100644 --- a/ApplicationLibCode/Application/RiaDefines.h +++ b/ApplicationLibCode/Application/RiaDefines.h @@ -20,6 +20,8 @@ #pragma once +#include "enum_bitmask.hpp" + #include #include #include @@ -124,8 +126,9 @@ enum class ImportFileType ECLIPSE_SUMMARY_FILE = 0x08, GEOMECH_ODB_FILE = 0x10, RESINSIGHT_PROJECT_FILE = 0x20, + ROFF_FILE = 0x30, ECLIPSE_RESULT_GRID = ECLIPSE_GRID_FILE | ECLIPSE_EGRID_FILE, - ANY_ECLIPSE_FILE = ECLIPSE_RESULT_GRID | ECLIPSE_INPUT_FILE | ECLIPSE_SUMMARY_FILE, + ANY_ECLIPSE_FILE = ECLIPSE_RESULT_GRID | ECLIPSE_INPUT_FILE | ECLIPSE_SUMMARY_FILE | ROFF_FILE, ANY_IMPORT_FILE = 0xFF }; @@ -213,18 +216,20 @@ enum class MultiPlotPageUpdateType : uint32_t ALL = 0b00000111 }; -constexpr enum MultiPlotPageUpdateType operator|( const enum MultiPlotPageUpdateType selfValue, - const enum MultiPlotPageUpdateType inValue ) -{ - return ( enum MultiPlotPageUpdateType )( uint32_t( selfValue ) | uint32_t( inValue ) ); -} +std::vector viewScaleOptions(); -constexpr enum MultiPlotPageUpdateType operator&( const enum MultiPlotPageUpdateType selfValue, - const enum MultiPlotPageUpdateType inValue ) +enum class View3dContent { - return ( enum MultiPlotPageUpdateType )( uint32_t( selfValue ) & uint32_t( inValue ) ); -} - -std::vector viewScaleOptions(); + NONE = 0b00000000, + ECLIPSE_DATA = 0b00000001, + GEOMECH_DATA = 0b00000010, + FLAT_INTERSECTION = 0b00000100, + CONTOUR = 0b00001000, + ALL = 0b00001111 +}; }; // namespace RiaDefines + +// Activate bit mask operators at global scope +ENABLE_BITMASK_OPERATORS( RiaDefines::MultiPlotPageUpdateType ) +ENABLE_BITMASK_OPERATORS( RiaDefines::View3dContent ) diff --git a/ApplicationLibCode/Application/RiaGuiApplication.cpp b/ApplicationLibCode/Application/RiaGuiApplication.cpp index e59d50d51b..713e09a6c7 100644 --- a/ApplicationLibCode/Application/RiaGuiApplication.cpp +++ b/ApplicationLibCode/Application/RiaGuiApplication.cpp @@ -434,7 +434,8 @@ void RiaGuiApplication::initialize() logger->addMessagePanel( m_mainWindow->messagePanel() ); logger->addMessagePanel( m_mainPlotWindow->messagePanel() ); RiaLogging::setLoggerInstance( std::move( logger ) ); - RiaLogging::loggerInstance()->setLevel( int( RILogLevel::RI_LL_DEBUG ) ); + + RiaLogging::loggerInstance()->setLevel( int( RiaLogging::logLevelBasedOnPreferences() ) ); } m_socketServer = new RiaSocketServer( this ); } @@ -1209,6 +1210,9 @@ void RiaGuiApplication::onProjectBeingOpened() { // When importing a project, do not maximize the first MDI window to be created m_maximizeWindowGuard = std::make_unique(); + + if ( m_mainWindow ) m_mainWindow->setBlockSubWindowActivatedSignal( true ); + if ( mainPlotWindow() ) mainPlotWindow()->setBlockSubWindowActivatedSignal( true ); } //-------------------------------------------------------------------------------------------------- @@ -1269,6 +1273,9 @@ void RiaGuiApplication::onProjectOpened() processEvents(); + if ( m_mainWindow ) m_mainWindow->setBlockSubWindowActivatedSignal( false ); + if ( mainPlotWindow() ) mainPlotWindow()->setBlockSubWindowActivatedSignal( false ); + // Make sure to process events before this function to avoid strange Qt crash RiuPlotMainWindowTools::refreshToolbars(); } @@ -1568,7 +1575,7 @@ void RiaGuiApplication::stopMonitoringWorkProgress() //-------------------------------------------------------------------------------------------------- void RiaGuiApplication::slotWorkerProcessFinished( int exitCode, QProcess::ExitStatus exitStatus ) { - CAF_ASSERT( m_mainWindow ); + if ( m_mainWindow == nullptr ) return; m_mainWindow->processMonitor()->stopMonitorWorkProcess(); diff --git a/ApplicationLibCode/Application/RiaPlotDefines.cpp b/ApplicationLibCode/Application/RiaPlotDefines.cpp index 49ae37cdc5..a3c23c0812 100644 --- a/ApplicationLibCode/Application/RiaPlotDefines.cpp +++ b/ApplicationLibCode/Application/RiaPlotDefines.cpp @@ -35,8 +35,140 @@ void caf::AppEnum::setUp() setDefault( RiaDefines::PlotAxis::PLOT_AXIS_LEFT ); } + +template <> +void caf::AppEnum::setUp() +{ + addItem( RiaDefines::MultiPlotAxisVisibility::ONE_VISIBLE, "ONE_VISIBLE", "One Axis Per Plot" ); + addItem( RiaDefines::MultiPlotAxisVisibility::ALL_VISIBLE, "ALL_VISIBLE", "All Axis Visible" ); + + setDefault( RiaDefines::MultiPlotAxisVisibility::ONE_VISIBLE ); +} + +template <> +void caf::AppEnum::setUp() +{ + addItem( RiaDefines::ObjectNamingMethod::CUSTOM, "CUSTOM", "Custom" ); + addItem( RiaDefines::ObjectNamingMethod::AUTO, "AUTO", "Auto" ); + addItem( RiaDefines::ObjectNamingMethod::TEMPLATE, "TEMPLATE", "Template" ); + + setDefault( RiaDefines::ObjectNamingMethod::AUTO ); +} + +template <> +void caf::AppEnum::setUp() +{ + addItem( Qt::PenStyle::NoPen, "NO_PEN", "No Pen" ); + addItem( Qt::PenStyle::SolidLine, "SOLID_LINE", "Solid Line" ); + addItem( Qt::PenStyle::DashLine, "DASH_LINE", "Dash Line" ); + addItem( Qt::PenStyle::DotLine, "DOT_LINE", "Dot Line" ); + addItem( Qt::PenStyle::DashDotLine, "DASH_DOT_LINE", "Dash Dot Line" ); + addItem( Qt::PenStyle::DashDotDotLine, "DASH_DOT_DOT_LINE", "Dash Dot Dot Line" ); + + setDefault( Qt::PenStyle::SolidLine ); +} + +template <> +void caf::AppEnum::setUp() +{ + addItem( RiaDefines::Orientation::HORIZONTAL, "HORIZONTAL", "Horizontal" ); + addItem( RiaDefines::Orientation::VERTICAL, "VERTICAL", "Vertical" ); + setDefault( RiaDefines::Orientation::VERTICAL ); +} + +template <> +void caf::AppEnum::setUp() +{ + addItem( RiaDefines::WindowTileMode::DEFAULT, "DEFAULT", "Default" ); + addItem( RiaDefines::WindowTileMode::VERTICAL, "VERTICAL", "Vertical" ); + addItem( RiaDefines::WindowTileMode::HORIZONTAL, "HORIZONTAL", "Horizontal" ); + addItem( RiaDefines::WindowTileMode::UNDEFINED, "UNDEFINED", "Undefined" ); + + setDefault( RiaDefines::WindowTileMode::UNDEFINED ); +} + }; // namespace caf +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::namingVariableCase() +{ + return "$CASE"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::namingVariableWell() +{ + return "$WELL"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::namingVariableRefWell() +{ + return "$REF_WELL"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::namingVariableWellBranch() +{ + return "$WELL_BRANCH"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::namingVariableResultName() +{ + return "$RESULT_NAME"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::namingVariableResultType() +{ + return "$RESULT_TYPE"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::namingVariableTime() +{ + return "$TIME"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::namingVariableTimestep() +{ + return "$TIME_STEP"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::namingVariableAirGap() +{ + return "$AIR_GAP"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::namingVariableWaterDepth() +{ + return "$WATER_DEPTH"; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -115,3 +247,27 @@ double RiaDefines::scalingFactor( QPaintDevice* paintDevice ) return scaling; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::curveNameGroupName() +{ + return "Curve Name"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::appearanceGroupName() +{ + return "Appearance"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::additionalDataSourcesGroupName() +{ + return "Additional Data Sources"; +} diff --git a/ApplicationLibCode/Application/RiaPlotDefines.h b/ApplicationLibCode/Application/RiaPlotDefines.h index a8b9834c0f..9cae9e693c 100644 --- a/ApplicationLibCode/Application/RiaPlotDefines.h +++ b/ApplicationLibCode/Application/RiaPlotDefines.h @@ -19,6 +19,7 @@ #pragma once class QPaintDevice; +class QString; // Defines relate to plotting namespace RiaDefines @@ -59,6 +60,39 @@ enum class Orientation VERTICAL }; +enum class MultiPlotAxisVisibility +{ + ONE_VISIBLE, + ALL_VISIBLE +}; + +enum class ObjectNamingMethod +{ + CUSTOM, + AUTO, + TEMPLATE +}; + +enum class WindowTileMode +{ + DEFAULT, + VERTICAL, + HORIZONTAL, + UNDEFINED, +}; + +// Defines relate to curve and plot template names +QString namingVariableCase(); +QString namingVariableWell(); +QString namingVariableRefWell(); +QString namingVariableWellBranch(); +QString namingVariableResultName(); +QString namingVariableResultType(); +QString namingVariableTime(); +QString namingVariableTimestep(); +QString namingVariableAirGap(); +QString namingVariableWaterDepth(); + double minimumDefaultValuePlot(); double minimumDefaultLogValuePlot(); double maximumDefaultValuePlot(); @@ -69,4 +103,9 @@ PlotAxis opposite( PlotAxis axis ); double scalingFactor( QPaintDevice* paintDevice ); +// Project editor group names +QString curveNameGroupName(); +QString appearanceGroupName(); +QString additionalDataSourcesGroupName(); + }; // namespace RiaDefines diff --git a/ApplicationLibCode/Application/RiaPreferencesGeoMech.cpp b/ApplicationLibCode/Application/RiaPreferencesGeoMech.cpp index 899e568ed8..67f528c713 100644 --- a/ApplicationLibCode/Application/RiaPreferencesGeoMech.cpp +++ b/ApplicationLibCode/Application/RiaPreferencesGeoMech.cpp @@ -34,28 +34,6 @@ CAF_PDM_SOURCE_INIT( RiaPreferencesGeoMech, "RiaPreferencesGeoMech" ); //-------------------------------------------------------------------------------------------------- RiaPreferencesGeoMech::RiaPreferencesGeoMech() { - CAF_PDM_InitFieldNoDefault( &m_geomechFRAPreprocCommand, "geomechFRAPreprocCommand", "Pre-Processing Command" ); - m_geomechFRAPreprocCommand.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); - m_geomechFRAPreprocCommand.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP ); - - CAF_PDM_InitFieldNoDefault( &m_geomechFRAPostprocCommand, "geomechFRAPostprocCommand", "Post-Processing Command" ); - m_geomechFRAPostprocCommand.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); - m_geomechFRAPostprocCommand.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP ); - - CAF_PDM_InitFieldNoDefault( &m_geomechFRAMacrisCommand, "geomechFRAMacrisCommand", "Main Macris Command" ); - m_geomechFRAMacrisCommand.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); - m_geomechFRAMacrisCommand.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP ); - - CAF_PDM_InitFieldNoDefault( &m_geomechFRADefaultBasicXML, "geomechFRADefaultXML", "Basic Processing Parameter XML File" ); - m_geomechFRADefaultBasicXML.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); - m_geomechFRADefaultBasicXML.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP ); - - CAF_PDM_InitFieldNoDefault( &m_geomechFRADefaultAdvXML, - "geomechFRADefaultAdvXML", - "Advanced Processing Parameter XML File" ); - m_geomechFRADefaultAdvXML.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); - m_geomechFRADefaultAdvXML.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP ); - CAF_PDM_InitFieldNoDefault( &m_geomechWIADefaultXML, "geomechWIADefaultXML", "Default Parameter XML File" ); m_geomechWIADefaultXML.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); m_geomechWIADefaultXML.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP ); @@ -87,17 +65,6 @@ RiaPreferencesGeoMech* RiaPreferencesGeoMech::current() //-------------------------------------------------------------------------------------------------- void RiaPreferencesGeoMech::appendItems( caf::PdmUiOrdering& uiOrdering ) const { - caf::PdmUiGroup* faultRAGroup = uiOrdering.addNewGroup( "Fault Reactivation Assessment" ); - caf::PdmUiGroup* cmdFRAGroup = faultRAGroup->addNewGroup( "Commands (without parameters)" ); - - cmdFRAGroup->add( &m_geomechFRAPreprocCommand ); - cmdFRAGroup->add( &m_geomechFRAPostprocCommand ); - cmdFRAGroup->add( &m_geomechFRAMacrisCommand ); - - caf::PdmUiGroup* paramFRAGroup = faultRAGroup->addNewGroup( "Parameters" ); - paramFRAGroup->add( &m_geomechFRADefaultBasicXML ); - paramFRAGroup->add( &m_geomechFRADefaultAdvXML ); - caf::PdmUiGroup* wellIAGroup = uiOrdering.addNewGroup( "Well Integrity Analysis" ); wellIAGroup->add( &m_geomechWIACommand ); wellIAGroup->add( &m_geomechWIADefaultXML ); @@ -114,46 +81,6 @@ void RiaPreferencesGeoMech::defineUiOrdering( QString uiConfigName, caf::PdmUiOr { } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RiaPreferencesGeoMech::geomechFRAPreprocCommand() const -{ - return m_geomechFRAPreprocCommand; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RiaPreferencesGeoMech::geomechFRAPostprocCommand() const -{ - return m_geomechFRAPostprocCommand; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RiaPreferencesGeoMech::geomechFRAMacrisCommand() const -{ - return m_geomechFRAMacrisCommand; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RiaPreferencesGeoMech::geomechFRADefaultBasicXML() const -{ - return m_geomechFRADefaultBasicXML; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RiaPreferencesGeoMech::geomechFRADefaultAdvXML() const -{ - return m_geomechFRADefaultAdvXML; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -186,21 +113,6 @@ bool RiaPreferencesGeoMech::waitBeforeRunWIA() const return m_waitForInputFileEdit; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaPreferencesGeoMech::validateFRASettings() const -{ - QStringList files; - files << geomechFRAPreprocCommand(); - files << geomechFRAPostprocCommand(); - files << geomechFRAMacrisCommand(); - files << geomechFRADefaultBasicXML(); - files << geomechFRADefaultAdvXML(); - - return filesExists( files ); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/RiaPreferencesGeoMech.h b/ApplicationLibCode/Application/RiaPreferencesGeoMech.h index 97ffb176dd..2308220570 100644 --- a/ApplicationLibCode/Application/RiaPreferencesGeoMech.h +++ b/ApplicationLibCode/Application/RiaPreferencesGeoMech.h @@ -36,16 +36,9 @@ class RiaPreferencesGeoMech : public caf::PdmObject void appendItems( caf::PdmUiOrdering& uiOrdering ) const; - bool validateFRASettings() const; bool validateWIASettings() const; // geomech settings - QString geomechFRAPreprocCommand() const; - QString geomechFRAPostprocCommand() const; - QString geomechFRAMacrisCommand() const; - QString geomechFRADefaultBasicXML() const; - QString geomechFRADefaultAdvXML() const; - QString geomechWIADefaultXML() const; QString geomechWIACommand() const; bool waitBeforeRunWIA() const; @@ -58,12 +51,6 @@ class RiaPreferencesGeoMech : public caf::PdmObject private: bool filesExists( QStringList& filelist ) const; - caf::PdmField m_geomechFRAPreprocCommand; - caf::PdmField m_geomechFRAPostprocCommand; - caf::PdmField m_geomechFRAMacrisCommand; - caf::PdmField m_geomechFRADefaultBasicXML; - caf::PdmField m_geomechFRADefaultAdvXML; - caf::PdmField m_geomechWIADefaultXML; caf::PdmField m_geomechWIACommand; caf::PdmField m_waitForInputFileEdit; diff --git a/ApplicationLibCode/Application/RiaRftDefines.cpp b/ApplicationLibCode/Application/RiaRftDefines.cpp index 75f74fbfa7..1d39a5023a 100644 --- a/ApplicationLibCode/Application/RiaRftDefines.cpp +++ b/ApplicationLibCode/Application/RiaRftDefines.cpp @@ -67,14 +67,6 @@ QString RiaDefines::segmentBranchNumberResultName() return "SegmentBranchNumber"; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RiaDefines::segmentOneBasedBranchIndexResultName() -{ - return "SegmentOneBasedBranchIndex"; -} - namespace caf { template <> diff --git a/ApplicationLibCode/Application/RiaRftDefines.h b/ApplicationLibCode/Application/RiaRftDefines.h index 2eb3247e28..de143df071 100644 --- a/ApplicationLibCode/Application/RiaRftDefines.h +++ b/ApplicationLibCode/Application/RiaRftDefines.h @@ -29,7 +29,6 @@ QString segmentNumberResultName(); QString allBranches(); QString segmentBranchNumberResultName(); -QString segmentOneBasedBranchIndexResultName(); enum class RftBranchType { diff --git a/ApplicationLibCode/Application/RiaSummaryDefines.cpp b/ApplicationLibCode/Application/RiaSummaryDefines.cpp new file mode 100644 index 0000000000..7efa9c8293 --- /dev/null +++ b/ApplicationLibCode/Application/RiaSummaryDefines.cpp @@ -0,0 +1,147 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022 Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RiaSummaryDefines.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::summaryField() +{ + return "Field"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::summaryAquifer() +{ + return "Aquifer"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::summaryNetwork() +{ + return "Network"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::summaryMisc() +{ + return "Misc"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::summaryRegion() +{ + return "Region"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::summaryRegion2Region() +{ + return "Region-Region"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::summaryWell() +{ + return "Well"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::summaryWellGroup() +{ + return "Group"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::summaryWellSegment() +{ + return "Well Segment"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::summaryCompletion() +{ + return "Completion"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::summarySegment() +{ + return "Segment"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::summaryBlock() +{ + return "Block"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::summaryLgrCompletion() +{ + return "LGR Completion"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::summaryLgrWell() +{ + return "LGR Well"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::summaryLgrBlock() +{ + return "LGR Block"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaDefines::summaryCalculated() +{ + return "Calculated"; +} diff --git a/ApplicationLibCode/Application/RiaSummaryDefines.h b/ApplicationLibCode/Application/RiaSummaryDefines.h new file mode 100644 index 0000000000..c64befc280 --- /dev/null +++ b/ApplicationLibCode/Application/RiaSummaryDefines.h @@ -0,0 +1,42 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022 Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include + +namespace RiaDefines +{ +QString summaryField(); +QString summaryAquifer(); +QString summaryNetwork(); +QString summaryMisc(); +QString summaryRegion(); +QString summaryRegion2Region(); +QString summaryWell(); +QString summaryWellGroup(); +QString summaryWellSegment(); +QString summaryCompletion(); +QString summarySegment(); +QString summaryBlock(); +QString summaryLgrCompletion(); +QString summaryLgrWell(); +QString summaryLgrBlock(); +QString summaryCalculated(); + +}; // namespace RiaDefines diff --git a/ApplicationLibCode/Application/RiaThermalFractureDefines.cpp b/ApplicationLibCode/Application/RiaThermalFractureDefines.cpp new file mode 100644 index 0000000000..6928d0f4a7 --- /dev/null +++ b/ApplicationLibCode/Application/RiaThermalFractureDefines.cpp @@ -0,0 +1,123 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022- Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RiaThermalFractureDefines.h" +#include "RiaFractureDefines.h" + +#include "cafAssert.h" + +#include + +namespace RiaDefines +{ +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString leakoffPressureDropResultName() +{ + return "LeakoffPressureDrop"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString filtratePressureDropResultName() +{ + return "FiltratePressureDrop"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString leakoffMobilityResultName() +{ + return "LeakoffMobility"; +}; + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString filterCakeMobilityResultName() +{ + return "FilterCakeMobility"; +}; + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString injectivityFactorResultName() +{ + return "InjectivityFactor"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString viscosityResultName() +{ + return "Viscosity"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString getExpectedThermalFractureUnit( const QString& name, RiaDefines::EclipseUnitSystem unitSystem ) +{ + CAF_ASSERT( unitSystem == RiaDefines::EclipseUnitSystem::UNITS_METRIC || + unitSystem == RiaDefines::EclipseUnitSystem::UNITS_FIELD ); + + // parameter name --> { metric unit, field unit } + std::map> mapping = + { { "XCoord", { "m", "feet" } }, + { "YCoord", { "m", "feet" } }, + { "ZCoord", { "m", "feet" } }, + { "Width", { "cm", "inches" } }, + { "Pressure", { "BARa", "psia" } }, + { "Temperature", { "deg C", "deg F" } }, + { "Stress", { "BARa", "psia" } }, + { "Density", { "Kg/m3", "lb/ft3" } }, + { RiaDefines::viscosityResultName(), { "mPa.s", "centipoise" } }, + { RiaDefines::leakoffMobilityResultName(), { "m/day/bar", "ft/day/psi" } }, + { "Conductivity", + { RiaDefines::unitStringConductivity( RiaDefines::EclipseUnitSystem::UNITS_METRIC ), + RiaDefines::unitStringConductivity( RiaDefines::EclipseUnitSystem::UNITS_FIELD ) } }, + { "Velocity", { "m/sec", "ft/sec" } }, + { "ResPressure", { "BARa", "psia" } }, + { "ResTemperature", { "deg C", "deg F" } }, + { "FiltrateThickness", { "cm", "inches" } }, + { RiaDefines::filtratePressureDropResultName(), { "bar", "psi" } }, + { "EffectiveResStress", { "bar", "psi" } }, + { "EffectiveFracStress", { "bar", "psi" } }, + { RiaDefines::leakoffPressureDropResultName(), { "bar", "psi" } }, + { RiaDefines::injectivityFactorResultName(), { "factor", "factor" } }, + { RiaDefines::filterCakeMobilityResultName(), { "m/day/bar", "ft/day/psi" } } }; + + auto res = std::find_if( mapping.begin(), mapping.end(), [&]( const auto& val ) { return val.first == name; } ); + + if ( res != mapping.end() ) + { + if ( unitSystem == RiaDefines::EclipseUnitSystem::UNITS_METRIC ) + return res->second.first; + else + return res->second.second; + } + + return ""; +} + +}; // namespace RiaDefines diff --git a/ApplicationLibCode/FileInterface/RifFaultRAXmlWriter.h b/ApplicationLibCode/Application/RiaThermalFractureDefines.h similarity index 57% rename from ApplicationLibCode/FileInterface/RifFaultRAXmlWriter.h rename to ApplicationLibCode/Application/RiaThermalFractureDefines.h index 132a33aa26..619fbf84d7 100644 --- a/ApplicationLibCode/FileInterface/RifFaultRAXmlWriter.h +++ b/ApplicationLibCode/Application/RiaThermalFractureDefines.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////////// // -// Copyright (C) 2021 Equinor ASA +// Copyright (C) 2022- Equinor ASA // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -18,24 +18,21 @@ #pragma once +#include "RiaDefines.h" + #include -#include -class RimFaultRASettings; -class RimGenericParameter; -class RifFaultRAXmlWriter +namespace RiaDefines { -public: - RifFaultRAXmlWriter( RimFaultRASettings* settings ); - ~RifFaultRAXmlWriter(); - - bool writeCalculateFile( QString filename, int faultID, QString& outErrorText ); - bool writeCalibrateFile( QString filename, int faultID, QString& outErrorText ); +QString leakoffPressureDropResultName(); +QString filtratePressureDropResultName(); +QString leakoffMobilityResultName(); +QString filterCakeMobilityResultName(); +QString injectivityFactorResultName(); +QString viscosityResultName(); -private: - bool writeParametersToXML( QString filename, std::list& params, QString& outErrorText ); +QString getExpectedThermalFractureUnit( const QString& name, RiaDefines::EclipseUnitSystem unitSystem ); - RimFaultRASettings* m_settings; -}; +}; // namespace RiaDefines diff --git a/ApplicationLibCode/Application/Tools/CMakeLists_files.cmake b/ApplicationLibCode/Application/Tools/CMakeLists_files.cmake index 5c122e3be8..20f855efee 100644 --- a/ApplicationLibCode/Application/Tools/CMakeLists_files.cmake +++ b/ApplicationLibCode/Application/Tools/CMakeLists_files.cmake @@ -49,6 +49,9 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RiaVec3Tools.h ${CMAKE_CURRENT_LIST_DIR}/RiaEnsembleNameTools.h ${CMAKE_CURRENT_LIST_DIR}/RiaSummaryStringTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaNetworkTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaOpenMPTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaNumericalTools.h ) set(SOURCE_GROUP_SOURCE_FILES @@ -95,6 +98,9 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RiaEnsembleNameTools.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaVec3Tools.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaSummaryStringTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaNetworkTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaOpenMPTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaNumericalTools.cpp ) list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) diff --git a/ApplicationLibCode/Application/Tools/RiaFilePathTools.cpp b/ApplicationLibCode/Application/Tools/RiaFilePathTools.cpp index ba7783abc9..377eca7157 100644 --- a/ApplicationLibCode/Application/Tools/RiaFilePathTools.cpp +++ b/ApplicationLibCode/Application/Tools/RiaFilePathTools.cpp @@ -25,6 +25,7 @@ #include +#include #include #include @@ -362,3 +363,16 @@ std::map RiaFilePathTools::keyPathComponentsForEachFilePat return keyComponents; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaFilePathTools::isFirstOlderThanSecond( const std::string& firstFileName, const std::string& secondFileName ) +{ + if ( !std::filesystem::exists( firstFileName ) || !std::filesystem::exists( secondFileName ) ) return false; + + auto timeFirstFile = std::filesystem::last_write_time( firstFileName ); + auto timeSecondFile = std::filesystem::last_write_time( secondFileName ); + + return ( timeFirstFile < timeSecondFile ); +} diff --git a/ApplicationLibCode/Application/Tools/RiaFilePathTools.h b/ApplicationLibCode/Application/Tools/RiaFilePathTools.h index 7e7a42b347..fa857254c2 100644 --- a/ApplicationLibCode/Application/Tools/RiaFilePathTools.h +++ b/ApplicationLibCode/Application/Tools/RiaFilePathTools.h @@ -48,4 +48,6 @@ class RiaFilePathTools static QStringList splitPathIntoComponents( const QString& path, bool splitExtensionIntoSeparateEntry = false ); static std::map keyPathComponentsForEachFilePath( const QStringList& filePaths ); + + static bool isFirstOlderThanSecond( const std::string& firstFileName, const std::string& secondFileName ); }; diff --git a/ApplicationLibCode/Application/Tools/RiaGitDiff.cpp b/ApplicationLibCode/Application/Tools/RiaGitDiff.cpp index 332e9712f4..6df8a4ea3b 100644 --- a/ApplicationLibCode/Application/Tools/RiaGitDiff.cpp +++ b/ApplicationLibCode/Application/Tools/RiaGitDiff.cpp @@ -27,6 +27,10 @@ #ifdef _MSC_VER #pragma warning( disable : 4996 ) #endif +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/Tools/RiaImageFileCompare.cpp b/ApplicationLibCode/Application/Tools/RiaImageFileCompare.cpp index 66c86da047..d4f6766aad 100644 --- a/ApplicationLibCode/Application/Tools/RiaImageFileCompare.cpp +++ b/ApplicationLibCode/Application/Tools/RiaImageFileCompare.cpp @@ -23,6 +23,9 @@ #ifdef _MSC_VER #pragma warning( disable : 4996 ) #endif +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif //================================================================================================== // diff --git a/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.cpp b/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.cpp index b3df717e2e..58bee1c0b8 100644 --- a/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.cpp +++ b/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.cpp @@ -47,6 +47,7 @@ #include "RimMainPlotCollection.h" #include "RimOilField.h" #include "RimProject.h" +#include "RimRoffCase.h" #include "RimSummaryCase.h" #include "RimSummaryCaseCollection.h" #include "RimSummaryCaseMainCollection.h" @@ -508,3 +509,51 @@ bool RiaImportEclipseCaseTools::addEclipseCases( const QStringList& fil return true; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RiaImportEclipseCaseTools::openRoffCaseFromFileNames( const QStringList& fileNames, bool createDefaultView ) +{ + CAF_ASSERT( !fileNames.empty() ); + + auto* roffCase = new RimRoffCase(); + + RiaApplication* app = RiaApplication::instance(); + RimProject* project = app->project(); + project->assignCaseIdToCase( roffCase ); + roffCase->setGridFileName( fileNames[0] ); + + bool gridImportSuccess = roffCase->openEclipseGridFile(); + if ( !gridImportSuccess ) + { + RiaLogging::error( "Failed to import grid" ); + return -1; + } + + RimEclipseCaseCollection* analysisModels = project->activeOilField() ? project->activeOilField()->analysisModels() + : nullptr; + if ( !analysisModels ) return -1; + + analysisModels->cases.push_back( roffCase ); + + RimEclipseView* eclipseView = nullptr; + if ( createDefaultView ) + { + eclipseView = roffCase->createAndAddReservoirView(); + + eclipseView->cellResult()->setResultType( RiaDefines::ResultCatType::INPUT_PROPERTY ); + + if ( RiaGuiApplication::isRunning() ) + { + if ( RiuMainWindow::instance() ) + RiuMainWindow::instance()->selectAsCurrentItem( eclipseView->cellResult() ); + } + + eclipseView->loadDataAndUpdate(); + } + + analysisModels->updateConnectedEditors(); + + return roffCase->caseId(); +} diff --git a/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.h b/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.h index ecc7c78cff..b43b52d2ba 100644 --- a/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.h +++ b/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.h @@ -52,6 +52,8 @@ class RiaImportEclipseCaseTools bool createView, std::shared_ptr readerSettings = nullptr ); + static int openRoffCaseFromFileNames( const QStringList& fileNames, bool createDefaultView ); + private: static int openEclipseCaseShowTimeStepFilterImpl( const QString& fileName, bool showTimeStepFilter, diff --git a/ApplicationLibCode/Application/Tools/RiaLogging.cpp b/ApplicationLibCode/Application/Tools/RiaLogging.cpp index 313058e4b8..0dc96721f1 100644 --- a/ApplicationLibCode/Application/Tools/RiaLogging.cpp +++ b/ApplicationLibCode/Application/Tools/RiaLogging.cpp @@ -187,6 +187,16 @@ void RiaLogging::setLoggerInstance( std::unique_ptr loggerInstance ) sm_logger = std::move( loggerInstance ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RILogLevel RiaLogging::logLevelBasedOnPreferences() +{ + if ( RiaApplication::enableDevelopmentFeatures() ) return RILogLevel::RI_LL_DEBUG; + + return RILogLevel::RI_LL_INFO; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/Tools/RiaLogging.h b/ApplicationLibCode/Application/Tools/RiaLogging.h index f824e781ba..1aa7f31341 100644 --- a/ApplicationLibCode/Application/Tools/RiaLogging.h +++ b/ApplicationLibCode/Application/Tools/RiaLogging.h @@ -63,6 +63,8 @@ class RiaLogging static RiaLogger* loggerInstance(); static void setLoggerInstance( std::unique_ptr loggerInstance ); + static RILogLevel logLevelBasedOnPreferences(); + static void error( const QString& message ); static void warning( const QString& message ); static void info( const QString& message ); diff --git a/ApplicationLibCode/Application/Tools/RiaNetworkTools.cpp b/ApplicationLibCode/Application/Tools/RiaNetworkTools.cpp new file mode 100644 index 0000000000..5935f8db8f --- /dev/null +++ b/ApplicationLibCode/Application/Tools/RiaNetworkTools.cpp @@ -0,0 +1,102 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022 Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RiaNetworkTools.h" + +#include +#include +#include +#include +#include +#include +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaNetworkTools::openUrl( const QString& urlString ) +{ + QDesktopServices::openUrl( QUrl( urlString ) ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaNetworkTools::createAndOpenUrlWithFallback( const QString& urlSubString ) +{ + QStringList urls; + + QString urlStringWithPrefix = urlSubString.trimmed(); + if ( urlStringWithPrefix.isEmpty() ) return; + if ( urlStringWithPrefix[0] != '/' ) urlStringWithPrefix = '/' + urlStringWithPrefix; + + urls += "https://resinsight.org" + urlStringWithPrefix; + urls += "https://opm.github.io/ResInsight-UserDocumentation" + urlStringWithPrefix; + + openUrlWithFallback( urls ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaNetworkTools::openUrlWithFallback( const QStringList& urlList ) +{ + for ( const auto& url : urlList ) + { + if ( doesResourceExist( url ) ) + { + QDesktopServices::openUrl( QUrl( url ) ); + return; + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaNetworkTools::doesResourceExist( const QString& urlString ) +{ + // Based on https://karanbalkar.com/posts/sending-http-request-using-qt5/ + + // create custom temporary event loop on stack + QEventLoop eventLoop; + + // "quit()" the event-loop, when the network request "finished()" + QNetworkAccessManager mgr; + QObject::connect( &mgr, SIGNAL( finished( QNetworkReply* ) ), &eventLoop, SLOT( quit() ) ); + + // the HTTP request + const QUrl qurl( urlString ); + QNetworkRequest request( qurl ); + QNetworkReply* reply = mgr.get( request ); + eventLoop.exec(); // blocks stack until "finished()" has been called + + auto statusCode = request.attribute( QNetworkRequest::HttpStatusCodeAttribute ).toInt(); + + auto error = reply->error(); + if ( error == QNetworkReply::NoError && statusCode == 200 ) + { + delete reply; + + return true; + } + + delete reply; + + return false; +} diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessmentFeature.h b/ApplicationLibCode/Application/Tools/RiaNetworkTools.h similarity index 72% rename from ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessmentFeature.h rename to ApplicationLibCode/Application/Tools/RiaNetworkTools.h index 68339f0eb1..4f1984e083 100644 --- a/ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessmentFeature.h +++ b/ApplicationLibCode/Application/Tools/RiaNetworkTools.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////////// // -// Copyright (C) 2021 Equinor ASA +// Copyright (C) 2022 Equinor ASA // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -18,17 +18,20 @@ #pragma once -#include "RicRunFaultReactAssessmentFeature.h" +#include //================================================================================================== -/// +// +// +// //================================================================================================== -class RicRunBasicFaultReactAssessmentFeature : public RicRunFaultReactAssessmentFeature +class RiaNetworkTools { - CAF_CMD_HEADER_INIT; +public: + static void openUrl( const QString& urlString ); + static void createAndOpenUrlWithFallback( const QString& urlSubString ); + static void openUrlWithFallback( const QStringList& urlList ); -protected: - bool isCommandEnabled() override; - void onActionTriggered( bool isChecked ) override; - void setupActionLook( QAction* actionToSetup ) override; +private: + static bool doesResourceExist( const QString& urlString ); }; diff --git a/ApplicationLibCode/Application/Tools/RiaNumericalTools.cpp b/ApplicationLibCode/Application/Tools/RiaNumericalTools.cpp new file mode 100644 index 0000000000..a248b0cfad --- /dev/null +++ b/ApplicationLibCode/Application/Tools/RiaNumericalTools.cpp @@ -0,0 +1,95 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022 Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RiaNumericalTools.h" + +#include "cvfMath.h" + +#include +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RiaNumericalTools::roundToClosestPowerOfTenCeil( double value ) +{ + auto exponent = computeTenExponentCeil( value ); + return pow( 10.0, exponent ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RiaNumericalTools::roundToClosestPowerOfTenFloor( double value ) +{ + auto exponent = computeTenExponentFloor( value ); + return pow( 10.0, exponent ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RiaNumericalTools::computeTenExponentCeil( double value ) +{ + if ( value < 0.0 ) return 0.0; + + double logDecValueMax = log10( value ); + logDecValueMax = cvf::Math::ceil( logDecValueMax ); + + return logDecValueMax; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RiaNumericalTools::computeTenExponentFloor( double value ) +{ + if ( value < 0.0 ) return 0.0; + + double logDecValueMin = log10( value ); + logDecValueMin = cvf::Math::floor( logDecValueMin ); + + return logDecValueMin; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RiaNumericalTools::roundToNumSignificantDigits( double value, double numSignificantDigits ) +{ + double absoluteValue = cvf::Math::abs( value ); + if ( absoluteValue == 0.0 ) + { + return 0.0; + } + + double logDecValue = log10( absoluteValue ); + logDecValue = cvf::Math::ceil( logDecValue ); + + double factor = pow( 10.0, numSignificantDigits - logDecValue ); + + double tmp = value * factor; + double integerPart; + double fraction = modf( tmp, &integerPart ); + + if ( cvf::Math::abs( fraction ) >= 0.5 ) ( integerPart >= 0 ) ? integerPart++ : integerPart--; + + double roundedValue = integerPart / factor; + + return roundedValue; +} diff --git a/ApplicationLibCode/FileInterface/RifFaultRAJsonWriter.h b/ApplicationLibCode/Application/Tools/RiaNumericalTools.h similarity index 64% rename from ApplicationLibCode/FileInterface/RifFaultRAJsonWriter.h rename to ApplicationLibCode/Application/Tools/RiaNumericalTools.h index 251b30992c..eb97732b7f 100644 --- a/ApplicationLibCode/FileInterface/RifFaultRAJsonWriter.h +++ b/ApplicationLibCode/Application/Tools/RiaNumericalTools.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////////// // -// Copyright (C) 2021 Equinor ASA +// Copyright (C) 2022 Equinor ASA // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -18,17 +18,13 @@ #pragma once -#include - -class RimFaultRAPreprocSettings; -class RimFaultRAPostprocSettings; - -class RifFaultRAJSonWriter +namespace RiaNumericalTools { -public: - static bool writeToPreprocFile( RimFaultRAPreprocSettings& settings, QString& outErrorText ); - static bool writeToPostprocFile( int faultID, RimFaultRAPostprocSettings* settings, QString& outErrorText ); +double roundToClosestPowerOfTenCeil( double value ); +double roundToClosestPowerOfTenFloor( double value ); +double computeTenExponentCeil( double value ); +double computeTenExponentFloor( double value ); + +double roundToNumSignificantDigits( double value, double numSignificantDigits ); -private: - RifFaultRAJSonWriter(){}; -}; +}; // namespace RiaNumericalTools diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessment3dFeature.cpp b/ApplicationLibCode/Application/Tools/RiaOpenMPTools.cpp similarity index 59% rename from ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessment3dFeature.cpp rename to ApplicationLibCode/Application/Tools/RiaOpenMPTools.cpp index 57746c8893..3f634e975a 100644 --- a/ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessment3dFeature.cpp +++ b/ApplicationLibCode/Application/Tools/RiaOpenMPTools.cpp @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////////// // -// Copyright (C) 2021 Equinor ASA +// Copyright (C) 2022 Equinor ASA // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -16,31 +16,35 @@ // ///////////////////////////////////////////////////////////////////////////////// -#include "RicRunAdvFaultReactAssessment3dFeature.h" +#include "RiaOpenMPTools.h" -#include - -CAF_CMD_SOURCE_INIT( RicRunAdvFaultReactAssessment3dFeature, "RicRunAdvFaultReactAssessment3dFeature" ); +#ifdef USE_OPENMP +#include +#endif //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RicRunAdvFaultReactAssessment3dFeature::onActionTriggered( bool isChecked ) +int RiaOpenMPTools::availableThreadCount() { - QVariant userData = this->userData(); - if ( userData.isNull() || userData.type() != QVariant::String ) return; - - QString faultName = userData.toString(); + int numberOfThreads = 1; +#ifdef USE_OPENMP + numberOfThreads = omp_get_max_threads(); +#endif - int faultID = faultIDFromName( faultName ); - if ( faultID >= 0 ) runAdvancedProcessing( faultID ); + return numberOfThreads; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RicRunAdvFaultReactAssessment3dFeature::setupActionLook( QAction* actionToSetup ) +int RiaOpenMPTools::currentThreadIndex() { - actionToSetup->setIcon( QIcon( ":/fault_react_24x24.png" ) ); - actionToSetup->setText( "Run Advanced Processing" ); + int myThread = 0; + +#ifdef USE_OPENMP + myThread = omp_get_thread_num(); +#endif + + return myThread; } diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessment3dFeature.h b/ApplicationLibCode/Application/Tools/RiaOpenMPTools.h similarity index 73% rename from ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessment3dFeature.h rename to ApplicationLibCode/Application/Tools/RiaOpenMPTools.h index 0004124fbd..cbfc576a64 100644 --- a/ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessment3dFeature.h +++ b/ApplicationLibCode/Application/Tools/RiaOpenMPTools.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////////// // -// Copyright (C) 2021 Equinor ASA +// Copyright (C) 2022 Equinor ASA // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -18,16 +18,13 @@ #pragma once -#include "RicRunBasicFaultReactAssessment3dFeature.h" +#include //================================================================================================== -/// +// //================================================================================================== -class RicRunAdvFaultReactAssessment3dFeature : public RicRunBasicFaultReactAssessment3dFeature +namespace RiaOpenMPTools { - CAF_CMD_HEADER_INIT; - -protected: - void onActionTriggered( bool isChecked ) override; - void setupActionLook( QAction* actionToSetup ) override; -}; +int availableThreadCount(); +int currentThreadIndex(); +}; // namespace RiaOpenMPTools diff --git a/ApplicationLibCode/Application/Tools/RiaRegressionTest.cpp b/ApplicationLibCode/Application/Tools/RiaRegressionTest.cpp index 731e5a85aa..bbcc7992a6 100644 --- a/ApplicationLibCode/Application/Tools/RiaRegressionTest.cpp +++ b/ApplicationLibCode/Application/Tools/RiaRegressionTest.cpp @@ -83,6 +83,9 @@ RiaRegressionTest::RiaRegressionTest() CAF_PDM_InitField( &invalidateExternalFilePaths, "invalidateExternalFilePaths", false, "Invalidate External File Paths" ); CAF_PDM_InitFieldNoDefault( &overridePlotEngine, "forcePlotEngine", "Force Plot Engine" ); + + CAF_PDM_InitField( &exportSnapshots3dViews, "exportSnapshots3dViews", true, "Export Snapshots 3D Views" ); + CAF_PDM_InitField( &exportSnapshotsPlots, "exportSnapshotsPlots", true, "Export Snapshots Plots" ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/Tools/RiaRegressionTest.h b/ApplicationLibCode/Application/Tools/RiaRegressionTest.h index e99b3b0c8a..49e6e2738b 100644 --- a/ApplicationLibCode/Application/Tools/RiaRegressionTest.h +++ b/ApplicationLibCode/Application/Tools/RiaRegressionTest.h @@ -53,6 +53,9 @@ class RiaRegressionTest : public caf::PdmObject caf::PdmField appendTestsAfterTestFilter; caf::PdmField invalidateExternalFilePaths; + caf::PdmField exportSnapshots3dViews; + caf::PdmField exportSnapshotsPlots; + caf::PdmField> overridePlotEngine; protected: diff --git a/ApplicationLibCode/Application/Tools/RiaRegressionTestRunner.cpp b/ApplicationLibCode/Application/Tools/RiaRegressionTestRunner.cpp index c110de405f..9c43fd7d1e 100644 --- a/ApplicationLibCode/Application/Tools/RiaRegressionTestRunner.cpp +++ b/ApplicationLibCode/Application/Tools/RiaRegressionTestRunner.cpp @@ -238,15 +238,22 @@ void RiaRegressionTestRunner::runRegressionTest() // Wait until all command objects have completed app->waitUntilCommandObjectsHasBeenProcessed(); - setDefaultSnapshotSizeFor3dViews(); - QString fullPathGeneratedFolder = testCaseFolder.absoluteFilePath( generatedFolderName ); - RicSnapshotAllViewsToFileFeature::exportSnapshotOfViewsIntoFolder( fullPathGeneratedFolder ); + if ( regressionTestConfig.exportSnapshots3dViews ) + { + setDefaultSnapshotSizeFor3dViews(); - QApplication::processEvents(); - setDefaultSnapshotSizeForPlotWindows(); + RicSnapshotAllViewsToFileFeature::exportSnapshotOfViewsIntoFolder( fullPathGeneratedFolder ); + + QApplication::processEvents(); + } + + if ( regressionTestConfig.exportSnapshotsPlots ) + { + setDefaultSnapshotSizeForPlotWindows(); - RicSnapshotAllPlotsToFileFeature::exportSnapshotOfPlotsIntoFolder( fullPathGeneratedFolder ); + RicSnapshotAllPlotsToFileFeature::exportSnapshotOfPlotsIntoFolder( fullPathGeneratedFolder ); + } uint64_t usedMemoryBeforeClose = caf::MemoryInspector::getApplicationPhysicalMemoryUsageMiB(); @@ -620,7 +627,7 @@ QFileInfoList RiaRegressionTestRunner::subDirectoriesForTestExecution( const QDi { QString trimmed = s.trimmed(); if ( ( m_appendAllTestsAfterLastItemInFilter && anyMatchFound ) || - baseName.contains( trimmed, Qt::CaseInsensitive ) ) + baseName.compare( trimmed, Qt::CaseInsensitive ) == 0 ) { foldersMatchingTestFilter.push_back( fi ); anyMatchFound = true; diff --git a/ApplicationLibCode/Application/Tools/RiaTextFileCompare.cpp b/ApplicationLibCode/Application/Tools/RiaTextFileCompare.cpp index 141af981c7..d19894ce2b 100644 --- a/ApplicationLibCode/Application/Tools/RiaTextFileCompare.cpp +++ b/ApplicationLibCode/Application/Tools/RiaTextFileCompare.cpp @@ -26,6 +26,9 @@ #ifdef _MSC_VER #pragma warning( disable : 4996 ) #endif +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif //-------------------------------------------------------------------------------------------------- /// diff --git a/ApplicationLibCode/Application/Tools/RiaTextStringTools.cpp b/ApplicationLibCode/Application/Tools/RiaTextStringTools.cpp index 9efda3fc7e..7eb365a1a8 100644 --- a/ApplicationLibCode/Application/Tools/RiaTextStringTools.cpp +++ b/ApplicationLibCode/Application/Tools/RiaTextStringTools.cpp @@ -140,6 +140,30 @@ QStringList RiaTextStringTools::splitSkipEmptyParts( const QString& text, const #endif } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaTextStringTools::replaceTemplateTextWithValues( const QString& templateText, + const std::map& valueMap ) +{ + QString resolvedText = templateText; + + // Use a regular expression to find all occurrences of ${key} in the text and replace with the value + + for ( const auto& [key, value] : valueMap ) + { + QString regexString = key; + regexString.replace( "$", "\\$" ); + regexString += "\\b"; + + QRegularExpression rx( regexString ); + + resolvedText.replace( rx, value ); + } + + return resolvedText; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/Tools/RiaTextStringTools.h b/ApplicationLibCode/Application/Tools/RiaTextStringTools.h index 974b4789f6..bd6ddb4a60 100644 --- a/ApplicationLibCode/Application/Tools/RiaTextStringTools.h +++ b/ApplicationLibCode/Application/Tools/RiaTextStringTools.h @@ -19,6 +19,7 @@ #pragma once #include +#include class QStringList; @@ -36,4 +37,6 @@ QString trimNonAlphaNumericCharacters( const QString& s ); QStringList splitSkipEmptyParts( const QString& text, const QString& sep = " " ); QStringList splitSkipEmptyParts( const QString& text, const QRegExp& regExp ); +QString replaceTemplateTextWithValues( const QString& templateText, const std::map& valueMap ); + } // namespace RiaTextStringTools diff --git a/ApplicationLibCode/Application/Tools/WellPathTools/RiaPolyArcLineSampler.cpp b/ApplicationLibCode/Application/Tools/WellPathTools/RiaPolyArcLineSampler.cpp index 81d1566951..34239d735e 100644 --- a/ApplicationLibCode/Application/Tools/WellPathTools/RiaPolyArcLineSampler.cpp +++ b/ApplicationLibCode/Application/Tools/WellPathTools/RiaPolyArcLineSampler.cpp @@ -79,7 +79,7 @@ void RiaPolyArcLineSampler::sampleSegment( cvf::Vec3d t1, cvf::Vec3d p1, cvf::Ve { cvf::Vec3d p1p2 = p2 - p1; - CVF_ASSERT( p1p2.lengthSquared() > 1e-20 ); + if ( p1p2.lengthSquared() < 1e-20 ) return; if ( cvf::GeometryTools::getAngle( t1, p1p2 ) < 1e-5 || p1p2.length() < m_maxSamplingsInterval ) { diff --git a/ApplicationLibCode/Application/Tools/enum_bitmask.hpp b/ApplicationLibCode/Application/Tools/enum_bitmask.hpp new file mode 100644 index 0000000000..dab68f82d5 --- /dev/null +++ b/ApplicationLibCode/Application/Tools/enum_bitmask.hpp @@ -0,0 +1,188 @@ +////////////////////////////////////////////////// +// Taken from +// https://gist.github.com/StrikerX3/46b9058d6c61387b3f361ef9d7e00cd4 +////////////////////////////////////////////////// + +/* +Type-safe enum class bitmasks. +Based on work by Andre Haupt from his blog at +http://blog.bitwigglers.org/using-enum-classes-as-type-safe-bitmasks/ +To enable enum classes to be used as bitmasks, use the ENABLE_BITMASK_OPERATORS +macro: + enum class MyBitmask { + None = 0b0000, + One = 0b0001, + Two = 0b0010, + Three = 0b0100, + }; + ENABLE_BITMASK_OPERATORS(MyBitmask) +From now on, MyBitmask's values can be used with bitwise operators. +You may find it cumbersome to check for the presence or absence of specific +values in enum class bitmasks. For example: + MyBitmask bm = ...; + MyBitmask oneAndThree = (MyBitmask::One | MyBitmask::Three); + // Check if either bit one or three is set + if (bm & oneAndThree != MyBitmask::None) { + ... + } + // Check if both bits one and three are set + if (bm & oneAndThree == oneAndThree) { + ... + } +To help with that, you can wrap the bitmask into the BitmaskEnum type, which +provides a set of bitmask checks and useful conversions: + MyBitmask bm = ...; + MyBitmask oneAndThree = (MyBitmask::One | MyBitmask::Three); + auto wbm = BitmaskEnum(bm); + // Check if either bit one or three is set + if (bm.AnyOf(oneAndThree)) { + ... + } + // Check if both bits one and three are set + if (bm.AllOf(oneAndThree)) { + ... + } + // Check if any bit is set + if (bm) { + ... + } + // Convert back to the enum class + MyBitmask backToEnum = wbm; +------------------------------------------------------------------------------- +MIT License +Copyright (c) 2019 Ivan Roberto de Oliveira +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. +*/ +#pragma once + +#include + +#define ENABLE_BITMASK_OPERATORS( x ) \ + template <> \ + struct is_bitmask_enum \ + { \ + static const bool enable = true; \ + }; + +template +struct is_bitmask_enum +{ + static const bool enable = false; +}; + +template +inline constexpr bool is_bitmask_enum_v = is_bitmask_enum::enable; + +// ----- Bitwise operators ---------------------------------------------------- + +template +typename std::enable_if_t, Enum> operator|( Enum lhs, Enum rhs ) +{ + using underlying = typename std::underlying_type_t; + return static_cast( static_cast( lhs ) | static_cast( rhs ) ); +} + +template +typename std::enable_if_t, Enum> operator&( Enum lhs, Enum rhs ) +{ + using underlying = typename std::underlying_type_t; + return static_cast( static_cast( lhs ) & static_cast( rhs ) ); +} + +template +typename std::enable_if_t, Enum> operator^( Enum lhs, Enum rhs ) +{ + using underlying = typename std::underlying_type_t; + return static_cast( static_cast( lhs ) ^ static_cast( rhs ) ); +} + +template +typename std::enable_if_t, Enum> operator~( Enum rhs ) +{ + using underlying = typename std::underlying_type_t; + return static_cast( ~static_cast( rhs ) ); +} + +// ----- Bitwise assignment operators ----------------------------------------- + +template +typename std::enable_if_t, Enum> operator|=( Enum& lhs, Enum rhs ) +{ + using underlying = typename std::underlying_type_t; + lhs = static_cast( static_cast( lhs ) | static_cast( rhs ) ); + return lhs; +} + +template +typename std::enable_if_t, Enum> operator&=( Enum& lhs, Enum rhs ) +{ + using underlying = typename std::underlying_type_t; + lhs = static_cast( static_cast( lhs ) & static_cast( rhs ) ); + return lhs; +} + +template +typename std::enable_if_t, Enum> operator^=( Enum& lhs, Enum rhs ) +{ + using underlying = typename std::underlying_type_t; + lhs = static_cast( static_cast( lhs ) ^ static_cast( rhs ) ); + return lhs; +} + +// ----- Bitwise mask checks -------------------------------------------------- + +template +struct BitmaskEnum +{ + const Enum value; + static const Enum none = static_cast( 0 ); + + using underlying = typename std::underlying_type_t; + + BitmaskEnum( Enum value ) + : value( value ) + { + static_assert( is_bitmask_enum_v ); + } + + // Convert back to enum if required + inline operator Enum() const { return value; } + + // Convert to true if there is any bit set in the bitmask + inline operator bool() const { return Any(); } + + // Returns true if any bit is set + inline bool Any() const { return value != none; } + + // Returns true if all bits are clear + inline bool None() const { return value == none; } + + // Returns true if any bit in the given mask is set + inline bool AnyOf( const Enum& mask ) const { return ( value & mask ) != none; } + + // Returns true if all bits in the given mask are set + inline bool AllOf( const Enum& mask ) const { return ( value & mask ) == mask; } + + // Returns true if none of the bits in the given mask are set + inline bool NoneOf( const Enum& mask ) const { return ( value & mask ) == none; } + + // Returns true if any bits excluding the mask are set + inline bool AnyExcept( const Enum& mask ) const { return ( value & ~mask ) != none; } + + // Returns true if no bits excluding the mask are set + inline bool NoneExcept( const Enum& mask ) const { return ( value & ~mask ) == none; } +}; diff --git a/ApplicationLibCode/CMakeLists.txt b/ApplicationLibCode/CMakeLists.txt index 7623a3eb23..6dc994d5f0 100644 --- a/ApplicationLibCode/CMakeLists.txt +++ b/ApplicationLibCode/CMakeLists.txt @@ -34,7 +34,6 @@ if(Qt5Core_FOUND) Gui OpenGL Network - Script Widgets Xml Concurrent @@ -47,7 +46,6 @@ if(Qt5Core_FOUND) Qt5::Gui Qt5::Network Qt5::OpenGL - Qt5::Script Qt5::Widgets Qt5::Xml Qt5::Concurrent @@ -192,6 +190,7 @@ list( ProjectDataModel/WellLog/CMakeLists_files.cmake ProjectDataModel/WellMeasurement/CMakeLists_files.cmake ProjectDataModel/WellPath/CMakeLists_files.cmake + ProjectDataModel/Tools/CMakeLists_files.cmake ProjectDataModelCommands/CMakeLists_files.cmake ProjectDataModelCommands/CommandRouter/CMakeLists_files.cmake GeoMech/GeoMechVisualization/CMakeLists_files.cmake diff --git a/ApplicationLibCode/Commands/ApplicationCommands/RicShowPlotDataFeature.cpp b/ApplicationLibCode/Commands/ApplicationCommands/RicShowPlotDataFeature.cpp index 4c70fd8d58..c01c015247 100644 --- a/ApplicationLibCode/Commands/ApplicationCommands/RicShowPlotDataFeature.cpp +++ b/ApplicationLibCode/Commands/ApplicationCommands/RicShowPlotDataFeature.cpp @@ -25,12 +25,13 @@ #include "RimGridCrossPlot.h" #include "RimGridCrossPlotCurve.h" -#include "RimPlot.h" +#include "RimPlotWindow.h" #include "RimProject.h" #include "RimSummaryCrossPlot.h" #include "RimSummaryPlot.h" #include "RimVfpPlot.h" #include "RimWellLogPlot.h" +#include "RimWellLogTrack.h" #include "RiuPlotMainWindow.h" #include "RiuTextDialog.h" @@ -174,7 +175,7 @@ bool RicShowPlotDataFeature::isCommandEnabled() return true; } - std::vector selection; + std::vector selection; getSelection( selection ); int validPlots = 0; @@ -186,9 +187,9 @@ bool RicShowPlotDataFeature::isCommandEnabled() return false; } - if ( dynamic_cast( plot ) != nullptr || - ( dynamic_cast( plot ) != nullptr || dynamic_cast( plot ) != nullptr || - dynamic_cast( plot ) != nullptr ) ) + if ( dynamic_cast( plot ) || dynamic_cast( plot ) || + dynamic_cast( plot ) || dynamic_cast( plot ) || + dynamic_cast( plot ) ) { validPlots++; } @@ -217,55 +218,48 @@ void RicShowPlotDataFeature::onActionTriggered( bool isChecked ) this->disableModelChangeContribution(); - std::vector selection; + std::vector selection; getSelection( selection ); std::vector selectedSummaryPlots; std::vector wellLogPlots; std::vector crossPlots; std::vector vfpPlots; + std::vector depthTracks; for ( auto plot : selection ) { - auto sumPlot = dynamic_cast( plot ); - if ( sumPlot ) + if ( auto sumPlot = dynamic_cast( plot ) ) { selectedSummaryPlots.push_back( sumPlot ); continue; } - auto wellPlot = dynamic_cast( plot ); - if ( wellPlot ) + if ( auto wellPlot = dynamic_cast( plot ) ) { wellLogPlots.push_back( wellPlot ); continue; } - auto xPlot = dynamic_cast( plot ); - if ( xPlot ) + if ( auto xPlot = dynamic_cast( plot ) ) { crossPlots.push_back( xPlot ); continue; } - auto vfpPlot = dynamic_cast( plot ); - if ( vfpPlot ) + if ( auto vfpPlot = dynamic_cast( plot ) ) { vfpPlots.push_back( vfpPlot ); continue; } - } - - if ( selectedSummaryPlots.empty() && wellLogPlots.empty() && crossPlots.empty() && vfpPlots.empty() ) - { - CVF_ASSERT( false ); - return; + if ( auto depthTrack = dynamic_cast( plot ) ) + { + depthTracks.push_back( depthTrack ); + continue; + } } - RiuPlotMainWindow* plotwindow = RiaGuiApplication::instance()->mainPlotWindow(); - CVF_ASSERT( plotwindow ); - for ( RimSummaryPlot* summaryPlot : selectedSummaryPlots ) { auto textProvider = new RiuTabbedSummaryPlotTextProvider( summaryPlot ); @@ -279,6 +273,13 @@ void RicShowPlotDataFeature::onActionTriggered( bool isChecked ) RicShowPlotDataFeature::showTextWindow( title, text ); } + for ( auto* plot : depthTracks ) + { + QString title = plot->description(); + QString text = plot->asciiDataForPlotExport(); + RicShowPlotDataFeature::showTextWindow( title, text ); + } + for ( RimVfpPlot* vfpPlot : vfpPlots ) { QString title = vfpPlot->description(); @@ -339,7 +340,7 @@ void RicShowPlotDataFeature::showTextWindow( const QString& title, const QString //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RicShowPlotDataFeature::getSelection( std::vector& selection ) +void RicShowPlotDataFeature::getSelection( std::vector& selection ) { if ( sender() ) { diff --git a/ApplicationLibCode/Commands/ApplicationCommands/RicShowPlotDataFeature.h b/ApplicationLibCode/Commands/ApplicationCommands/RicShowPlotDataFeature.h index a16effac74..f3ff0837fc 100644 --- a/ApplicationLibCode/Commands/ApplicationCommands/RicShowPlotDataFeature.h +++ b/ApplicationLibCode/Commands/ApplicationCommands/RicShowPlotDataFeature.h @@ -20,11 +20,10 @@ #include "cafCmdFeature.h" -#include #include class RiuTabbedTextProvider; -class RimPlot; +class RimPlotWindow; //================================================================================================== /// @@ -39,7 +38,7 @@ class RicShowPlotDataFeature : public caf::CmdFeature void setupActionLook( QAction* actionToSetup ) override; private: - void getSelection( std::vector& selection ); + void getSelection( std::vector& selection ); public: static void showTabbedTextWindow( RiuTabbedTextProvider* textProvider ); diff --git a/ApplicationLibCode/Commands/ApplicationCommands/RicTileWindowsFeature.cpp b/ApplicationLibCode/Commands/ApplicationCommands/RicTileWindowsFeature.cpp index 6c446f642b..fdf87cabd3 100644 --- a/ApplicationLibCode/Commands/ApplicationCommands/RicTileWindowsFeature.cpp +++ b/ApplicationLibCode/Commands/ApplicationCommands/RicTileWindowsFeature.cpp @@ -20,7 +20,11 @@ #include "RicTileWindowsFeature.h" #include "RiaGuiApplication.h" + +#include "RimProject.h" + #include "RiuMainWindow.h" +#include "RiuMdiArea.h" #include "RiuPlotMainWindow.h" #include @@ -28,12 +32,33 @@ CAF_CMD_SOURCE_INIT( RicTileWindowsFeature, "RicTileWindowsFeature" ); +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicTileWindowsFeature::applyTiling( RiuMainWindow* mainWindow, RiaDefines::WindowTileMode requestedTileMode ) +{ + auto mode = requestedTileMode; + + if ( auto proj = RimProject::current() ) + { + // If requested mode is set, reset tiling mode to undefined + if ( proj->subWindowsTileMode3DWindow() == requestedTileMode ) mode = RiaDefines::WindowTileMode::UNDEFINED; + + proj->setSubWindowsTileMode3DWindow( mode ); + } + + if ( mainWindow ) + { + mainWindow->mdiArea()->applyTiling(); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool RicTileWindowsFeature::isCommandEnabled() { - RiuMainWindow* mainWindow = RiuMainWindow::instance(); + auto* mainWindow = RiuMainWindow::instance(); if ( mainWindow ) { return mainWindow->isAnyMdiSubWindowVisible(); @@ -49,18 +74,8 @@ void RicTileWindowsFeature::onActionTriggered( bool isChecked ) { this->disableModelChangeContribution(); - RiuMainWindow* mainWindow = RiuMainWindow::instance(); - if ( mainWindow ) - { - if ( !mainWindow->subWindowsAreTiled() ) - { - mainWindow->tileSubWindows(); - } - else - { - mainWindow->clearWindowTiling(); - } - } + auto* mainWindow = RiuMainWindow::instance(); + applyTiling( mainWindow, RiaDefines::WindowTileMode::DEFAULT ); } //-------------------------------------------------------------------------------------------------- @@ -78,15 +93,34 @@ void RicTileWindowsFeature::setupActionLook( QAction* actionToSetup ) //-------------------------------------------------------------------------------------------------- bool RicTileWindowsFeature::isCommandChecked() { - if ( RiaGuiApplication::instance()->mainWindow() ) - { - return RiaGuiApplication::instance()->mainWindow()->subWindowsAreTiled(); - } - return false; + auto proj = RimProject::current(); + + return proj ? ( proj->subWindowsTileMode3DWindow() == RiaDefines::WindowTileMode::DEFAULT ) : false; } CAF_CMD_SOURCE_INIT( RicTilePlotWindowsFeature, "RicTilePlotWindowsFeature" ); +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicTilePlotWindowsFeature::applyTiling( RiuPlotMainWindow* mainWindow, RiaDefines::WindowTileMode requestedTileMode ) +{ + auto mode = requestedTileMode; + + if ( auto proj = RimProject::current() ) + { + // If requested mode is set, reset tiling mode to undefined + if ( proj->subWindowsTileModePlotWindow() == requestedTileMode ) mode = RiaDefines::WindowTileMode::UNDEFINED; + + proj->setSubWindowsTileModePlotWindow( mode ); + } + + if ( mainWindow ) + { + mainWindow->mdiArea()->applyTiling(); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -106,18 +140,10 @@ bool RicTilePlotWindowsFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicTilePlotWindowsFeature::onActionTriggered( bool isChecked ) { - RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); - if ( mainPlotWindow ) - { - if ( !mainPlotWindow->subWindowsAreTiled() ) - { - mainPlotWindow->tileSubWindows(); - } - else - { - mainPlotWindow->clearWindowTiling(); - } - } + this->disableModelChangeContribution(); + + auto* mainWindow = RiuPlotMainWindow::instance(); + RicTilePlotWindowsFeature::applyTiling( mainWindow, RiaDefines::WindowTileMode::DEFAULT ); } //-------------------------------------------------------------------------------------------------- @@ -135,9 +161,197 @@ void RicTilePlotWindowsFeature::setupActionLook( QAction* actionToSetup ) //-------------------------------------------------------------------------------------------------- bool RicTilePlotWindowsFeature::isCommandChecked() { - if ( RiaGuiApplication::instance()->mainPlotWindow() ) + auto proj = RimProject::current(); + + return proj ? ( proj->subWindowsTileModePlotWindow() == RiaDefines::WindowTileMode::DEFAULT ) : false; +} + +CAF_CMD_SOURCE_INIT( RicTileWindowsVerticallyFeature, "RicTileWindowsVerticallyFeature" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicTileWindowsVerticallyFeature::isCommandEnabled() +{ + RiuMainWindow* mainWindow = RiuMainWindow::instance(); + if ( mainWindow ) + { + return mainWindow->isAnyMdiSubWindowVisible(); + } + + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicTileWindowsVerticallyFeature::onActionTriggered( bool isChecked ) +{ + this->disableModelChangeContribution(); + + auto* mainWindow = RiuMainWindow::instance(); + RicTileWindowsFeature::applyTiling( mainWindow, RiaDefines::WindowTileMode::VERTICAL ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicTileWindowsVerticallyFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setText( "Tile Windows Vertically" ); + actionToSetup->setIcon( QIcon( ":/TileWindows.svg" ) ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicTileWindowsVerticallyFeature::isCommandChecked() +{ + auto proj = RimProject::current(); + + return proj ? ( proj->subWindowsTileMode3DWindow() == RiaDefines::WindowTileMode::VERTICAL ) : false; +} + +CAF_CMD_SOURCE_INIT( RicTileWindowsHorizontallyFeature, "RicTileWindowsHorizontallyFeature" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicTileWindowsHorizontallyFeature::isCommandEnabled() +{ + RiuMainWindow* mainWindow = RiuMainWindow::instance(); + if ( mainWindow ) + { + return mainWindow->isAnyMdiSubWindowVisible(); + } + + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicTileWindowsHorizontallyFeature::onActionTriggered( bool isChecked ) +{ + this->disableModelChangeContribution(); + + auto* mainWindow = RiuMainWindow::instance(); + RicTileWindowsFeature::applyTiling( mainWindow, RiaDefines::WindowTileMode::HORIZONTAL ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicTileWindowsHorizontallyFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setText( "Tile Windows Horizontally" ); + actionToSetup->setIcon( QIcon( ":/TileWindows.svg" ) ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicTileWindowsHorizontallyFeature::isCommandChecked() +{ + auto proj = RimProject::current(); + + return proj ? ( proj->subWindowsTileMode3DWindow() == RiaDefines::WindowTileMode::HORIZONTAL ) : false; +} + +//-------------------------------------------------------------------------------------------------- +/// +/// Main Plot window features +/// +//-------------------------------------------------------------------------------------------------- + +CAF_CMD_SOURCE_INIT( RicTilePlotWindowsVerticallyFeature, "RicTilePlotWindowsVerticallyFeature" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicTilePlotWindowsVerticallyFeature::isCommandEnabled() +{ + auto* mainWindow = RiuPlotMainWindow::instance(); + if ( mainWindow ) { - return RiaGuiApplication::instance()->mainPlotWindow()->subWindowsAreTiled(); + return mainWindow->isAnyMdiSubWindowVisible(); } + return false; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicTilePlotWindowsVerticallyFeature::onActionTriggered( bool isChecked ) +{ + this->disableModelChangeContribution(); + + auto* mainWindow = RiuPlotMainWindow::instance(); + RicTilePlotWindowsFeature::applyTiling( mainWindow, RiaDefines::WindowTileMode::VERTICAL ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicTilePlotWindowsVerticallyFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setText( "Tile Windows Vertically" ); + actionToSetup->setIcon( QIcon( ":/TileWindows.svg" ) ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicTilePlotWindowsVerticallyFeature::isCommandChecked() +{ + auto proj = RimProject::current(); + + return proj ? ( proj->subWindowsTileModePlotWindow() == RiaDefines::WindowTileMode::VERTICAL ) : false; +} + +CAF_CMD_SOURCE_INIT( RicTilePlotWindowsHorizontallyFeature, "RicTilePlotWindowsHorizontallyFeature" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicTilePlotWindowsHorizontallyFeature::isCommandEnabled() +{ + auto* mainWindow = RiuPlotMainWindow::instance(); + if ( mainWindow ) + { + return mainWindow->isAnyMdiSubWindowVisible(); + } + + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicTilePlotWindowsHorizontallyFeature::onActionTriggered( bool isChecked ) +{ + this->disableModelChangeContribution(); + + auto* mainWindow = RiuPlotMainWindow::instance(); + RicTilePlotWindowsFeature::applyTiling( mainWindow, RiaDefines::WindowTileMode::HORIZONTAL ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicTilePlotWindowsHorizontallyFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setText( "Tile Windows Horizontally" ); + actionToSetup->setIcon( QIcon( ":/TileWindows.svg" ) ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicTilePlotWindowsHorizontallyFeature::isCommandChecked() +{ + auto proj = RimProject::current(); + + return proj ? ( proj->subWindowsTileModePlotWindow() == RiaDefines::WindowTileMode::HORIZONTAL ) : false; +} diff --git a/ApplicationLibCode/Commands/ApplicationCommands/RicTileWindowsFeature.h b/ApplicationLibCode/Commands/ApplicationCommands/RicTileWindowsFeature.h index 7218340699..83732d3efe 100644 --- a/ApplicationLibCode/Commands/ApplicationCommands/RicTileWindowsFeature.h +++ b/ApplicationLibCode/Commands/ApplicationCommands/RicTileWindowsFeature.h @@ -19,8 +19,13 @@ #pragma once +#include "RiaPlotDefines.h" + #include "cafCmdFeature.h" +class RiuMainWindow; +class RiuPlotMainWindow; + //================================================================================================== /// //================================================================================================== @@ -28,6 +33,37 @@ class RicTileWindowsFeature : public caf::CmdFeature { CAF_CMD_HEADER_INIT; +public: + static void applyTiling( RiuMainWindow* mainWindow, RiaDefines::WindowTileMode requestedTileMode ); + +protected: + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; + bool isCommandChecked() override; +}; + +//================================================================================================== +/// +//================================================================================================== +class RicTileWindowsVerticallyFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +protected: + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; + bool isCommandChecked() override; +}; + +//================================================================================================== +/// +//================================================================================================== +class RicTileWindowsHorizontallyFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + protected: bool isCommandEnabled() override; void onActionTriggered( bool isChecked ) override; @@ -42,6 +78,37 @@ class RicTilePlotWindowsFeature : public caf::CmdFeature { CAF_CMD_HEADER_INIT; +public: + static void applyTiling( RiuPlotMainWindow* mainWindow, RiaDefines::WindowTileMode requestedTileMode ); + +protected: + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; + bool isCommandChecked() override; +}; + +//================================================================================================== +/// +//================================================================================================== +class RicTilePlotWindowsVerticallyFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +protected: + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; + bool isCommandChecked() override; +}; + +//================================================================================================== +/// +//================================================================================================== +class RicTilePlotWindowsHorizontallyFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + protected: bool isCommandEnabled() override; void onActionTriggered( bool isChecked ) override; diff --git a/ApplicationLibCode/Commands/CompletionCommands/RicNewPerforationIntervalAtMeasuredDepthFeature.cpp b/ApplicationLibCode/Commands/CompletionCommands/RicNewPerforationIntervalAtMeasuredDepthFeature.cpp index 7aab47c225..bdf4347019 100644 --- a/ApplicationLibCode/Commands/CompletionCommands/RicNewPerforationIntervalAtMeasuredDepthFeature.cpp +++ b/ApplicationLibCode/Commands/CompletionCommands/RicNewPerforationIntervalAtMeasuredDepthFeature.cpp @@ -52,6 +52,7 @@ void RicNewPerforationIntervalAtMeasuredDepthFeature::onActionTriggered( bool is RimPerforationInterval* perforationInterval = new RimPerforationInterval; double measuredDepth = wellPathSelItem->m_measuredDepth; perforationInterval->setStartAndEndMD( measuredDepth, measuredDepth + 50 ); + perforationInterval->setUnitSystemSpecificDefaults(); wellPath->perforationIntervalCollection()->appendPerforation( perforationInterval ); diff --git a/ApplicationLibCode/Commands/CompletionCommands/RicNewPerforationIntervalFeature.cpp b/ApplicationLibCode/Commands/CompletionCommands/RicNewPerforationIntervalFeature.cpp index df5cf6f69a..af33c59c74 100644 --- a/ApplicationLibCode/Commands/CompletionCommands/RicNewPerforationIntervalFeature.cpp +++ b/ApplicationLibCode/Commands/CompletionCommands/RicNewPerforationIntervalFeature.cpp @@ -57,6 +57,7 @@ void RicNewPerforationIntervalFeature::onActionTriggered( bool isChecked ) RimPerforationInterval* perforationInterval = new RimPerforationInterval; perforationInterval->setStartAndEndMD( wellPath->uniqueStartMD(), wellPath->uniqueEndMD() ); + perforationInterval->setUnitSystemSpecificDefaults(); perforationCollection->appendPerforation( perforationInterval ); diff --git a/ApplicationLibCode/Commands/CompletionCommands/RicNewStimPlanModelPlotFeature.cpp b/ApplicationLibCode/Commands/CompletionCommands/RicNewStimPlanModelPlotFeature.cpp index 6674d07271..5bbe4fedb3 100644 --- a/ApplicationLibCode/Commands/CompletionCommands/RicNewStimPlanModelPlotFeature.cpp +++ b/ApplicationLibCode/Commands/CompletionCommands/RicNewStimPlanModelPlotFeature.cpp @@ -42,6 +42,7 @@ #include "RimStimPlanModelPlot.h" #include "RimStimPlanModelPlotCollection.h" #include "RimStimPlanModelTemplate.h" +#include "RimWellLogPlotNameConfig.h" #include "RimWellLogTrack.h" #include "RimWellPath.h" #include "RimWellPathCollection.h" @@ -166,7 +167,6 @@ RimStimPlanModelPlot* RicNewStimPlanModelPlotFeature::createPlot( RimStimPlanMod { auto task = progInfo.task( "Updating all tracks", 5 ); - plot->nameConfig()->setAutoNameTags( false, false, false, false, false ); plot->setPlotTitleVisible( true ); plot->setLegendsVisible( true ); plot->setLegendsHorizontal( false ); @@ -445,6 +445,7 @@ RimStimPlanModelPlot* RicNewStimPlanModelPlotFeature::createStimPlanModelPlot( b stimPlanModelPlotColl->addStimPlanModelPlot( plot ); + plot->setNamingMethod( RiaDefines::ObjectNamingMethod::CUSTOM ); if ( !plotDescription.isEmpty() ) { plot->nameConfig()->setCustomName( plotDescription ); @@ -455,6 +456,8 @@ RimStimPlanModelPlot* RicNewStimPlanModelPlotFeature::createStimPlanModelPlot( b QString( "StimPlan Model Plot %1" ).arg( stimPlanModelPlotCollection()->stimPlanModelPlots().size() ) ); } + stimPlanModelPlotColl->updateAllRequiredEditors(); + if ( showAfterCreation ) { RiaGuiApplication::instance()->getOrCreateAndShowMainPlotWindow(); diff --git a/ApplicationLibCode/Commands/CompletionExportCommands/RicExportCompletionsForVisibleWellPathsFeature.cpp b/ApplicationLibCode/Commands/CompletionExportCommands/RicExportCompletionsForVisibleWellPathsFeature.cpp index ff62139cf6..93fc9cea3d 100644 --- a/ApplicationLibCode/Commands/CompletionExportCommands/RicExportCompletionsForVisibleWellPathsFeature.cpp +++ b/ApplicationLibCode/Commands/CompletionExportCommands/RicExportCompletionsForVisibleWellPathsFeature.cpp @@ -18,15 +18,17 @@ #include "RicExportCompletionsForVisibleWellPathsFeature.h" -#include "RicWellPathExportCompletionDataFeature.h" +#include "RiaLogging.h" -#include "RiuPlotMainWindow.h" +#include "RicWellPathExportCompletionDataFeature.h" #include "RimProject.h" #include "RimWellMeasurementCollection.h" #include "RimWellPath.h" #include "RimWellPathCollection.h" +#include "RiuPlotMainWindow.h" + #include "cafSelectionManager.h" #include @@ -74,7 +76,7 @@ bool RicExportCompletionsForVisibleWellPathsFeature::isCommandEnabled() void RicExportCompletionsForVisibleWellPathsFeature::onActionTriggered( bool isChecked ) { std::vector wellPaths = visibleWellPaths(); - CVF_ASSERT( wellPaths.size() > 0 ); + if ( wellPaths.empty() ) return RiaLogging::warning( "No visible well paths found, no data exported." ); std::vector simWells; QString dialogTitle = "Export Completion Data for Visible Well Paths"; diff --git a/ApplicationLibCode/Commands/CompletionExportCommands/RicExportFractureCompletionsImpl.cpp b/ApplicationLibCode/Commands/CompletionExportCommands/RicExportFractureCompletionsImpl.cpp index 235c0b0d8a..2785acf7fd 100644 --- a/ApplicationLibCode/Commands/CompletionExportCommands/RicExportFractureCompletionsImpl.cpp +++ b/ApplicationLibCode/Commands/CompletionExportCommands/RicExportFractureCompletionsImpl.cpp @@ -46,6 +46,7 @@ #include "RifEclipseSummaryAddress.h" #include "RifSummaryReaderInterface.h" + #include "RigCaseCellResultsData.h" #include "RigEclipseCaseData.h" #include "RigEclipseToStimPlanCalculator.h" @@ -62,6 +63,9 @@ #include "RigWellPath.h" #include "RigWellPathStimplanIntersector.h" +#include "cvfGeometryTools.h" +#include "cvfPlane.h" + #include //-------------------------------------------------------------------------------------------------- @@ -516,7 +520,7 @@ void RicExportFractureCompletionsImpl::getWellPressuresAndInitialProductionTimeS bool RicExportFractureCompletionsImpl::checkForStimPlanConductivity( const RimFractureTemplate* fracTemplate, const RimFracture* fracture ) { - auto fracTemplateStimPlan = dynamic_cast( fracTemplate ); + auto fracTemplateStimPlan = dynamic_cast( fracTemplate ); if ( fracTemplateStimPlan ) { if ( !fracTemplateStimPlan->hasConductivity() ) @@ -607,11 +611,13 @@ void RicExportFractureCompletionsImpl::calculateFractureToWellTransmissibilities gsl::not_null wellPathGeometry, RigTransmissibilityCondenser& transCondenser ) { - //// - // If fracture has orientation Azimuth or Transverse, assume only radial inflow + // If fracture has orientation Azimuth (without user-defined perforation length) or Transverse, + // assume only radial inflow + bool useRadialInflow = ( fracTemplate->orientationType() == RimFractureTemplate::AZIMUTH && + !fracTemplate->useUserDefinedPerforationLength() ) || + fracTemplate->orientationType() == RimFractureTemplate::TRANSVERSE_WELL_PATH; - if ( fracTemplate->orientationType() == RimFractureTemplate::AZIMUTH || - fracTemplate->orientationType() == RimFractureTemplate::TRANSVERSE_WELL_PATH ) + if ( useRadialInflow ) { std::pair wellCellIJ = fractureGrid->fractureCellAtWellCenter(); size_t wellCellIndex = fractureGrid->getGlobalIndexFromIJ( wellCellIJ.first, wellCellIJ.second ); @@ -630,12 +636,27 @@ void RicExportFractureCompletionsImpl::calculateFractureToWellTransmissibilities { false, RigTransmissibilityCondenser::CellAddress::STIMPLAN, wellCellIndex }, radialTrans ); } - else if ( fracTemplate->orientationType() == RimFractureTemplate::ALONG_WELL_PATH ) + else { - //// - // If fracture has orientation along well, linear inflow along well and radial flow at endpoints + std::vector wellPathPoints; - RigWellPathStimplanIntersector wellFractureIntersector( wellPathGeometry, fracture ); + if ( fracTemplate->orientationType() == RimFractureTemplate::ALONG_WELL_PATH ) + { + // If fracture has orientation along well, linear inflow along well and radial flow at endpoints + wellPathPoints = + wellPathGeometry->wellPathPointsIncludingInterpolatedIntersectionPoint( fracture->fractureMD() ); + } + else + { + // If fracture has azimuth orientation with user-defined perforation length use linear inflow along + // well and radial flow at endpoints on a well path which is rotated into the fracture plane. + CAF_ASSERT( fracTemplate->orientationType() == RimFractureTemplate::AZIMUTH ); + CAF_ASSERT( fracTemplate->useUserDefinedPerforationLength() ); + + wellPathPoints = computeWellPointsInFracturePlane( fracture, wellPathGeometry ); + } + + RigWellPathStimplanIntersector wellFractureIntersector( wellPathPoints, fracture ); const std::map& fractureWellCells = wellFractureIntersector.intersections(); @@ -671,6 +692,87 @@ void RicExportFractureCompletionsImpl::calculateFractureToWellTransmissibilities } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector + RicExportFractureCompletionsImpl::computeWellPointsInFracturePlane( gsl::not_null fracture, + gsl::not_null wellPathGeometry ) + +{ + std::vector wellPathPoints = + wellPathGeometry->wellPathPointsIncludingInterpolatedIntersectionPoint( fracture->fractureMD() ); + + RiaLogging::info( "Using user-defined perforation length on azimuth fracture." ); + RiaLogging::info( QString( "Perforation length: %1" ).arg( fracture->perforationLength() ) ); + double startMd = fracture->fractureMD() - fracture->perforationLength() / 2.0; + double endMd = fracture->fractureMD() + fracture->perforationLength() / 2.0; + + cvf::Vec3d anchorPosition = wellPathGeometry->interpolatedPointAlongWellPath( fracture->fractureMD() ); + + auto coordsAndMd = wellPathGeometry->clippedPointSubset( startMd, endMd ); + + auto wellPathCoords = coordsAndMd.first; + cvf::Vec3d startPos = wellPathCoords.front(); + cvf::Vec3d endPos = wellPathCoords.back(); + + cvf::Vec3d wellPathTangent = endPos - startPos; + + cvf::Plane fracturePlane; + auto fractureTransform = fracture->transformMatrix(); + fracturePlane.setFromPointAndNormal( fractureTransform.translation(), + static_cast( fractureTransform.col( 2 ) ) ); + + // Get the direction from the start position to the fracture plane + cvf::Vec3d startPosInFracturePlane = fracturePlane.projectPoint( startPos ); + cvf::Vec3d directionToStartPosInFracturePlane = ( startPosInFracturePlane - anchorPosition ).getNormalized(); + cvf::Vec3d directionToStartPos = ( startPos - anchorPosition ).getNormalized(); + + auto vecToString = []( const cvf::Vec3d& vec ) { + return QString( "[%1 %2 %3]" ).arg( vec.x() ).arg( vec.y() ).arg( vec.z() ); + }; + + RiaLogging::info( QString( "Start perforation position: %1" ).arg( vecToString( startPos ) ) ); + RiaLogging::info( + QString( "Start perforation position in fracture plane: %1" ).arg( vecToString( startPosInFracturePlane ) ) ); + RiaLogging::info( QString( "Anchor pos: %1" ).arg( vecToString( anchorPosition ) ) ); + RiaLogging::info( + QString( "Direction anchor to start position in plane: %1" ).arg( vecToString( directionToStartPosInFracturePlane ) ) ); + RiaLogging::info( + QString( "Direction anchor to original start position: %1" ).arg( vecToString( directionToStartPos ) ) ); + + // Find the angle between the real direction (tangential to well path) and the fracture plane + double angle = cvf::GeometryTools::getAngle( directionToStartPosInFracturePlane, directionToStartPos ); + RiaLogging::info( QString( "Angle: %1 degrees." ).arg( cvf::Math::toDegrees( angle ) ) ); + auto rotMat = + cvf::GeometryTools::rotationMatrixBetweenVectors( directionToStartPos, directionToStartPosInFracturePlane ); + + auto rotatePoint = []( const cvf::Vec3d& point, const cvf::Vec3d& offset, auto rotMat ) { + cvf::Vec3d p = point - offset; + p.transformPoint( rotMat ); + p += offset; + return p; + }; + + // Rotate the well path points into the plane + for ( auto& r : wellPathPoints ) + { + r = rotatePoint( r, anchorPosition, rotMat ); + } + + cvf::Vec3d transformedStartPos = rotatePoint( startPos, anchorPosition, rotMat ); + RiaLogging::info( QString( "Perforation start position: original: %1 --> adapted: %2" ) + .arg( vecToString( startPos ) ) + .arg( vecToString( transformedStartPos ) ) ); + + cvf::Vec3d transformedEndPos = rotatePoint( endPos, anchorPosition, rotMat ); + RiaLogging::info( QString( "Perforation end position: original: %1 --> adapted: %2" ) + .arg( vecToString( endPos ) ) + .arg( vecToString( transformedEndPos ) ) ); + + return wellPathPoints; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/CompletionExportCommands/RicExportFractureCompletionsImpl.h b/ApplicationLibCode/Commands/CompletionExportCommands/RicExportFractureCompletionsImpl.h index 85433bdf33..19a0ea4204 100644 --- a/ApplicationLibCode/Commands/CompletionExportCommands/RicExportFractureCompletionsImpl.h +++ b/ApplicationLibCode/Commands/CompletionExportCommands/RicExportFractureCompletionsImpl.h @@ -20,6 +20,8 @@ #include "RigCompletionData.h" +#include "cvfVector3.h" + #include #include @@ -151,5 +153,8 @@ class RicExportFractureCompletionsImpl const RigMainGrid* mainGrid, const RigFractureGrid* fractureGrid ); + static std::vector computeWellPointsInFracturePlane( gsl::not_null fracture, + gsl::not_null wellPathGeometry ); + static bool loadResultsByName( RigCaseCellResultsData* cellResultsData, const std::vector& resultNames ); }; diff --git a/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathExportMswCompletionsImpl.cpp b/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathExportMswCompletionsImpl.cpp index 39f1f55ec1..0e59c73fe5 100644 --- a/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathExportMswCompletionsImpl.cpp +++ b/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathExportMswCompletionsImpl.cpp @@ -676,9 +676,6 @@ void RicWellPathExportMswCompletionsImpl::generateFishbonesMswExportInfo( double maxSegmentLength = enableSegmentSplitting ? mswParameters->maxSegmentLength() : std::numeric_limits::infinity(); - double subStartMD = wellPath->fishbonesCollection()->startMD(); - double subStartTVD = RicMswTableFormatterTools::tvdFromMeasuredDepth( branch->wellPath(), subStartMD ); - auto unitSystem = exportInfo->unitSystem(); for ( RimFishbones* subs : fishbonesSubs ) @@ -808,9 +805,6 @@ void RicWellPathExportMswCompletionsImpl::generateFishbonesMswExportInfo( segmentOnParentBranch->addCompletion( std::move( icdCompletion ) ); } } - - subStartMD = subEndMD; - subStartTVD = subEndTVD; } } exportInfo->setHasSubGridIntersections( exportInfo->hasSubGridIntersections() || foundSubGridIntersections ); @@ -1008,10 +1002,14 @@ bool RicWellPathExportMswCompletionsImpl::generatePerforationsMswExportInfo( auto childMswBranch = createChildMswBranch( childWellPath ); auto childCellIntersections = generateCellSegments( eclipseCase, childWellPath ); + // Start MD of child well path at the tie in location + const double tieInOnParentWellPath = + childWellPath->wellPathTieIn() ? childWellPath->wellPathTieIn()->tieInMeasuredDepth() : initialMD; + if ( generatePerforationsMswExportInfo( eclipseCase, childWellPath, timeStep, - initialMD, + tieInOnParentWellPath, childCellIntersections, exportInfo, childMswBranch.get() ) ) diff --git a/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathFractureTextReportFeatureImpl.cpp b/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathFractureTextReportFeatureImpl.cpp index 46148ff1b7..9e005b0f72 100644 --- a/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathFractureTextReportFeatureImpl.cpp +++ b/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathFractureTextReportFeatureImpl.cpp @@ -34,9 +34,9 @@ #include "RimFractureContainment.h" #include "RimFractureTemplate.h" #include "RimFractureTemplateCollection.h" +#include "RimMeshFractureTemplate.h" #include "RimOilField.h" #include "RimProject.h" -#include "RimStimPlanFractureTemplate.h" #include "RimTools.h" #include "RimWellPath.h" #include "RimWellPathCollection.h" @@ -81,8 +81,8 @@ QString RicWellPathFractureTextReportFeatureImpl::wellPathFractureReport( textStream << lineStart << "\n"; - std::vector stimPlanTemplates; - std::vector ellipseTemplates; + std::vector stimPlanTemplates; + std::vector ellipseTemplates; { auto proj = RimProject::current(); @@ -101,7 +101,7 @@ QString RicWellPathFractureTextReportFeatureImpl::wellPathFractureReport( continue; } - auto stimPlanTemplate = dynamic_cast( fracTemplate ); + auto stimPlanTemplate = dynamic_cast( fracTemplate ); if ( stimPlanTemplate ) { stimPlanTemplates.push_back( stimPlanTemplate ); @@ -269,7 +269,7 @@ QString RicWellPathFractureTextReportFeatureImpl::createWellFileLocationText( co /// //-------------------------------------------------------------------------------------------------- QString RicWellPathFractureTextReportFeatureImpl::createStimPlanFileLocationText( - const std::vector& stimPlanTemplates ) const + const std::vector& stimPlanTemplates ) const { if ( stimPlanTemplates.empty() ) return ""; @@ -307,7 +307,7 @@ QString RicWellPathFractureTextReportFeatureImpl::createStimPlanFileLocationText /// //-------------------------------------------------------------------------------------------------- QString RicWellPathFractureTextReportFeatureImpl::createStimPlanFractureText( - const std::vector& stimPlanTemplates ) const + const std::vector& stimPlanTemplates ) const { if ( stimPlanTemplates.empty() ) return ""; @@ -584,7 +584,9 @@ QString RicWellPathFractureTextReportFeatureImpl::createFractureInstancesText( formatter.add( fracture->tilt() ); if ( fracture->fractureTemplate() && - fracture->fractureTemplate()->orientationType() == RimFractureTemplate::ALONG_WELL_PATH ) + ( fracture->fractureTemplate()->orientationType() == RimFractureTemplate::ALONG_WELL_PATH || + ( fracture->fractureTemplate()->orientationType() == RimFractureTemplate::AZIMUTH && + fracture->fractureTemplate()->useUserDefinedPerforationLength() ) ) ) { formatter.add( fracture->perforationLength() ); } diff --git a/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathFractureTextReportFeatureImpl.h b/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathFractureTextReportFeatureImpl.h index 9478cc339b..f0d8d394ec 100644 --- a/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathFractureTextReportFeatureImpl.h +++ b/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathFractureTextReportFeatureImpl.h @@ -25,7 +25,7 @@ class RimWellPathFracture; class RimEclipseCase; class RimFractureTemplate; class RimEllipseFractureTemplate; -class RimStimPlanFractureTemplate; +class RimMeshFractureTemplate; class RifTextDataTableFormatter; class RicWellPathFractureReportItem; @@ -43,8 +43,8 @@ class RicWellPathFractureTextReportFeatureImpl private: QString createWellFileLocationText( const std::vector& wellPaths ) const; - QString createStimPlanFileLocationText( const std::vector& stimPlanTemplates ) const; - QString createStimPlanFractureText( const std::vector& stimPlanTemplates ) const; + QString createStimPlanFileLocationText( const std::vector& stimPlanTemplates ) const; + QString createStimPlanFractureText( const std::vector& stimPlanTemplates ) const; QString createEllipseFractureText( const std::vector& ellipseTemplates ) const; QString createFractureText( const std::vector& fractureTemplates ) const; QString createFractureInstancesText( const std::vector& fractureTemplates ) const; diff --git a/ApplicationLibCode/Commands/EclipseCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/EclipseCommands/CMakeLists_files.cmake index 392da3bdcb..bb359834d4 100644 --- a/ApplicationLibCode/Commands/EclipseCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/EclipseCommands/CMakeLists_files.cmake @@ -19,6 +19,7 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RicEclipseHideFaultFeature.h ${CMAKE_CURRENT_LIST_DIR}/RicEclipseShowOnlyFaultFeature.h ${CMAKE_CURRENT_LIST_DIR}/RicRenameCaseFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportRoffCaseFeature.h ) set(SOURCE_GROUP_SOURCE_FILES @@ -42,6 +43,7 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RicEclipseHideFaultFeature.cpp ${CMAKE_CURRENT_LIST_DIR}/RicEclipseShowOnlyFaultFeature.cpp ${CMAKE_CURRENT_LIST_DIR}/RicRenameCaseFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportRoffCaseFeature.cpp ) list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) diff --git a/ApplicationLibCode/Commands/EclipseCommands/RicAddEclipseInputPropertyFeature.cpp b/ApplicationLibCode/Commands/EclipseCommands/RicAddEclipseInputPropertyFeature.cpp index 4e6884ecb5..ed82b77cc1 100644 --- a/ApplicationLibCode/Commands/EclipseCommands/RicAddEclipseInputPropertyFeature.cpp +++ b/ApplicationLibCode/Commands/EclipseCommands/RicAddEclipseInputPropertyFeature.cpp @@ -19,13 +19,18 @@ #include "RicAddEclipseInputPropertyFeature.h" +#include "RiaApplication.h" +#include "RiaDefines.h" + +#include "RicImportGeneralDataFeature.h" + #include "RimEclipseCellColors.h" #include "RimEclipseInputCase.h" #include "RimEclipseInputPropertyCollection.h" #include "RimEclipseResultCase.h" #include "RimEclipseView.h" +#include "RimRoffCase.h" -#include "RiaApplication.h" #include "Riu3DMainWindowTools.h" #include "RiuFileDialogTools.h" @@ -44,6 +49,7 @@ bool RicAddEclipseInputPropertyFeature::isCommandEnabled() { return caf::SelectionManager::instance()->selectedItemOfType() || caf::SelectionManager::instance()->selectedItemOfType() || + caf::SelectionManager::instance()->selectedItemOfType() || caf::SelectionManager::instance()->selectedItemOfType() || caf::SelectionManager::instance()->selectedItemOfType(); } @@ -67,10 +73,13 @@ void RicAddEclipseInputPropertyFeature::onActionTriggered( bool isChecked ) RiaApplication* app = RiaApplication::instance(); QString defaultDir = app->lastUsedDialogDirectoryWithFallback( "INPUT_FILES", casePath ); - QStringList fileNames = RiuFileDialogTools::getOpenFileNames( Riu3DMainWindowTools::mainWindowWidget(), + QString filePattern = RicImportGeneralDataFeature::getFilePattern( { RiaDefines::ImportFileType::ECLIPSE_INPUT_FILE, + RiaDefines::ImportFileType::ROFF_FILE }, + true ); + QStringList fileNames = RiuFileDialogTools::getOpenFileNames( Riu3DMainWindowTools::mainWindowWidget(), "Select Eclipse Input Property Files", defaultDir, - "All Files (*.* *)" ); + filePattern ); if ( fileNames.isEmpty() ) return; diff --git a/ApplicationLibCode/Commands/EclipseCommands/RicEclipsePropertyFilterFeatureImpl.cpp b/ApplicationLibCode/Commands/EclipseCommands/RicEclipsePropertyFilterFeatureImpl.cpp index eb021bf7d3..e4ecc7b617 100644 --- a/ApplicationLibCode/Commands/EclipseCommands/RicEclipsePropertyFilterFeatureImpl.cpp +++ b/ApplicationLibCode/Commands/EclipseCommands/RicEclipsePropertyFilterFeatureImpl.cpp @@ -61,7 +61,7 @@ std::vector RicEclipsePropertyFilterFeature void RicEclipsePropertyFilterFeatureImpl::addPropertyFilter( RimEclipsePropertyFilterCollection* propertyFilterCollection ) { RimEclipsePropertyFilter* propertyFilter = new RimEclipsePropertyFilter(); - propertyFilterCollection->propertyFilters.push_back( propertyFilter ); + propertyFilterCollection->propertyFiltersField().push_back( propertyFilter ); setDefaults( propertyFilter ); propertyFilterCollection->reservoirView()->scheduleGeometryRegen( PROPERTY_FILTERED ); @@ -69,6 +69,8 @@ void RicEclipsePropertyFilterFeatureImpl::addPropertyFilter( RimEclipsePropertyF propertyFilterCollection->updateConnectedEditors(); Riu3DMainWindowTools::selectAsCurrentItem( propertyFilter, false ); + + propertyFilterCollection->onChildAdded( nullptr ); } //-------------------------------------------------------------------------------------------------- @@ -78,7 +80,7 @@ void RicEclipsePropertyFilterFeatureImpl::insertPropertyFilter( RimEclipseProper size_t index ) { RimEclipsePropertyFilter* propertyFilter = new RimEclipsePropertyFilter(); - propertyFilterCollection->propertyFilters.insertAt( static_cast( index ), propertyFilter ); + propertyFilterCollection->propertyFiltersField().insertAt( static_cast( index ), propertyFilter ); setDefaults( propertyFilter ); propertyFilterCollection->reservoirView()->scheduleGeometryRegen( PROPERTY_FILTERED ); diff --git a/ApplicationLibCode/Commands/EclipseCommands/RicEclipsePropertyFilterInsertExec.cpp b/ApplicationLibCode/Commands/EclipseCommands/RicEclipsePropertyFilterInsertExec.cpp index d6b5f6ff4f..b3b708d133 100644 --- a/ApplicationLibCode/Commands/EclipseCommands/RicEclipsePropertyFilterInsertExec.cpp +++ b/ApplicationLibCode/Commands/EclipseCommands/RicEclipsePropertyFilterInsertExec.cpp @@ -59,8 +59,8 @@ void RicEclipsePropertyFilterInsertExec::redo() RimEclipsePropertyFilterCollection* propertyFilterCollection = nullptr; m_propertyFilter->firstAncestorOrThisOfTypeAsserted( propertyFilterCollection ); - size_t index = propertyFilterCollection->propertyFilters.indexOf( m_propertyFilter ); - CVF_ASSERT( index < propertyFilterCollection->propertyFilters.size() ); + size_t index = propertyFilterCollection->propertyFiltersField().indexOf( m_propertyFilter ); + CVF_ASSERT( index < propertyFilterCollection->propertyFilters().size() ); RicEclipsePropertyFilterFeatureImpl::insertPropertyFilter( propertyFilterCollection, index ); } diff --git a/ApplicationLibCode/Commands/EclipseCommands/RicEclipsePropertyFilterNewExec.cpp b/ApplicationLibCode/Commands/EclipseCommands/RicEclipsePropertyFilterNewExec.cpp index 9d74dfc81b..2e45cc47b6 100644 --- a/ApplicationLibCode/Commands/EclipseCommands/RicEclipsePropertyFilterNewExec.cpp +++ b/ApplicationLibCode/Commands/EclipseCommands/RicEclipsePropertyFilterNewExec.cpp @@ -69,7 +69,7 @@ void RicEclipsePropertyFilterNewExec::redo() //-------------------------------------------------------------------------------------------------- void RicEclipsePropertyFilterNewExec::undo() { - m_propertyFilterCollection->propertyFilters.erase( m_propertyFilterCollection->propertyFilters.size() - 1 ); + m_propertyFilterCollection->propertyFiltersField().erase( m_propertyFilterCollection->propertyFilters().size() - 1 ); m_propertyFilterCollection->updateConnectedEditors(); } diff --git a/ApplicationLibCode/Commands/EclipseCommands/RicImportEclipseCaseFeature.cpp b/ApplicationLibCode/Commands/EclipseCommands/RicImportEclipseCaseFeature.cpp index 4e3414d5f7..01cc5f19f0 100644 --- a/ApplicationLibCode/Commands/EclipseCommands/RicImportEclipseCaseFeature.cpp +++ b/ApplicationLibCode/Commands/EclipseCommands/RicImportEclipseCaseFeature.cpp @@ -75,6 +75,6 @@ void RicImportEclipseCaseFeature::onActionTriggered( bool isChecked ) //-------------------------------------------------------------------------------------------------- void RicImportEclipseCaseFeature::setupActionLook( QAction* actionToSetup ) { - actionToSetup->setIcon( QIcon( ":/Case48x48.png" ) ); + actionToSetup->setIcon( QIcon( ":/Case.svg" ) ); actionToSetup->setText( "Import Eclipse Case" ); } diff --git a/ApplicationLibCode/Commands/EclipseCommands/RicImportEclipseCaseFeature.h b/ApplicationLibCode/Commands/EclipseCommands/RicImportEclipseCaseFeature.h index 0297c3d365..61e5e13cf1 100644 --- a/ApplicationLibCode/Commands/EclipseCommands/RicImportEclipseCaseFeature.h +++ b/ApplicationLibCode/Commands/EclipseCommands/RicImportEclipseCaseFeature.h @@ -21,10 +21,6 @@ #include "RicImportGeneralDataFeature.h" -#include "cafCmdFeature.h" - -#include - //================================================================================================== /// //================================================================================================== diff --git a/ApplicationLibCode/Commands/EclipseCommands/RicImportInputEclipseCaseFeature.cpp b/ApplicationLibCode/Commands/EclipseCommands/RicImportInputEclipseCaseFeature.cpp index 16b27bfda7..21eba4b616 100644 --- a/ApplicationLibCode/Commands/EclipseCommands/RicImportInputEclipseCaseFeature.cpp +++ b/ApplicationLibCode/Commands/EclipseCommands/RicImportInputEclipseCaseFeature.cpp @@ -19,20 +19,6 @@ #include "RicImportInputEclipseCaseFeature.h" -#include "RiaLogging.h" -#include "RiaPorosityModel.h" - -#include "RimEclipseCaseCollection.h" -#include "RimEclipseCellColors.h" -#include "RimEclipseInputCase.h" -#include "RimEclipseView.h" -#include "RimOilField.h" -#include "RimProject.h" - -#include "Riu3DMainWindowTools.h" - -#include "cafSelectionManager.h" - #include CAF_CMD_SOURCE_INIT( RicImportInputEclipseCaseFeature, "RicImportInputEclipseCaseFeature" ); diff --git a/ApplicationLibCode/Commands/EclipseCommands/RicImportInputEclipseCaseFeature.h b/ApplicationLibCode/Commands/EclipseCommands/RicImportInputEclipseCaseFeature.h index 54601ef289..a372c1d75b 100644 --- a/ApplicationLibCode/Commands/EclipseCommands/RicImportInputEclipseCaseFeature.h +++ b/ApplicationLibCode/Commands/EclipseCommands/RicImportInputEclipseCaseFeature.h @@ -21,12 +21,6 @@ #include "RicImportGeneralDataFeature.h" -#include "cafCmdFeature.h" - -#include - -class QStringList; - //================================================================================================== /// //================================================================================================== diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessmentFeature.cpp b/ApplicationLibCode/Commands/EclipseCommands/RicImportRoffCaseFeature.cpp similarity index 62% rename from ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessmentFeature.cpp rename to ApplicationLibCode/Commands/EclipseCommands/RicImportRoffCaseFeature.cpp index 444edf9da1..287f6e7ded 100644 --- a/ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessmentFeature.cpp +++ b/ApplicationLibCode/Commands/EclipseCommands/RicImportRoffCaseFeature.cpp @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////////// // -// Copyright (C) 2021 Equinor ASA +// Copyright (C) 2022- Equinor ASA // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -16,43 +16,33 @@ // ///////////////////////////////////////////////////////////////////////////////// -#include "RicRunAdvFaultReactAssessmentFeature.h" - -#include "RimFaultInViewCollection.h" -#include "RimFaultRASettings.h" +#include "RicImportRoffCaseFeature.h" #include -CAF_CMD_SOURCE_INIT( RicRunAdvFaultReactAssessmentFeature, "RicRunAdvFaultReactAssessmentFeature" ); +CAF_CMD_SOURCE_INIT( RicImportRoffCaseFeature, "RicImportRoffCaseFeature" ); //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RicRunAdvFaultReactAssessmentFeature::isCommandEnabled() +bool RicImportRoffCaseFeature::isCommandEnabled() { - RimFaultInViewCollection* faultColl = faultCollection(); - - if ( faultColl ) - { - return faultColl->faultRAAdvancedEnabled(); - } - - return false; + return true; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RicRunAdvFaultReactAssessmentFeature::onActionTriggered( bool isChecked ) +void RicImportRoffCaseFeature::onActionTriggered( bool isChecked ) { - runAdvancedProcessing( selectedFaultID() ); + RicImportGeneralDataFeature::openFileDialog( RiaDefines::ImportFileType::ROFF_FILE ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RicRunAdvFaultReactAssessmentFeature::setupActionLook( QAction* actionToSetup ) +void RicImportRoffCaseFeature::setupActionLook( QAction* actionToSetup ) { - actionToSetup->setIcon( QIcon( ":/fault_react_24x24.png" ) ); - actionToSetup->setText( "Run Advanced Processing" ); + actionToSetup->setIcon( QIcon( ":/EclipseInput48x48.png" ) ); + actionToSetup->setText( "Import Roff Case" ); } diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessmentFeature.h b/ApplicationLibCode/Commands/EclipseCommands/RicImportRoffCaseFeature.h similarity index 86% rename from ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessmentFeature.h rename to ApplicationLibCode/Commands/EclipseCommands/RicImportRoffCaseFeature.h index 22038d0394..c4b5fa9163 100644 --- a/ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessmentFeature.h +++ b/ApplicationLibCode/Commands/EclipseCommands/RicImportRoffCaseFeature.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////////// // -// Copyright (C) 2021 Equinor ASA +// Copyright (C) 2022- Equinor ASA // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -18,17 +18,17 @@ #pragma once -#include "RicRunFaultReactAssessmentFeature.h" +#include "RicImportGeneralDataFeature.h" //================================================================================================== /// //================================================================================================== -class RicRunAdvFaultReactAssessmentFeature : public RicRunFaultReactAssessmentFeature +class RicImportRoffCaseFeature : public RicImportGeneralDataFeature { CAF_CMD_HEADER_INIT; protected: + bool isCommandEnabled() override; void onActionTriggered( bool isChecked ) override; void setupActionLook( QAction* actionToSetup ) override; - bool isCommandEnabled() override; }; diff --git a/ApplicationLibCode/Commands/ExportCommands/RicExportEclipseSectorModelFeature.cpp b/ApplicationLibCode/Commands/ExportCommands/RicExportEclipseSectorModelFeature.cpp index 66f98710d8..b440849f1a 100644 --- a/ApplicationLibCode/Commands/ExportCommands/RicExportEclipseSectorModelFeature.cpp +++ b/ApplicationLibCode/Commands/ExportCommands/RicExportEclipseSectorModelFeature.cpp @@ -134,7 +134,7 @@ void RicExportEclipseSectorModelFeature::executeCommand( RimEclipseView* if ( !worked ) { - RiaLogging::error( QString( "Unable to write grid to '%1'" ).arg( exportSettings.exportGridFilename ) ); + RiaLogging::error( QString( "Unable to write grid to '%1'" ).arg( exportSettings.exportGridFilename() ) ); } else { diff --git a/ApplicationLibCode/Commands/ExportCommands/RicExportEclipseSectorModelUi.cpp b/ApplicationLibCode/Commands/ExportCommands/RicExportEclipseSectorModelUi.cpp index 11ab64cfa8..9a7fe85836 100644 --- a/ApplicationLibCode/Commands/ExportCommands/RicExportEclipseSectorModelUi.cpp +++ b/ApplicationLibCode/Commands/ExportCommands/RicExportEclipseSectorModelUi.cpp @@ -78,8 +78,7 @@ RicExportEclipseSectorModelUi::RicExportEclipseSectorModelUi() CAF_PDM_InitObject( "Export Visible Cells as Eclipse Input Grid" ); CAF_PDM_InitField( &exportGrid, "ExportGrid", true, "Export Grid Data", "", "Includes COORD, ZCORN and ACTNUM", "" ); - CAF_PDM_InitField( &exportGridFilename, "ExportGridFilename", QString(), "Grid File Name" ); - exportGridFilename.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); + CAF_PDM_InitField( &m_exportGridFilename, "ExportGridFilename", QString(), "Grid File Name" ); CAF_PDM_InitField( &exportInLocalCoordinates, "ExportInLocalCoords", false, @@ -107,8 +106,7 @@ RicExportEclipseSectorModelUi::RicExportEclipseSectorModelUi() CAF_PDM_InitFieldNoDefault( &exportFaults, "ExportFaults", "Export Fault Data" ); exportFaults = EXPORT_TO_SINGLE_SEPARATE_FILE; - CAF_PDM_InitField( &exportFaultsFilename, "ExportFaultsFilename", QString(), "Faults File Name" ); - exportFaultsFilename.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); + CAF_PDM_InitField( &m_exportFaultsFilename, "ExportFaultsFilename", QString(), "Faults File Name" ); QString ijkLabel = "Cell Count I, J, K"; CAF_PDM_InitField( &refinementCountI, "RefinementCountI", 1, ijkLabel ); @@ -116,14 +114,16 @@ RicExportEclipseSectorModelUi::RicExportEclipseSectorModelUi() CAF_PDM_InitField( &refinementCountK, "RefinementCountK", 1, "" ); CAF_PDM_InitFieldNoDefault( &exportParameters, "ExportParams", "Export Parameters" ); - CAF_PDM_InitField( &exportParametersFilename, "ExportParamsFilename", QString(), "File Name" ); - exportParametersFilename.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); + CAF_PDM_InitField( &m_exportParametersFilename, "ExportParamsFilename", QString(), "File Name" ); CAF_PDM_InitFieldNoDefault( &selectedKeywords, "ExportMainKeywords", "Keywords to Export" ); - exportGridFilename = defaultGridFileName(); - exportParametersFilename = defaultResultsFileName(); - exportFaultsFilename = defaultFaultsFileName(); + CAF_PDM_InitFieldNoDefault( &m_exportFolder, "ExportFolder", "Export Folder" ); + m_exportFolder = defaultFolder(); + + m_exportGridFilename = defaultGridFileName(); + m_exportParametersFilename = defaultResultsFileName(); + m_exportFaultsFilename = defaultFaultsFileName(); m_tabNames << "Grid Data"; m_tabNames << "Parameters"; @@ -241,7 +241,7 @@ void RicExportEclipseSectorModelUi::defineEditorAttribute( const caf::PdmFieldHa auto* lineEditorAttr = dynamic_cast( attribute ); - if ( field == &exportParametersFilename || field == &exportGridFilename || field == &exportFaultsFilename ) + if ( field == &m_exportParametersFilename || field == &m_exportGridFilename || field == &m_exportFaultsFilename ) { auto* myAttr = dynamic_cast( attribute ); if ( myAttr ) @@ -287,6 +287,15 @@ void RicExportEclipseSectorModelUi::defineEditorAttribute( const caf::PdmFieldHa lineEditorAttr->validator = new QIntValidator( 1, (int)gridDimensions.z(), nullptr ); } } + + if ( field == &m_exportFolder ) + { + caf::PdmUiFilePathEditorAttribute* myAttr = dynamic_cast( attribute ); + if ( myAttr ) + { + myAttr->m_selectDirectory = true; + } + } } //-------------------------------------------------------------------------------------------------- @@ -296,10 +305,12 @@ void RicExportEclipseSectorModelUi::defineUiOrdering( QString uiConfigName, caf: { if ( uiConfigName == m_tabNames[0] ) { + uiOrdering.add( &m_exportFolder ); + caf::PdmUiGroup* gridGroup = uiOrdering.addNewGroup( "Grid Export" ); gridGroup->add( &exportGrid ); - gridGroup->add( &exportGridFilename ); - exportGridFilename.uiCapability()->setUiReadOnly( !exportGrid() ); + gridGroup->add( &m_exportGridFilename ); + m_exportGridFilename.uiCapability()->setUiReadOnly( !exportGrid() ); gridGroup->add( &exportInLocalCoordinates ); exportInLocalCoordinates.uiCapability()->setUiReadOnly( !exportGrid() ); @@ -336,7 +347,7 @@ void RicExportEclipseSectorModelUi::defineUiOrdering( QString uiConfigName, caf: { if ( exportFaults() == EXPORT_TO_SINGLE_SEPARATE_FILE ) { - faultsGroup->add( &exportFaultsFilename ); + faultsGroup->add( &m_exportFaultsFilename ); } } } @@ -349,7 +360,7 @@ void RicExportEclipseSectorModelUi::defineUiOrdering( QString uiConfigName, caf: { if ( exportParameters() == EXPORT_TO_SINGLE_SEPARATE_FILE ) { - resultsGroup->add( &exportParametersFilename ); + resultsGroup->add( &m_exportParametersFilename ); } } @@ -388,48 +399,6 @@ void RicExportEclipseSectorModelUi::fieldChangedByUi( const caf::PdmFieldHandle* applyBoundaryDefaults(); this->updateConnectedEditors(); } - else if ( changedField == &exportGridFilename ) - { - QFileInfo info( exportGridFilename() ); - QDir dirPath = info.absoluteDir(); - - if ( exportParametersFilename() == defaultResultsFileName() ) - { - exportParametersFilename = dirPath.absoluteFilePath( "RESULTS.GRDECL" ); - } - if ( exportFaultsFilename() == defaultFaultsFileName() ) - { - exportFaultsFilename = dirPath.absoluteFilePath( "FAULTS.GRDECL" ); - } - } - else if ( changedField == &exportParametersFilename ) - { - QFileInfo info( exportParametersFilename() ); - QDir dirPath = info.absoluteDir(); - - if ( exportGridFilename() == defaultGridFileName() ) - { - exportGridFilename = dirPath.absoluteFilePath( "GRID.GRDECL" ); - } - if ( exportFaultsFilename() == defaultFaultsFileName() ) - { - exportFaultsFilename = dirPath.absoluteFilePath( "FAULTS.GRDECL" ); - } - } - else if ( changedField == &exportFaultsFilename ) - { - QFileInfo info( exportFaultsFilename() ); - QDir dirPath = info.absoluteDir(); - - if ( exportGridFilename() == defaultGridFileName() ) - { - exportGridFilename = dirPath.absoluteFilePath( "GRID.GRDECL" ); - } - if ( exportParametersFilename() == defaultResultsFileName() ) - { - exportParametersFilename = dirPath.absoluteFilePath( "RESULTS.GRDECL" ); - } - } } //-------------------------------------------------------------------------------------------------- @@ -533,8 +502,7 @@ QString RicExportEclipseSectorModelUi::defaultFolder() const //-------------------------------------------------------------------------------------------------- QString RicExportEclipseSectorModelUi::defaultGridFileName() const { - QDir baseDir( defaultFolder() ); - return baseDir.absoluteFilePath( "GRID.GRDECL" ); + return "GRID.GRDECL"; } //-------------------------------------------------------------------------------------------------- @@ -542,8 +510,7 @@ QString RicExportEclipseSectorModelUi::defaultGridFileName() const //-------------------------------------------------------------------------------------------------- QString RicExportEclipseSectorModelUi::defaultResultsFileName() const { - QDir baseDir( defaultFolder() ); - return baseDir.absoluteFilePath( "RESULTS.GRDECL" ); + return "RESULTS.GRDECL"; } //-------------------------------------------------------------------------------------------------- @@ -551,8 +518,7 @@ QString RicExportEclipseSectorModelUi::defaultResultsFileName() const //-------------------------------------------------------------------------------------------------- QString RicExportEclipseSectorModelUi::defaultFaultsFileName() const { - QDir baseDir( defaultFolder() ); - return baseDir.absoluteFilePath( "FAULTS.GRDECL" ); + return "FAULTS.GRDECL"; } //-------------------------------------------------------------------------------------------------- @@ -618,3 +584,27 @@ void RicExportEclipseSectorModelUi::removeInvalidKeywords() } selectedKeywords.v().swap( validKeywords ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RicExportEclipseSectorModelUi::exportFaultsFilename() const +{ + return m_exportFolder().path() + "/" + m_exportFaultsFilename(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RicExportEclipseSectorModelUi::exportGridFilename() const +{ + return m_exportFolder().path() + "/" + m_exportGridFilename(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RicExportEclipseSectorModelUi::exportParametersFilename() const +{ + return m_exportFolder().path() + "/" + m_exportParametersFilename(); +} diff --git a/ApplicationLibCode/Commands/ExportCommands/RicExportEclipseSectorModelUi.h b/ApplicationLibCode/Commands/ExportCommands/RicExportEclipseSectorModelUi.h index 5661b43171..fa6a4ddf1c 100644 --- a/ApplicationLibCode/Commands/ExportCommands/RicExportEclipseSectorModelUi.h +++ b/ApplicationLibCode/Commands/ExportCommands/RicExportEclipseSectorModelUi.h @@ -74,16 +74,17 @@ class RicExportEclipseSectorModelUi : public caf::PdmObject void applyBoundaryDefaults(); void removeInvalidKeywords(); - caf::PdmField exportGrid; - caf::PdmField exportGridFilename; - caf::PdmField exportInLocalCoordinates; - caf::PdmField makeInvisibleCellsInactive; + QString exportFaultsFilename() const; + QString exportGridFilename() const; + QString exportParametersFilename() const; + + caf::PdmField exportGrid; + caf::PdmField exportInLocalCoordinates; + caf::PdmField makeInvisibleCellsInactive; caf::PdmField exportFaults; - caf::PdmField exportFaultsFilename; caf::PdmField exportParameters; - caf::PdmField exportParametersFilename; caf::PdmField> selectedKeywords; @@ -115,6 +116,11 @@ class RicExportEclipseSectorModelUi : public caf::PdmObject QString defaultFaultsFileName() const; private: + caf::PdmField m_exportFolder; + caf::PdmField m_exportFaultsFilename; + caf::PdmField m_exportParametersFilename; + caf::PdmField m_exportGridFilename; + RigEclipseCaseData* m_caseData; cvf::Vec3i m_visibleMin; cvf::Vec3i m_visibleMax; diff --git a/ApplicationLibCode/Commands/ExportCommands/RicExportToLasFileResampleUi.cpp b/ApplicationLibCode/Commands/ExportCommands/RicExportToLasFileResampleUi.cpp index d7a607ef5d..6af9bc4ab9 100644 --- a/ApplicationLibCode/Commands/ExportCommands/RicExportToLasFileResampleUi.cpp +++ b/ApplicationLibCode/Commands/ExportCommands/RicExportToLasFileResampleUi.cpp @@ -64,12 +64,14 @@ RicExportToLasFileResampleUi::RicExportToLasFileResampleUi( void ) exportFolder.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); CAF_PDM_InitField( &filePrefix, "FilePrefix", QString( "" ), "File Prefix" ); CAF_PDM_InitField( &capitalizeFileName, "CapitalizeFileName", false, "Capitalize File Name" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &capitalizeFileName ); + CAF_PDM_InitFieldNoDefault( &curveUnitConversion, "CurveUnitConversion", "Curve Units" ); CAF_PDM_InitField( &activateResample, "ActivateResample", false, "Resample Curve Data" ); caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &activateResample ); - CAF_PDM_InitField( &resampleInterval, "ResampleInterval", 1.0, "Resample Interval [m]" ); + CAF_PDM_InitField( &resampleInterval, "ResampleInterval", 1.0, " Resample Interval [m]" ); CAF_PDM_InitField( &exportTvdrkb, "ExportTvdrkb", false, "Export TVDRKB" ); caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &exportTvdrkb ); @@ -192,12 +194,8 @@ void RicExportToLasFileResampleUi::defineUiOrdering( QString uiConfigName, caf:: uiOrdering.add( &curveUnitConversion ); } - { - caf::PdmUiGroup* group = uiOrdering.addNewGroup( "Resampling" ); - - group->add( &activateResample ); - group->add( &resampleInterval ); - } + uiOrdering.add( &activateResample ); + uiOrdering.add( &resampleInterval ); caf::PdmUiGroup* tvdrkbGroup = uiOrdering.addNewGroup( "TVDRKB" ); tvdrkbGroup->add( &exportTvdrkb ); diff --git a/ApplicationLibCode/Commands/FlowCommands/RicPlotProductionRateFeature.cpp b/ApplicationLibCode/Commands/FlowCommands/RicPlotProductionRateFeature.cpp index aba7521954..20706ecf29 100644 --- a/ApplicationLibCode/Commands/FlowCommands/RicPlotProductionRateFeature.cpp +++ b/ApplicationLibCode/Commands/FlowCommands/RicPlotProductionRateFeature.cpp @@ -225,8 +225,6 @@ void RicPlotProductionRateFeature::onActionTriggered( bool isChecked ) { mainPlotWindow->selectAsCurrentItem( summaryPlotToSelect ); mainPlotWindow->setExpanded( summaryPlotToSelect ); - - mainPlotWindow->tileSubWindows(); } } } diff --git a/ApplicationLibCode/Commands/FlowCommands/RicShowContributingWellsFeature.cpp b/ApplicationLibCode/Commands/FlowCommands/RicShowContributingWellsFeature.cpp index bca3fac491..05805e34fe 100644 --- a/ApplicationLibCode/Commands/FlowCommands/RicShowContributingWellsFeature.cpp +++ b/ApplicationLibCode/Commands/FlowCommands/RicShowContributingWellsFeature.cpp @@ -97,7 +97,7 @@ void RicShowContributingWellsFeature::onActionTriggered( bool isChecked ) { modifiedView->createDisplayModelAndRedraw(); - std::vector viewsToUpdate; + std::vector viewsToUpdate; viewsToUpdate.push_back( modifiedView ); RimViewManipulator::applySourceViewCameraOnDestinationViews( eclipseView, viewsToUpdate ); diff --git a/ApplicationLibCode/Commands/FlowCommands/RicShowContributingWellsFeatureImpl.cpp b/ApplicationLibCode/Commands/FlowCommands/RicShowContributingWellsFeatureImpl.cpp index 9624010233..7055145706 100644 --- a/ApplicationLibCode/Commands/FlowCommands/RicShowContributingWellsFeatureImpl.cpp +++ b/ApplicationLibCode/Commands/FlowCommands/RicShowContributingWellsFeatureImpl.cpp @@ -157,7 +157,7 @@ void RicShowContributingWellsFeatureImpl::modifyViewToShowContributingWells( Rim } RimEclipsePropertyFilter* propertyFilter = new RimEclipsePropertyFilter(); - propertyFilterCollection->propertyFilters().push_back( propertyFilter ); + propertyFilterCollection->propertyFiltersField().push_back( propertyFilter ); propertyFilter->resultDefinition()->setEclipseCase( viewToModify->eclipseCase() ); propertyFilter->resultDefinition()->setTofAndSelectTracer( selectedWell->name() ); diff --git a/ApplicationLibCode/Commands/FractureCommands/RicPlaceThermalFractureUsingTemplateDataFeature.cpp b/ApplicationLibCode/Commands/FractureCommands/RicPlaceThermalFractureUsingTemplateDataFeature.cpp index 5391516504..97c201e29b 100644 --- a/ApplicationLibCode/Commands/FractureCommands/RicPlaceThermalFractureUsingTemplateDataFeature.cpp +++ b/ApplicationLibCode/Commands/FractureCommands/RicPlaceThermalFractureUsingTemplateDataFeature.cpp @@ -18,9 +18,6 @@ #include "RicPlaceThermalFractureUsingTemplateDataFeature.h" -#include "RiaLogging.h" - -#include "RigWellPath.h" #include "RimProject.h" #include "RimThermalFractureTemplate.h" #include "RimWellPath.h" @@ -45,38 +42,23 @@ void RicPlaceThermalFractureUsingTemplateDataFeature::onActionTriggered( bool is if ( !fracture->fractureTemplate() ) return; - RimThermalFractureTemplate* thermalTemplate = dynamic_cast( fracture->fractureTemplate() ); - if ( !thermalTemplate ) return; - - RimWellPath* wellPath = nullptr; - fracture->firstAncestorOrThisOfTypeAsserted( wellPath ); - - auto wellPathGeometry = wellPath->wellPathGeometry(); - if ( !wellPathGeometry ) return; - - auto [centerPosition, rotation] = thermalTemplate->computePositionAndRotation(); - - // TODO: y conversion is workaround for strange test data - centerPosition.y() = std::fabs( centerPosition.y() ); - centerPosition.z() *= -1.0; - - double md = wellPathGeometry->closestMeasuredDepth( centerPosition ); - - RiaLogging::info( QString( "Placing thermal fracture. Posotion: [%1 %2 %3]" ) - .arg( centerPosition.x() ) - .arg( centerPosition.y() ) - .arg( centerPosition.z() ) ); - RiaLogging::info( QString( "Computed MD: %1" ).arg( md ) ); + placeUsingTemplateData( fracture ); +} - fracture->setMeasuredDepth( md ); +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicPlaceThermalFractureUsingTemplateDataFeature::placeUsingTemplateData( RimWellPathFracture* fracture ) +{ + RimThermalFractureTemplate* thermalTemplate = dynamic_cast( fracture->fractureTemplate() ); + if ( !thermalTemplate ) return false; - fracture->setAzimuth( rotation.x() ); - fracture->setDip( rotation.y() ); - fracture->setTilt( rotation.z() ); + if ( !thermalTemplate->placeFractureUsingTemplateData( fracture ) ) return false; fracture->updateConnectedEditors(); RimProject* project = RimProject::current(); project->reloadCompletionTypeResultsInAllViews(); + return true; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/FractureCommands/RicPlaceThermalFractureUsingTemplateDataFeature.h b/ApplicationLibCode/Commands/FractureCommands/RicPlaceThermalFractureUsingTemplateDataFeature.h index 5087b2f74a..dce8b61930 100644 --- a/ApplicationLibCode/Commands/FractureCommands/RicPlaceThermalFractureUsingTemplateDataFeature.h +++ b/ApplicationLibCode/Commands/FractureCommands/RicPlaceThermalFractureUsingTemplateDataFeature.h @@ -29,6 +29,9 @@ class RicPlaceThermalFractureUsingTemplateDataFeature : public caf::CmdFeature { CAF_CMD_HEADER_INIT; +public: + static bool placeUsingTemplateData( RimWellPathFracture* fracture ); + protected: void onActionTriggered( bool isChecked ) override; void setupActionLook( QAction* actionToSetup ) override; diff --git a/ApplicationLibCode/Commands/GeoMechCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/GeoMechCommands/CMakeLists_files.cmake index 52f4842590..723c2db1dd 100644 --- a/ApplicationLibCode/Commands/GeoMechCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/GeoMechCommands/CMakeLists_files.cmake @@ -8,12 +8,6 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterNewExec.h ${CMAKE_CURRENT_LIST_DIR}/RicImportGeoMechCaseFeature.h ${CMAKE_CURRENT_LIST_DIR}/RicImportGeoMechCaseTimeStepFilterFeature.h - ${CMAKE_CURRENT_LIST_DIR}/RicNewFaultReactAssessmentFeature.h - ${CMAKE_CURRENT_LIST_DIR}/RicRunBasicFaultReactAssessmentFeature.h - ${CMAKE_CURRENT_LIST_DIR}/RicRunAdvFaultReactAssessmentFeature.h - ${CMAKE_CURRENT_LIST_DIR}/RicRunBasicFaultReactAssessment3dFeature.h - ${CMAKE_CURRENT_LIST_DIR}/RicRunAdvFaultReactAssessment3dFeature.h - ${CMAKE_CURRENT_LIST_DIR}/RicRunFaultReactAssessmentFeature.h ${CMAKE_CURRENT_LIST_DIR}/RicNewWellIntegrityAnalysisFeature.h ${CMAKE_CURRENT_LIST_DIR}/RicRunWellIntegrityAnalysisFeature.h ) @@ -28,12 +22,6 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterNewExec.cpp ${CMAKE_CURRENT_LIST_DIR}/RicImportGeoMechCaseFeature.cpp ${CMAKE_CURRENT_LIST_DIR}/RicImportGeoMechCaseTimeStepFilterFeature.cpp - ${CMAKE_CURRENT_LIST_DIR}/RicNewFaultReactAssessmentFeature.cpp - ${CMAKE_CURRENT_LIST_DIR}/RicRunAdvFaultReactAssessmentFeature.cpp - ${CMAKE_CURRENT_LIST_DIR}/RicRunAdvFaultReactAssessment3dFeature.cpp - ${CMAKE_CURRENT_LIST_DIR}/RicRunBasicFaultReactAssessmentFeature.cpp - ${CMAKE_CURRENT_LIST_DIR}/RicRunBasicFaultReactAssessment3dFeature.cpp - ${CMAKE_CURRENT_LIST_DIR}/RicRunFaultReactAssessmentFeature.cpp ${CMAKE_CURRENT_LIST_DIR}/RicNewWellIntegrityAnalysisFeature.cpp ${CMAKE_CURRENT_LIST_DIR}/RicRunWellIntegrityAnalysisFeature.cpp ) diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicNewFaultReactAssessmentFeature.cpp b/ApplicationLibCode/Commands/GeoMechCommands/RicNewFaultReactAssessmentFeature.cpp deleted file mode 100644 index 6242c13b4e..0000000000 --- a/ApplicationLibCode/Commands/GeoMechCommands/RicNewFaultReactAssessmentFeature.cpp +++ /dev/null @@ -1,308 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2021 Equinor ASA -// -// ResInsight 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 3 of the License, or -// (at your option) any later version. -// -// ResInsight 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 at -// for more details. -// -///////////////////////////////////////////////////////////////////////////////// - -#include "RicNewFaultReactAssessmentFeature.h" - -#include "RiaApplication.h" -#include "RiaEclipseFileNameTools.h" -#include "RiaImportEclipseCaseTools.h" -#include "RiaPreferencesGeoMech.h" - -#include "RifFaultRAJsonWriter.h" - -#include "RimEclipseInputCase.h" -#include "RimEclipseResultCase.h" -#include "RimEclipseView.h" -#include "RimFaultInViewCollection.h" -#include "RimFaultRAPreprocSettings.h" -#include "RimFaultRASettings.h" -#include "RimGeoMechCase.h" -#include "RimProcess.h" -#include "RimProject.h" - -#include "Riu3DMainWindowTools.h" -#include "RiuFileDialogTools.h" - -#include "cafPdmUiPropertyViewDialog.h" -#include "cafProgressInfo.h" -#include "cafSelectionManagerTools.h" -#include "cafUtils.h" - -#include -#include -#include -#include - -CAF_CMD_SOURCE_INIT( RicNewFaultReactAssessmentFeature, "RicNewFaultReactAssessmentFeature" ); - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RicNewFaultReactAssessmentFeature::isCommandEnabled() -{ - return true; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RicNewFaultReactAssessmentFeature::onActionTriggered( bool isChecked ) -{ - RimFaultRAPreprocSettings frapSettings; - - // make sure the user has set up geomech/FRA things in preferences - if ( !RiaPreferencesGeoMech::current()->validateFRASettings() ) - { - QMessageBox::critical( nullptr, - "Fault Reactivation Assessment", - "Fault Reactivation Assessment has not been properly set up.\nPlease go to ResInsight " - "preferences and set/check the GeoMechanical settings." ); - return; - } - - // ask user for preprocessing settings - if ( !showSettingsGUI( frapSettings ) ) return; - - if ( frapSettings.cleanBaseDirectory() ) - { - auto reply = QMessageBox::question( nullptr, - QString( "Clean output directory" ), - QString( "Are you sure you want to delete all files and subfolders in the " - "selected output directory?\n%1 " ) - .arg( frapSettings.outputBaseDirectory() ), - QMessageBox::Yes | QMessageBox::No, - QMessageBox::No ); - if ( reply == QMessageBox::No ) - { - frapSettings.setCleanBaseDirectory( false ); - } - } - - // make sure our work dir is there - prepareDirectory( frapSettings.outputBaseDirectory(), frapSettings.cleanBaseDirectory() ); - - // run the preproc steps needed - if ( !runPreProc( frapSettings ) ) return; - - QStringList gridList; - gridList << frapSettings.outputEclipseFilename(); - - // load the new grid - bool createView = true; - int caseId = RiaImportEclipseCaseTools::openEclipseInputCaseFromFileNames( gridList, createView ); - if ( caseId < 0 ) - { - QMessageBox::critical( nullptr, "Fault Reactivation Assessment", "Unable to load generated Eclipse grid." ); - return; - } - - RimProject* project = RiaApplication::instance()->project(); - RimEclipseInputCase* fraCase = dynamic_cast( project->eclipseCaseFromCaseId( caseId ) ); - if ( fraCase == nullptr ) - { - QMessageBox::critical( nullptr, "Fault Reactivation Assessment", "Unable to find generated Eclipse grid." ); - return; - } - - RimEclipseView* view = getView( fraCase ); - if ( view == nullptr ) - { - QMessageBox::critical( nullptr, "Fault Reactivation Assessment", "Unable to find view for generated Eclipse grid." ); - return; - } - - if ( view->faultCollection() ) - { - view->faultCollection()->enableFaultRA( true ); - view->faultCollection()->faultRASettings()->initFromPreprocSettings( &frapSettings, fraCase ); - } - - cleanUpParameterFiles(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RicNewFaultReactAssessmentFeature::setupActionLook( QAction* actionToSetup ) -{ - actionToSetup->setIcon( QIcon( ":/fault_react_24x24.png" ) ); - actionToSetup->setText( "New Fault Reactivation Assessment" ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RicNewFaultReactAssessmentFeature::prepareDirectory( QString dirname, bool deleteExistingContent ) const -{ - QDir dir( dirname ); - - if ( deleteExistingContent && dir.exists() ) - { - dir.setFilter( QDir::Files | QDir::Dirs | QDir::NoSymLinks ); - - for ( auto& entry : dir.entryInfoList() ) - { - if ( entry.isDir() && entry.fileName() != "." && entry.fileName() != ".." ) - entry.dir().removeRecursively(); - else if ( entry.isFile() ) - QFile::remove( entry.absoluteFilePath() ); - } - } - - dir.mkpath( "." ); - dir.mkpath( "Eclipse" ); - dir.mkpath( "Abaqus" ); - dir.mkpath( "tmp" ); - dir.mkpath( "tsurf" ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RicNewFaultReactAssessmentFeature::showSettingsGUI( RimFaultRAPreprocSettings& settings ) -{ - // get the case we should be working with - std::vector geomechCases = caf::selectedObjectsByTypeStrict(); - std::vector eclipseCases = caf::selectedObjectsByTypeStrict(); - if ( geomechCases.empty() && eclipseCases.empty() ) return false; - - // get base directory for our work, should be a new, empty folder somewhere - QString defaultDir = - RiaApplication::instance()->lastUsedDialogDirectoryWithFallbackToProjectFolder( "FAULT_REACT_ASSESSMENT" ); - QString baseDir = RiuFileDialogTools::getExistingDirectory( nullptr, tr( "Select Working Directory" ), defaultDir ); - if ( baseDir.isNull() ) return false; - RiaApplication::instance()->setLastUsedDialogDirectory( "FAULT_REACT_ASSESSMENT", baseDir ); - - // ask the user for the options we need in the preproc step - if ( !geomechCases.empty() ) settings.setGeoMechCase( geomechCases[0] ); - if ( !eclipseCases.empty() ) settings.setEclipseCase( eclipseCases[0] ); - settings.setOutputBaseDirectory( baseDir ); - - caf::PdmUiPropertyViewDialog propertyDialog( nullptr, - &settings, - "Fault Reactivation Assessment Preprocessing", - "", - QDialogButtonBox::Ok | QDialogButtonBox::Cancel ); - if ( settings.geoMechSelected() ) - propertyDialog.resize( QSize( 520, 520 ) ); - else - propertyDialog.resize( QSize( 520, 420 ) ); - - // make sure we always have an eclipse case selected - while ( true ) - { - if ( propertyDialog.exec() != QDialog::Accepted ) break; - if ( settings.eclipseCase() != nullptr ) return true; - } - - return false; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RicNewFaultReactAssessmentFeature::runPreProc( RimFaultRAPreprocSettings& settings ) -{ - caf::ProgressInfo runProgress( 2, "Running preprocessing, please wait..." ); - - // is geomech enabled? If so, run preproc script to generate rpt files - if ( settings.geoMechSelected() ) - { - QString errorText; - if ( !RifFaultRAJSonWriter::writeToPreprocFile( settings, errorText ) ) - { - QMessageBox::warning( nullptr, "Fault Reactivation Assessment Preprocessing", errorText ); - return false; - } - - runProgress.setProgressDescription( "Preproc script." ); - - // run the python preprocessing script - QString command = RiaPreferencesGeoMech::current()->geomechFRAPreprocCommand(); - QStringList parameters = settings.preprocParameterList(); - - addParameterFileForCleanUp( settings.preprocParameterFilename() ); - - RimProcess process; - process.setCommand( command ); - process.setParameters( parameters ); - if ( !process.execute() ) - { - QMessageBox::critical( nullptr, - "Fault Reactivation Assessment Preprocessing", - "Failed to run preprocessing script. Check log window for additional information." ); - return false; - } - } - - runProgress.incrementProgress(); - runProgress.setProgressDescription( "Macris prepare command." ); - - // run the java macris program in prepare mode - QString command = RiaPreferencesGeoMech::current()->geomechFRAMacrisCommand(); - QStringList parameters = settings.macrisPrepareParameterList(); - - RimProcess process; - process.setCommand( command ); - process.setParameters( parameters ); - if ( !process.execute() ) - { - QMessageBox::critical( nullptr, - "Fault Reactivation Assessment Preprocessing", - "Failed to run Macrix prepare command. Check log window for additional information." ); - return false; - } - - runProgress.incrementProgress(); - - return true; -} -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimEclipseView* RicNewFaultReactAssessmentFeature::getView( RimEclipseInputCase* eCase ) -{ - std::vector views; - eCase->descendantsOfType( views ); - if ( views.size() > 0 ) return views[0]; - - return nullptr; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RicNewFaultReactAssessmentFeature::addParameterFileForCleanUp( QString filename ) -{ - m_parameterFilesToCleanUp.push_back( filename ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RicNewFaultReactAssessmentFeature::cleanUpParameterFiles() -{ - if ( !RiaPreferencesGeoMech::current()->keepTemporaryFiles() ) - { - for ( auto& filename : m_parameterFilesToCleanUp ) - { - if ( QFile::exists( filename ) ) QFile::remove( filename ); - } - } - m_parameterFilesToCleanUp.clear(); -} diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicNewWellIntegrityAnalysisFeature.cpp b/ApplicationLibCode/Commands/GeoMechCommands/RicNewWellIntegrityAnalysisFeature.cpp index 851b1c3825..93e5c11888 100644 --- a/ApplicationLibCode/Commands/GeoMechCommands/RicNewWellIntegrityAnalysisFeature.cpp +++ b/ApplicationLibCode/Commands/GeoMechCommands/RicNewWellIntegrityAnalysisFeature.cpp @@ -97,7 +97,7 @@ void RicNewWellIntegrityAnalysisFeature::onActionTriggered( bool isChecked ) void RicNewWellIntegrityAnalysisFeature::setupActionLook( QAction* actionToSetup ) { actionToSetup->setIcon( QIcon( ":/WellIntAnalysis.png" ) ); - actionToSetup->setText( "New Well Integration Analysis at this Depth" ); + actionToSetup->setText( "New Well Integrity Analysis at this Depth" ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessment3dFeature.cpp b/ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessment3dFeature.cpp deleted file mode 100644 index a7e5dd3afd..0000000000 --- a/ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessment3dFeature.cpp +++ /dev/null @@ -1,75 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2021 Equinor ASA -// -// ResInsight 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 3 of the License, or -// (at your option) any later version. -// -// ResInsight 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 at -// for more details. -// -///////////////////////////////////////////////////////////////////////////////// - -#include "RicRunBasicFaultReactAssessment3dFeature.h" - -#include "RimEclipseView.h" -#include "RimFaultInViewCollection.h" -#include "RimFaultRASettings.h" -#include "RimGridView.h" - -#include "RiaApplication.h" - -#include -#include - -CAF_CMD_SOURCE_INIT( RicRunBasicFaultReactAssessment3dFeature, "RicRunBasicFaultReactAssessment3dFeature" ); - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RicRunBasicFaultReactAssessment3dFeature::isCommandEnabled() -{ - return true; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RicRunBasicFaultReactAssessment3dFeature::onActionTriggered( bool isChecked ) -{ - QVariant userData = this->userData(); - if ( userData.isNull() || userData.type() != QVariant::String ) return; - - QString faultName = userData.toString(); - - int faultID = faultIDFromName( faultName ); - if ( faultID >= 0 ) runBasicProcessing( faultID ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RicRunBasicFaultReactAssessment3dFeature::setupActionLook( QAction* actionToSetup ) -{ - actionToSetup->setIcon( QIcon( ":/fault_react_24x24.png" ) ); - actionToSetup->setText( "Run Basic Processing" ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimFaultInViewCollection* RicRunBasicFaultReactAssessment3dFeature::faultCollection() -{ - RimGridView* viewOrComparisonView = RiaApplication::instance()->activeMainOrComparisonGridView(); - RimEclipseView* theView = dynamic_cast( viewOrComparisonView ); - - CAF_ASSERT( theView ); - - return theView->faultCollection(); -} diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessmentFeature.cpp b/ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessmentFeature.cpp deleted file mode 100644 index 5fe424f637..0000000000 --- a/ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessmentFeature.cpp +++ /dev/null @@ -1,57 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2021 Equinor ASA -// -// ResInsight 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 3 of the License, or -// (at your option) any later version. -// -// ResInsight 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 at -// for more details. -// -///////////////////////////////////////////////////////////////////////////////// - -#include "RicRunBasicFaultReactAssessmentFeature.h" - -#include "RimFaultInViewCollection.h" -#include "RimFaultRASettings.h" - -#include - -CAF_CMD_SOURCE_INIT( RicRunBasicFaultReactAssessmentFeature, "RicRunBasicFaultReactAssessmentFeature" ); - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RicRunBasicFaultReactAssessmentFeature::isCommandEnabled() -{ - RimFaultInViewCollection* faultColl = faultCollection(); - if ( faultColl ) - { - return ( faultColl->faultRAEnabled() ); - } - - return false; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RicRunBasicFaultReactAssessmentFeature::onActionTriggered( bool isChecked ) -{ - runBasicProcessing( selectedFaultID() ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RicRunBasicFaultReactAssessmentFeature::setupActionLook( QAction* actionToSetup ) -{ - actionToSetup->setIcon( QIcon( ":/fault_react_24x24.png" ) ); - actionToSetup->setText( "Run Basic Processing" ); -} diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunFaultReactAssessmentFeature.cpp b/ApplicationLibCode/Commands/GeoMechCommands/RicRunFaultReactAssessmentFeature.cpp deleted file mode 100644 index 916e1c7a51..0000000000 --- a/ApplicationLibCode/Commands/GeoMechCommands/RicRunFaultReactAssessmentFeature.cpp +++ /dev/null @@ -1,391 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2021 Equinor ASA -// -// ResInsight 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 3 of the License, or -// (at your option) any later version. -// -// ResInsight 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 at -// for more details. -// -///////////////////////////////////////////////////////////////////////////////// - -#include "RicRunFaultReactAssessmentFeature.h" - -#include "RiaApplication.h" -#include "RiaEclipseFileNameTools.h" -#include "RiaImportEclipseCaseTools.h" -#include "RiaPreferencesGeoMech.h" -#include "RiaResultNames.h" - -#include "RifFaultRAJsonWriter.h" -#include "RifFaultRAXmlWriter.h" - -#include "RimEclipseInputCase.h" -#include "RimEclipseResultCase.h" -#include "RimEclipseView.h" -#include "RimFaultInView.h" -#include "RimFaultInViewCollection.h" -#include "RimFaultRAPostprocSettings.h" -#include "RimFaultRAPreprocSettings.h" -#include "RimFaultRASettings.h" -#include "RimFileSurface.h" -#include "RimGeoMechCase.h" -#include "RimOilField.h" -#include "RimProcess.h" -#include "RimProject.h" -#include "RimSurface.h" -#include "RimSurfaceCollection.h" - -#include "Riu3DMainWindowTools.h" -#include "RiuFileDialogTools.h" - -#include "cafPdmUiPropertyViewDialog.h" -#include "cafProgressInfo.h" -#include "cafSelectionManagerTools.h" -#include "cafUtils.h" - -#include -#include -#include -#include -#include - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RicRunFaultReactAssessmentFeature::RicRunFaultReactAssessmentFeature() -{ -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimFaultInViewCollection* RicRunFaultReactAssessmentFeature::faultCollection() -{ - RimFaultInViewCollection* faultColl = - dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); - - if ( faultColl ) return faultColl; - - RimFaultInView* selObj = dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); - if ( selObj ) - { - if ( !selObj->name().startsWith( RiaResultNames::faultReactAssessmentPrefix() ) ) return nullptr; - selObj->firstAncestorOrThisOfType( faultColl ); - } - - return faultColl; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -int RicRunFaultReactAssessmentFeature::faultIDFromName( QString faultName ) const -{ - int retval = -1; - - QString lookFor = RiaResultNames::faultReactAssessmentPrefix(); - QString name = faultName; - if ( !name.startsWith( lookFor ) ) return retval; - - name = name.mid( lookFor.length() ); - if ( name.size() == 0 ) return retval; - - bool bOK; - retval = name.toInt( &bOK ); - if ( !bOK ) retval = -1; - - return retval; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -int RicRunFaultReactAssessmentFeature::selectedFaultID() -{ - int retval = -1; - RimFaultInView* selObj = dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); - if ( selObj ) - { - return faultIDFromName( selObj->name() ); - } - - return retval; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RicRunFaultReactAssessmentFeature::runPostProcessing( int faultID, RimFaultRASettings* settings ) -{ - RimFaultRAPostprocSettings postproc_settings; - postproc_settings.initFromSettings( settings ); - - QString outErrorText; - if ( !RifFaultRAJSonWriter::writeToPostprocFile( faultID, &postproc_settings, outErrorText ) ) - { - QMessageBox::warning( nullptr, - "Fault Reactivation Assessment Processing", - "Unable to write postproc parameter file! " + outErrorText ); - return false; - } - - QString command = RiaPreferencesGeoMech::current()->geomechFRAPostprocCommand(); - QStringList parameters = postproc_settings.postprocCommandParameters( faultID ); - - RimProcess process; - process.setCommand( command ); - process.setParameters( parameters ); - - addParameterFileForCleanUp( postproc_settings.postprocParameterFilename( faultID ) ); - - if ( !process.execute() ) - { - QMessageBox::critical( nullptr, - "Fault Reactivation Assessment Processing", - "Failed to run post processing command. Check log window for additional " - "information." ); - return false; - } - - return true; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RicRunFaultReactAssessmentFeature::addParameterFileForCleanUp( QString filename ) -{ - m_parameterFilesToCleanUp.push_back( filename ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RicRunFaultReactAssessmentFeature::cleanUpParameterFiles() -{ - if ( !RiaPreferencesGeoMech::current()->keepTemporaryFiles() ) - { - for ( auto& filename : m_parameterFilesToCleanUp ) - { - removeFile( filename ); - } - } - m_parameterFilesToCleanUp.clear(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RicRunFaultReactAssessmentFeature::removeFile( QString filename ) -{ - if ( QFile::exists( filename ) ) QFile::remove( filename ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimSurfaceCollection* RicRunFaultReactAssessmentFeature::surfaceCollection() -{ - RimProject* proj = RimProject::current(); - RimSurfaceCollection* surfColl = proj->activeOilField()->surfaceCollection(); - - if ( surfColl ) - { - for ( auto& subColl : surfColl->subCollections() ) - { - if ( subColl->collectionName() == "FaultRA" ) - { - return subColl; - } - } - - // No FaultRA collection found, make one - RimSurfaceCollection* fraCollection = new RimSurfaceCollection(); - fraCollection->setCollectionName( "FaultRA" ); - surfColl->addSubCollection( fraCollection ); - return fraCollection; - } - - return nullptr; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RicRunFaultReactAssessmentFeature::reloadSurfaces( RimFaultRASettings* settings ) -{ - RimSurfaceCollection* surfColl = surfaceCollection(); - if ( !surfColl ) return; - - // get rid of any files removed by the processing - surfColl->removeMissingFileSurfaces(); - - bool showLegendInView = false; - - // ask the collection to reload the existing files - surfColl->reloadSurfaces( surfColl->surfaces(), showLegendInView ); - - // get all the files in the folder, skip the ones we alreday have - QStringList newFiles; - - QDirIterator tsurfIt( settings->tsurfOutputDirectory(), { "*.ts" }, QDir::Files ); - while ( tsurfIt.hasNext() ) - { - QString filename = tsurfIt.next(); - if ( surfColl->containsFileSurface( filename ) ) continue; - newFiles << filename; - } - - // import the new surfaces - surfColl->importSurfacesFromFiles( newFiles, showLegendInView ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RicRunFaultReactAssessmentFeature::runBasicProcessing( int faultID ) -{ - RimFaultInViewCollection* coll = faultCollection(); - if ( coll == nullptr ) return; - - RimFaultRASettings* fraSettings = coll->faultRASettings(); - if ( fraSettings == nullptr ) return; - - caf::ProgressInfo runProgress( 3, "Running Basic Fault RA processing, please wait..." ); - - { - runProgress.setProgressDescription( "Macris calculate command." ); - QString paramfilename = fraSettings->basicParameterXMLFilename( faultID ); - - RifFaultRAXmlWriter xmlwriter( fraSettings ); - QString outErrorText; - if ( !xmlwriter.writeCalculateFile( paramfilename, faultID, outErrorText ) ) - { - QMessageBox::warning( nullptr, - "Fault Reactivation Assessment Processing", - "Unable to write parameter file! " + outErrorText ); - return; - } - - addParameterFileForCleanUp( paramfilename ); - - // remove any existing database file - removeFile( fraSettings->basicMacrisDatabase() ); - - // run the java macris program in calculate mode - QString command = RiaPreferencesGeoMech::current()->geomechFRAMacrisCommand(); - QStringList parameters = fraSettings->basicMacrisParameters( faultID ); - - RimProcess process; - process.setCommand( command ); - process.setParameters( parameters ); - if ( !process.execute() ) - { - QMessageBox::critical( nullptr, - "Basic Fault Reactivation Assessment Processing", - "Failed to run Macris calculate command. Check log window for additional " - "information." ); - cleanUpParameterFiles(); - return; - } - - runProgress.incrementProgress(); - } - - runProgress.setProgressDescription( "Generating surface results." ); - - if ( runPostProcessing( faultID, fraSettings ) ) - { - runProgress.incrementProgress(); - - runProgress.setProgressDescription( "Importing surface results." ); - - // reload output surfaces - reloadSurfaces( fraSettings ); - } - // delete parameter files - cleanUpParameterFiles(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RicRunFaultReactAssessmentFeature::runAdvancedProcessing( int faultID ) -{ - RimFaultInViewCollection* coll = faultCollection(); - if ( coll == nullptr ) return; - - RimFaultRASettings* fraSettings = coll->faultRASettings(); - if ( fraSettings == nullptr ) return; - - caf::ProgressInfo runProgress( 3, "Running Advanced Fault RA processing, please wait..." ); - - runProgress.setProgressDescription( "Macris calibrate command." ); - QString paramfilename = fraSettings->basicParameterXMLFilename( faultID ); - - RifFaultRAXmlWriter xmlwriter( fraSettings ); - QString outErrorText; - if ( !xmlwriter.writeCalculateFile( paramfilename, faultID, outErrorText ) ) - { - QMessageBox::warning( nullptr, - "Fault Reactivation Assessment Processing", - "Unable to write parameter file! " + outErrorText ); - return; - } - - QString paramfilename2 = fraSettings->advancedParameterXMLFilename( faultID ); - if ( !xmlwriter.writeCalibrateFile( paramfilename2, faultID, outErrorText ) ) - { - QMessageBox::warning( nullptr, - "Fault Reactivation Assessment Processing", - "Unable to write calibrate parameter file! " + outErrorText ); - return; - } - - addParameterFileForCleanUp( paramfilename ); - addParameterFileForCleanUp( paramfilename2 ); - - // remove any existing database file - removeFile( fraSettings->advancedMacrisDatabase() ); - - // run the java macris program in calibrate mode - QString command = RiaPreferencesGeoMech::current()->geomechFRAMacrisCommand(); - QStringList parameters = fraSettings->advancedMacrisParameters( faultID ); - - RimProcess process; - process.setCommand( command ); - process.setParameters( parameters ); - if ( !process.execute() ) - { - QMessageBox::critical( nullptr, - "Advanced Fault Reactivation Assessment Processing", - "Failed to run Macris calibrate command. Check log window for additional information." ); - cleanUpParameterFiles(); - return; - } - - runProgress.incrementProgress(); - - runProgress.setProgressDescription( "Generating surface results." ); - - if ( runPostProcessing( faultID, fraSettings ) ) - { - runProgress.incrementProgress(); - - runProgress.setProgressDescription( "Importing surface results." ); - - // reload output surfaces - reloadSurfaces( fraSettings ); - } - - // delete parameter files - cleanUpParameterFiles(); -} diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunFaultReactAssessmentFeature.h b/ApplicationLibCode/Commands/GeoMechCommands/RicRunFaultReactAssessmentFeature.h deleted file mode 100644 index 808928323c..0000000000 --- a/ApplicationLibCode/Commands/GeoMechCommands/RicRunFaultReactAssessmentFeature.h +++ /dev/null @@ -1,57 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2021 Equinor ASA -// -// ResInsight 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 3 of the License, or -// (at your option) any later version. -// -// ResInsight 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 at -// for more details. -// -///////////////////////////////////////////////////////////////////////////////// - -#pragma once - -#include "cafCmdFeature.h" - -class RimFaultInViewCollection; -class RimFaultRASettings; -class RimSurfaceCollection; - -#include - -//================================================================================================== -/// -//================================================================================================== -class RicRunFaultReactAssessmentFeature : public caf::CmdFeature -{ -protected: - RicRunFaultReactAssessmentFeature(); - - virtual RimFaultInViewCollection* faultCollection(); - - int selectedFaultID(); - int faultIDFromName( QString faultname ) const; - - RimSurfaceCollection* surfaceCollection(); - - bool runPostProcessing( int faultID, RimFaultRASettings* settings ); - void reloadSurfaces( RimFaultRASettings* settings ); - - void addParameterFileForCleanUp( QString filename ); - void cleanUpParameterFiles(); - - void removeFile( QString filename ); - - void runBasicProcessing( int faultID ); - void runAdvancedProcessing( int faultID ); - -private: - std::list m_parameterFilesToCleanUp; -}; diff --git a/ApplicationLibCode/Commands/OperationsUsingObjReferences/RicPasteEclipseViewsFeature.cpp b/ApplicationLibCode/Commands/OperationsUsingObjReferences/RicPasteEclipseViewsFeature.cpp index c926eec907..a757926e1c 100644 --- a/ApplicationLibCode/Commands/OperationsUsingObjReferences/RicPasteEclipseViewsFeature.cpp +++ b/ApplicationLibCode/Commands/OperationsUsingObjReferences/RicPasteEclipseViewsFeature.cpp @@ -19,15 +19,17 @@ #include "RicPasteEclipseViewsFeature.h" -#include "Riu3DMainWindowTools.h" - #include "RicPasteFeatureImpl.h" #include "Rim2dIntersectionViewCollection.h" #include "RimEclipseCase.h" +#include "RimEclipseContourMapView.h" +#include "RimEclipseContourMapViewCollection.h" #include "RimEclipseView.h" #include "RimSimWellInViewCollection.h" +#include "Riu3DMainWindowTools.h" + #include "cafPdmDocument.h" #include "cafPdmObjectGroup.h" #include "cafSelectionManager.h" @@ -47,13 +49,12 @@ bool RicPasteEclipseViewsFeature::isCommandEnabled() std::vector> typedObjects; objectGroup.objectsByType( &typedObjects ); - if ( typedObjects.size() == 0 ) + if ( typedObjects.empty() ) { return false; } - caf::PdmObjectHandle* destinationObject = - dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); + auto* destinationObject = dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); RimIdenticalGridCaseGroup* gridCaseGroup = RicPasteFeatureImpl::findGridCaseGroup( destinationObject ); if ( gridCaseGroup ) return false; @@ -69,8 +70,7 @@ bool RicPasteEclipseViewsFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicPasteEclipseViewsFeature::onActionTriggered( bool isChecked ) { - caf::PdmObjectHandle* destinationObject = - dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); + auto* destinationObject = dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); RimEclipseCase* eclipseCase = RicPasteFeatureImpl::findEclipseCase( destinationObject ); assert( eclipseCase ); @@ -78,7 +78,7 @@ void RicPasteEclipseViewsFeature::onActionTriggered( bool isChecked ) caf::PdmObjectGroup objectGroup; RicPasteFeatureImpl::findObjectsFromClipboardRefs( &objectGroup ); - if ( objectGroup.objects.size() == 0 ) return; + if ( objectGroup.objects.empty() ) return; std::vector> eclipseViews; objectGroup.objectsByType( &eclipseViews ); @@ -86,15 +86,26 @@ void RicPasteEclipseViewsFeature::onActionTriggered( bool isChecked ) RimEclipseView* lastViewCopy = nullptr; // Add cases to case group - for ( size_t i = 0; i < eclipseViews.size(); i++ ) + for ( const auto& eclipseView : eclipseViews ) { - RimEclipseView* rimReservoirView = dynamic_cast( - eclipseViews[i]->xmlCapability()->copyByXmlSerialization( caf::PdmDefaultObjectFactory::instance() ) ); + auto* rimReservoirView = dynamic_cast( + eclipseView->xmlCapability()->copyByXmlSerialization( caf::PdmDefaultObjectFactory::instance() ) ); CVF_ASSERT( rimReservoirView ); QString nameOfCopy = QString( "Copy of " ) + rimReservoirView->name(); rimReservoirView->setName( nameOfCopy ); - eclipseCase->reservoirViews().push_back( rimReservoirView ); + + if ( dynamic_cast( eclipseView.p() ) ) + { + auto contourMapView = dynamic_cast( rimReservoirView ); + CVF_ASSERT( contourMapView ); + + eclipseCase->contourMapCollection()->push_back( contourMapView ); + } + else + { + eclipseCase->reservoirViews().push_back( rimReservoirView ); + } rimReservoirView->setEclipseCase( eclipseCase ); diff --git a/ApplicationLibCode/Commands/PlotBuilderCommands/RicAppendSummaryPlotsForObjectsFeature.cpp b/ApplicationLibCode/Commands/PlotBuilderCommands/RicAppendSummaryPlotsForObjectsFeature.cpp index 1c38f6486f..79ec012613 100644 --- a/ApplicationLibCode/Commands/PlotBuilderCommands/RicAppendSummaryPlotsForObjectsFeature.cpp +++ b/ApplicationLibCode/Commands/PlotBuilderCommands/RicAppendSummaryPlotsForObjectsFeature.cpp @@ -29,6 +29,8 @@ #include "RimEnsembleCurveSet.h" #include "RimSummaryAddressCollection.h" #include "RimSummaryAddressModifier.h" +#include "RimSummaryCase.h" +#include "RimSummaryCaseCollection.h" #include "RimSummaryCurve.h" #include "RimSummaryMultiPlot.h" #include "RimSummaryMultiPlotCollection.h" @@ -112,6 +114,8 @@ void RicAppendSummaryPlotsForObjectsFeature::appendPlots( RimSummaryMultiPlot* s } info.incrementProgress(); } + + summaryMultiPlot->updatePlotTitles(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/PlotTemplateCommands/RicSaveMultiPlotTemplateFeature.cpp b/ApplicationLibCode/Commands/PlotTemplateCommands/RicSaveMultiPlotTemplateFeature.cpp index 57987ba5fc..bb25fbe298 100644 --- a/ApplicationLibCode/Commands/PlotTemplateCommands/RicSaveMultiPlotTemplateFeature.cpp +++ b/ApplicationLibCode/Commands/PlotTemplateCommands/RicSaveMultiPlotTemplateFeature.cpp @@ -32,6 +32,8 @@ #include "RimEnsembleCurveSetCollection.h" #include "RimProject.h" #include "RimSummaryAddress.h" +#include "RimSummaryCase.h" +#include "RimSummaryCaseCollection.h" #include "RimSummaryCurve.h" #include "RimSummaryMultiPlot.h" #include "RimSummaryPlot.h" diff --git a/ApplicationLibCode/Commands/PlotTemplateCommands/RicSummaryPlotTemplateTools.cpp b/ApplicationLibCode/Commands/PlotTemplateCommands/RicSummaryPlotTemplateTools.cpp index 13c2d73547..ef975c1510 100644 --- a/ApplicationLibCode/Commands/PlotTemplateCommands/RicSummaryPlotTemplateTools.cpp +++ b/ApplicationLibCode/Commands/PlotTemplateCommands/RicSummaryPlotTemplateTools.cpp @@ -36,6 +36,7 @@ #include "RimMainPlotCollection.h" #include "RimSummaryAddressCollection.h" #include "RimSummaryCase.h" +#include "RimSummaryCaseCollection.h" #include "RimSummaryCurve.h" #include "RimSummaryMultiPlot.h" #include "RimSummaryMultiPlotCollection.h" diff --git a/ApplicationLibCode/Commands/RicCloseSummaryCaseFeature.cpp b/ApplicationLibCode/Commands/RicCloseSummaryCaseFeature.cpp index 69a8f0dd1f..44ede1b634 100644 --- a/ApplicationLibCode/Commands/RicCloseSummaryCaseFeature.cpp +++ b/ApplicationLibCode/Commands/RicCloseSummaryCaseFeature.cpp @@ -77,6 +77,7 @@ void RicCloseSummaryCaseFeature::deleteSummaryCases( std::vectorupdateConnectedEditors(); + plot->updatePlots(); } summaryCaseMainCollection->updateAllRequiredEditors(); diff --git a/ApplicationLibCode/Commands/RicImportGeneralDataFeature.cpp b/ApplicationLibCode/Commands/RicImportGeneralDataFeature.cpp index 6aa3f1b3ff..7b409a181a 100644 --- a/ApplicationLibCode/Commands/RicImportGeneralDataFeature.cpp +++ b/ApplicationLibCode/Commands/RicImportGeneralDataFeature.cpp @@ -55,6 +55,7 @@ RicImportGeneralDataFeature::OpenCaseResults QStringList eclipseCaseFiles; QStringList eclipseInputFiles; QStringList eclipseSummaryFiles; + QStringList roffFiles; for ( const QString& fileName : fileNames ) { @@ -71,6 +72,10 @@ RicImportGeneralDataFeature::OpenCaseResults { eclipseSummaryFiles.push_back( fileName ); } + else if ( fileTypeAsInt & int( ImportFileType::ROFF_FILE ) ) + { + roffFiles.push_back( fileName ); + } } OpenCaseResults results; @@ -104,6 +109,17 @@ RicImportGeneralDataFeature::OpenCaseResults RiaApplication::instance()->setLastUsedDialogDirectory( defaultDirectoryLabel( ImportFileType::ECLIPSE_SUMMARY_FILE ), defaultDir ); } + if ( !roffFiles.empty() ) + { + if ( !openRoffCaseFromFileNames( roffFiles, createDefaultView, results.createdCaseIds ) ) + { + return OpenCaseResults(); + } + results.roffFiles = roffFiles; + RiaApplication::instance()->setLastUsedDialogDirectory( defaultDirectoryLabel( ImportFileType::ROFF_FILE ), + defaultDir ); + } + return results; } @@ -161,50 +177,112 @@ void RicImportGeneralDataFeature::setupActionLook( QAction* actionToSetup ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QStringList RicImportGeneralDataFeature::getEclipseFileNamesWithDialog( RiaDefines::ImportFileType fileType ) +QString RicImportGeneralDataFeature::getFilePattern( const std::vector& fileTypes, + bool allowWildcard ) +{ + QStringList filePatternTexts; + + if ( allowWildcard ) + { + filePatternTexts += "All Files (*.* *)"; + } + + for ( auto f : fileTypes ) + { + filePatternTexts += getFilePattern( f ); + } + + return filePatternTexts.join( ";;" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RicImportGeneralDataFeature::getFilePattern( RiaDefines::ImportFileType fileType ) { QString eclipseGridFilePattern( "*.GRID" ); QString eclipseEGridFilePattern( "*.EGRID" ); QString eclipseInputFilePattern( "*.GRDECL" ); QString eclipseSummaryFilePattern( "*.SMSPEC" ); + QString roffFilePattern( "*.ROFF *.ROFFASC" ); + + if ( fileType == ImportFileType::ANY_ECLIPSE_FILE ) + { + return QString( "Eclipse Files (%1 %2 %3 %4)" ) + .arg( eclipseGridFilePattern ) + .arg( eclipseEGridFilePattern ) + .arg( eclipseInputFilePattern ) + .arg( eclipseSummaryFilePattern ); + } + + if ( fileType == ImportFileType::ECLIPSE_EGRID_FILE ) + { + return QString( "Eclipse EGrid Files (%1)" ).arg( eclipseEGridFilePattern ); + } + + if ( fileType == ImportFileType::ECLIPSE_GRID_FILE ) + { + return QString( "Eclipse Grid Files (%1)" ).arg( eclipseGridFilePattern ); + } + if ( fileType == ImportFileType::ECLIPSE_INPUT_FILE ) + { + return QString( "Eclipse Input Files and Input Properties (%1)" ).arg( eclipseInputFilePattern ); + } + + if ( fileType == ImportFileType::ECLIPSE_SUMMARY_FILE ) + { + return QString( "Eclipse Summary File (%1)" ).arg( eclipseSummaryFilePattern ); + } + + if ( fileType == ImportFileType::ROFF_FILE ) + { + return QString( "Roff File (%1)" ).arg( roffFilePattern ); + } + + return ""; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QStringList RicImportGeneralDataFeature::getEclipseFileNamesWithDialog( RiaDefines::ImportFileType fileType ) +{ QStringList filePatternTexts; if ( fileType == ImportFileType::ANY_ECLIPSE_FILE ) { - filePatternTexts += QString( "Eclipse Files (%1 %2 %3 %4)" ) - .arg( eclipseGridFilePattern ) - .arg( eclipseEGridFilePattern ) - .arg( eclipseInputFilePattern ) - .arg( eclipseSummaryFilePattern ); + filePatternTexts += getFilePattern( ImportFileType::ANY_ECLIPSE_FILE ); } int fileTypeAsInt = int( fileType ); - if ( fileTypeAsInt & int( ImportFileType::ECLIPSE_EGRID_FILE ) ) { - filePatternTexts += QString( "Eclipse EGrid Files (%1)" ).arg( eclipseEGridFilePattern ); + filePatternTexts += getFilePattern( ImportFileType::ECLIPSE_EGRID_FILE ); } if ( fileTypeAsInt & int( ImportFileType::ECLIPSE_GRID_FILE ) ) { - filePatternTexts += QString( "Eclipse Grid Files (%1)" ).arg( eclipseGridFilePattern ); + filePatternTexts += getFilePattern( ImportFileType::ECLIPSE_GRID_FILE ); } if ( fileTypeAsInt & int( ImportFileType::ECLIPSE_INPUT_FILE ) ) { - filePatternTexts += QString( "Eclipse Input Files and Input Properties (%1)" ).arg( eclipseInputFilePattern ); + filePatternTexts += getFilePattern( ImportFileType::ECLIPSE_INPUT_FILE ); } if ( fileTypeAsInt & int( ImportFileType::ECLIPSE_SUMMARY_FILE ) ) { - filePatternTexts += QString( "Eclipse Summary File (%1)" ).arg( eclipseSummaryFilePattern ); + filePatternTexts += getFilePattern( ImportFileType::ECLIPSE_SUMMARY_FILE ); + } + if ( fileTypeAsInt & int( ImportFileType::ROFF_FILE ) ) + { + filePatternTexts += getFilePattern( ImportFileType::ROFF_FILE ); } QString fullPattern = filePatternTexts.join( ";;" ); QString defaultDir = RiaApplication::instance()->lastUsedDialogDirectory( defaultDirectoryLabel( fileType ) ); - QStringList fileNames = RiuFileDialogTools::getOpenFileNames( Riu3DMainWindowTools::mainWindowWidget(), - "Import Data File", - defaultDir, - fullPattern ); + // Use nullptr as parent to this dialog, as this function is called from both plot window and main window + QStringList fileNames = RiuFileDialogTools::getOpenFileNames( nullptr, "Import Data File", defaultDir, fullPattern ); + return fileNames; } @@ -290,3 +368,22 @@ bool RicImportGeneralDataFeature::openSummaryCaseFromFileNames( const QStringLis } return false; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicImportGeneralDataFeature::openRoffCaseFromFileNames( const QStringList& fileNames, + bool createDefaultView, + std::vector& createdCaseIds ) +{ + CAF_ASSERT( !fileNames.empty() ); + + auto generatedCaseId = RiaImportEclipseCaseTools::openRoffCaseFromFileNames( fileNames, createDefaultView ); + if ( generatedCaseId >= 0 ) + { + RiaApplication::instance()->addToRecentFiles( fileNames[0] ); + createdCaseIds.push_back( generatedCaseId ); + return true; + } + return false; +} diff --git a/ApplicationLibCode/Commands/RicImportGeneralDataFeature.h b/ApplicationLibCode/Commands/RicImportGeneralDataFeature.h index 9e7cae44b9..a108cbd40c 100644 --- a/ApplicationLibCode/Commands/RicImportGeneralDataFeature.h +++ b/ApplicationLibCode/Commands/RicImportGeneralDataFeature.h @@ -42,12 +42,14 @@ class RicImportGeneralDataFeature : public caf::CmdFeature QStringList eclipseCaseFiles; QStringList eclipseInputFiles; QStringList eclipseSummaryFiles; + QStringList roffFiles; std::vector createdCaseIds; operator bool() const { - return !( eclipseCaseFiles.empty() && eclipseInputFiles.empty() && eclipseSummaryFiles.empty() ); + return !( eclipseCaseFiles.empty() && eclipseInputFiles.empty() && eclipseSummaryFiles.empty() && + roffFiles.empty() ); } }; @@ -58,11 +60,15 @@ class RicImportGeneralDataFeature : public caf::CmdFeature static QStringList fileNamesFromCaseNames( const QStringList& caseNames ); static QStringList getEclipseFileNamesWithDialog( RiaDefines::ImportFileType fileTypes ); + static QString getFilePattern( const std::vector& fileTypes, bool allowWildcard ); + protected: bool isCommandEnabled() override; void onActionTriggered( bool isChecked ) override; void setupActionLook( QAction* actionToSetup ) override; + static QString getFilePattern( RiaDefines::ImportFileType fileType ); + static void openFileDialog( RiaDefines::ImportFileType fileTypes ); static bool openEclipseCaseFromFileNames( const QStringList& fileNames, @@ -73,4 +79,7 @@ class RicImportGeneralDataFeature : public caf::CmdFeature bool createDefaultView, std::vector& createdCaseIds ); static bool openSummaryCaseFromFileNames( const QStringList& fileNames, bool doCreateDefaultPlot = true ); + static bool openRoffCaseFromFileNames( const QStringList& fileNames, + bool createDefaultView, + std::vector& createdCaseIds ); }; diff --git a/ApplicationLibCode/Commands/RicNewContourMapViewFeature.cpp b/ApplicationLibCode/Commands/RicNewContourMapViewFeature.cpp index a0966d46b9..6e7ecc7716 100644 --- a/ApplicationLibCode/Commands/RicNewContourMapViewFeature.cpp +++ b/ApplicationLibCode/Commands/RicNewContourMapViewFeature.cpp @@ -414,12 +414,5 @@ void RicNewContourMapViewFeature::assignDefaultResultAndLegend( RimEclipseContou { contourMap->cellResult()->setResultVariable( "SOIL" ); } - - RimRegularLegendConfig* legendConfig = contourMap->cellResult()->legendConfig(); - if ( legendConfig ) - { - RimColorLegend* legend = legendConfig->mapToColorLegend( RimRegularLegendConfig::ColorRangesType::RAINBOW ); - legendConfig->setColorLegend( legend ); - } } } diff --git a/ApplicationLibCode/Commands/RicReplaceSummaryCaseFeature.cpp b/ApplicationLibCode/Commands/RicReplaceSummaryCaseFeature.cpp index ccf9682db9..b904a8cc5b 100644 --- a/ApplicationLibCode/Commands/RicReplaceSummaryCaseFeature.cpp +++ b/ApplicationLibCode/Commands/RicReplaceSummaryCaseFeature.cpp @@ -139,6 +139,7 @@ void RicReplaceSummaryCaseFeature::onActionTriggered( bool isChecked ) summaryPlot->loadDataAndUpdate(); } + multiPlot->updatePlotTitles(); } RimSummaryCrossPlotCollection* summaryCrossPlotColl = RiaSummaryTools::summaryCrossPlotCollection(); diff --git a/ApplicationLibCode/Commands/RicSelectColorResult.cpp b/ApplicationLibCode/Commands/RicSelectColorResult.cpp index e2dc6c7726..301b6f2eda 100644 --- a/ApplicationLibCode/Commands/RicSelectColorResult.cpp +++ b/ApplicationLibCode/Commands/RicSelectColorResult.cpp @@ -49,7 +49,7 @@ RimGridView* gridViewFrom2dIntersectionView( const Rim2dIntersectionView* int2dV //-------------------------------------------------------------------------------------------------- void RicSelectColorResult::setupActionLook( QAction* actionToSetup ) { - actionToSetup->setText( "Select Color Result" ); + actionToSetup->setText( "Activate Result in Project Tree" ); actionToSetup->setIcon( QIcon( ":/CellResult.png" ) ); } @@ -68,8 +68,7 @@ bool RicSelectColorResult::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicSelectColorResult::onActionTriggered( bool isChecked ) { - Rim3dView* activeView = RiaApplication::instance()->activeMainOrComparisonGridView(); - bool isComparisonView = ( activeView != RiaApplication::instance()->activeGridView() ); + Rim3dView* activeView = RiaApplication::instance()->activeReservoirView(); Rim2dIntersectionView* int2dView = dynamic_cast( activeView ); RimGridView* gridView = nullptr; @@ -82,13 +81,13 @@ void RicSelectColorResult::onActionTriggered( bool isChecked ) RimEclipseView* eclView = dynamic_cast( gridView ); if ( eclView ) { - Riu3DMainWindowTools::selectAsCurrentItem( eclView->cellResult(), int2dView == nullptr && !isComparisonView ); + Riu3DMainWindowTools::selectAsCurrentItem( eclView->cellResult(), int2dView == nullptr ); return; } RimGeoMechView* geoMechView = dynamic_cast( gridView ); if ( geoMechView ) { - Riu3DMainWindowTools::selectAsCurrentItem( geoMechView->cellResult(), int2dView == nullptr && !isComparisonView ); + Riu3DMainWindowTools::selectAsCurrentItem( geoMechView->cellResult(), int2dView == nullptr ); } } diff --git a/ApplicationLibCode/Commands/RicWellLogTools.cpp b/ApplicationLibCode/Commands/RicWellLogTools.cpp index 89fed50fd0..c85fa596df 100644 --- a/ApplicationLibCode/Commands/RicWellLogTools.cpp +++ b/ApplicationLibCode/Commands/RicWellLogTools.cpp @@ -475,19 +475,21 @@ RimWellLogCurve* RicWellLogTools::addSummaryRftCurve( RimWellLogTrack* plotTrack curve->setSummaryCase( rimCase ); auto rftReader = rimCase->rftReader(); + if ( rftReader ) + { + QString wellName; + auto wellNames = rftReader->wellNames(); + if ( !wellNames.empty() ) wellName = *wellNames.begin(); - QString wellName; - auto wellNames = rftReader->wellNames(); - if ( !wellNames.empty() ) wellName = *wellNames.begin(); + QDateTime dateTime; - QDateTime dateTime; + auto timeSteps = rftReader->availableTimeSteps( wellName ); + if ( !timeSteps.empty() ) dateTime = *timeSteps.rbegin(); - auto timeSteps = rftReader->availableTimeSteps( wellName ); - if ( !timeSteps.empty() ) dateTime = *timeSteps.rbegin(); - - RifEclipseRftAddress adr = - RifEclipseRftAddress::createAddress( wellName, dateTime, RifEclipseRftAddress::RftWellLogChannelType::PRESSURE ); - curve->setRftAddress( adr ); + RifEclipseRftAddress adr = + RifEclipseRftAddress::createAddress( wellName, dateTime, RifEclipseRftAddress::RftWellLogChannelType::PRESSURE ); + curve->setRftAddress( adr ); + } plotTrack->addCurve( curve ); @@ -497,19 +499,48 @@ RimWellLogCurve* RicWellLogTools::addSummaryRftCurve( RimWellLogTrack* plotTrack //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimWellLogCurve* RicWellLogTools::addSummaryRftSegmentCurve( RimWellLogTrack* plotTrack, - const QString& resultName, - RiaDefines::RftBranchType branchType, - RimSummaryCase* rimCase ) +RimWellLogRftCurve* RicWellLogTools::addSummaryRftSegmentCurve( RimWellLogTrack* plotTrack, + const QString& resultName, + const QString& wellName, + RiaDefines::RftBranchType branchType, + RimSummaryCase* rimCase ) { auto curve = new RimWellLogRftCurve(); curve->setSummaryCase( rimCase ); + auto rftReader = rimCase->rftReader(); + if ( rftReader ) + { + QDateTime dateTime; + + auto timeSteps = rftReader->availableTimeSteps( wellName ); + if ( !timeSteps.empty() ) dateTime = *timeSteps.rbegin(); + + RifEclipseRftAddress adr = + RifEclipseRftAddress::createBranchSegmentAddress( wellName, dateTime, resultName, 1, branchType ); + curve->setRftAddress( adr ); + curve->assignColorFromResultName( resultName ); + curve->setLineThickness( 4 ); + + curve->setInterpolation( RiuQwtPlotCurveDefines::CurveInterpolationEnum::INTERPOLATION_STEP_LEFT ); + } - QString wellName; - auto wellNames = rftReader->wellNames(); - if ( !wellNames.empty() ) wellName = *wellNames.begin(); + plotTrack->addCurve( curve ); + + return curve; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicWellLogTools::hasData( const QString& resultName, + const QString& wellName, + RiaDefines::RftBranchType branchType, + RimSummaryCase* rimCase ) +{ + auto rftReader = rimCase->rftReader(); + if ( !rftReader ) return false; QDateTime dateTime; @@ -518,13 +549,11 @@ RimWellLogCurve* RicWellLogTools::addSummaryRftSegmentCurve( RimWellLogTrack* RifEclipseRftAddress adr = RifEclipseRftAddress::createBranchSegmentAddress( wellName, dateTime, resultName, 1, branchType ); - curve->setRftAddress( adr ); - curve->setInterpolation( RiuQwtPlotCurveDefines::CurveInterpolationEnum::INTERPOLATION_STEP_LEFT ); + std::vector values; + rftReader->values( adr, &values ); - plotTrack->addCurve( curve ); - - return curve; + return !values.empty(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/RicWellLogTools.h b/ApplicationLibCode/Commands/RicWellLogTools.h index c5cb594cb6..52494a680f 100644 --- a/ApplicationLibCode/Commands/RicWellLogTools.h +++ b/ApplicationLibCode/Commands/RicWellLogTools.h @@ -77,11 +77,16 @@ class RicWellLogTools const QString& measurementName, bool showPlotWindow = true ); - static RimWellLogCurve* addSummaryRftCurve( RimWellLogTrack* plotTrack, RimSummaryCase* rimCase ); - static RimWellLogCurve* addSummaryRftSegmentCurve( RimWellLogTrack* plotTrack, - const QString& resultName, - RiaDefines::RftBranchType branchType, - RimSummaryCase* rimCase ); + static RimWellLogCurve* addSummaryRftCurve( RimWellLogTrack* plotTrack, RimSummaryCase* rimCase ); + static RimWellLogRftCurve* addSummaryRftSegmentCurve( RimWellLogTrack* plotTrack, + const QString& resultName, + const QString& wellName, + RiaDefines::RftBranchType branchType, + RimSummaryCase* rimCase ); + static bool hasData( const QString& resultName, + const QString& wellName, + RiaDefines::RftBranchType branchType, + RimSummaryCase* rimCase ); private: template diff --git a/ApplicationLibCode/Commands/RicWellMeasurementImportTools.cpp b/ApplicationLibCode/Commands/RicWellMeasurementImportTools.cpp index ccf1b96f5b..27cdde200e 100644 --- a/ApplicationLibCode/Commands/RicWellMeasurementImportTools.cpp +++ b/ApplicationLibCode/Commands/RicWellMeasurementImportTools.cpp @@ -113,6 +113,7 @@ void RicWellMeasurementImportTools::importWellMeasurementsFromFiles( const QStri if ( gridView ) { gridView->updateWellMeasurements(); + gridView->updateConnectedEditors(); } } diff --git a/ApplicationLibCode/Commands/SsiHubImportCommands/RimWellPathImport.cpp b/ApplicationLibCode/Commands/SsiHubImportCommands/RimWellPathImport.cpp index e577c63364..18a606476f 100644 --- a/ApplicationLibCode/Commands/SsiHubImportCommands/RimWellPathImport.cpp +++ b/ApplicationLibCode/Commands/SsiHubImportCommands/RimWellPathImport.cpp @@ -25,6 +25,7 @@ #include "RimWellPath.h" #include "RimWellPathCollection.h" +#include "cafPdmUiCheckBoxEditor.h" #include "cafPdmUiTreeAttributes.h" #include "cafPdmUiTreeViewEditor.h" @@ -53,7 +54,10 @@ RimWellPathImport::RimWellPathImport() CAF_PDM_InitObject( "RimWellPathImport" ); CAF_PDM_InitField( &wellTypeSurvey, "WellTypeSurvey", true, "Survey" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &wellTypeSurvey ); + CAF_PDM_InitField( &wellTypePlans, "WellTypePlans", true, "Plans" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &wellTypePlans ); caf::AppEnum defaultUtmMode = UTM_FILTER_OFF; CAF_PDM_InitField( &utmFilterMode, "UtmMode", defaultUtmMode, "Utm Filter" ); @@ -213,6 +217,22 @@ void RimWellPathImport::defineObjectEditorAttribute( QString uiConfigName, caf:: } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellPathImport::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) +{ + // NOTE: If the default uiOrdering is used, the first checkbox is not possible to interact with using the mouse + // (only keyboard). This is a workaround to make the first checkbox work. + // + // Related issue, but with an opposite fix + // https://github.com/OPM/ResInsight/commit/51443d7aa33abebfaa179e645c729fde19a64666 + // + auto group = uiOrdering.addNewGroup( "Well Types" ); + group->add( &wellTypeSurvey ); + group->add( &wellTypePlans ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/SsiHubImportCommands/RimWellPathImport.h b/ApplicationLibCode/Commands/SsiHubImportCommands/RimWellPathImport.h index 572f252e2e..b75f313cc9 100644 --- a/ApplicationLibCode/Commands/SsiHubImportCommands/RimWellPathImport.h +++ b/ApplicationLibCode/Commands/SsiHubImportCommands/RimWellPathImport.h @@ -57,6 +57,7 @@ class RimWellPathImport : public caf::PdmObject void initAfterRead() override; void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; void defineObjectEditorAttribute( QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override; + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; void updateFieldVisibility(); diff --git a/ApplicationLibCode/Commands/SsiHubImportCommands/RiuWellImportWizard.cpp b/ApplicationLibCode/Commands/SsiHubImportCommands/RiuWellImportWizard.cpp index eb43b93b88..8d910c6495 100644 --- a/ApplicationLibCode/Commands/SsiHubImportCommands/RiuWellImportWizard.cpp +++ b/ApplicationLibCode/Commands/SsiHubImportCommands/RiuWellImportWizard.cpp @@ -416,21 +416,16 @@ void RiuWellImportWizard::updateFieldsModel() if ( caf::Utils::fileExists( fileName ) ) { - ResInsightInternalJson::JsonReader jsonReader; - QMap jsonMap = jsonReader.decodeFile( fileName ); + QStringList regions; + QStringList fields; + QStringList edmIds; - QStringList regions; - QStringList fields; - QStringList edmIds; - QMapIterator it( jsonMap ); - while ( it.hasNext() ) + ResInsightInternalJson::JsonReader jsonReader; + QMap jsonMap = jsonReader.decodeFile( fileName ); + QVariantList variantList = ResInsightInternalJson::JsonReader::getVariantList( jsonMap ); + for ( const auto& listItem : variantList ) { - it.next(); - - // If we have an array, skip to next node - if ( it.key() == "length" ) continue; - - QMap fieldMap = it.value().toMap(); + QMap fieldMap = listItem.toMap(); regions.push_back( fieldMap["region"].toString() ); fields.push_back( fieldMap["name"].toString() ); @@ -641,17 +636,11 @@ void RiuWellImportWizard::parseWellsResponse( RimOilFieldEntry* oilFieldEntry ) if ( caf::Utils::fileExists( oilFieldEntry->wellsFilePath ) ) { ResInsightInternalJson::JsonReader jsonReader; - QMap jsonMap = jsonReader.decodeFile( oilFieldEntry->wellsFilePath ); - - QMapIterator it( jsonMap ); - while ( it.hasNext() ) + QMap jsonMap = jsonReader.decodeFile( oilFieldEntry->wellsFilePath ); + QVariantList variantList = ResInsightInternalJson::JsonReader::getVariantList( jsonMap ); + for ( const auto& listItem : variantList ) { - it.next(); - - // If we have an array, skip to next node - if ( it.key() == "length" ) continue; - - QMap rootMap = it.value().toMap(); + QMap rootMap = listItem.toMap(); if ( m_wellPathImportObject->wellTypeSurvey ) { @@ -865,6 +854,7 @@ WellSelectionPage::WellSelectionPage( RimWellPathImport* wellPathImport, QWidget m_regionsWithVisibleWells = new ObjectGroupWithHeaders; m_regionsWithVisibleWells->objects.uiCapability()->setUiHidden( true ); + m_regionsWithVisibleWells->objects.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- @@ -911,6 +901,7 @@ void WellSelectionPage::buildWellTreeView() { caf::PdmObjectCollection* regGroup = new caf::PdmObjectCollection; regGroup->objects.uiCapability()->setUiHidden( true ); + regGroup->objects.uiCapability()->setUiTreeHidden( true ); regGroup->setUiName( oilRegion->userDescriptionField()->uiCapability()->uiValue().toString() ); @@ -923,6 +914,7 @@ void WellSelectionPage::buildWellTreeView() { caf::PdmObjectCollection* fieldGroup = new caf::PdmObjectCollection; fieldGroup->objects.uiCapability()->setUiHidden( true ); + fieldGroup->objects.uiCapability()->setUiTreeHidden( true ); fieldGroup->setUiName( oilField->userDescriptionField()->uiCapability()->uiValue().toString() ); @@ -932,7 +924,8 @@ void WellSelectionPage::buildWellTreeView() { RimWellPathEntry* wellPathEntry = oilField->wells[wIdx]; - // Create a copy of the PdmObject, as it is not supported to have multiple parents of any objects + // Create a copy of the PdmObject, as it is not supported to have multiple parents of any + // objects QString objStr = wellPathEntry->writeObjectToXmlString(); RimWellPathEntry* wellPathCopy = new RimWellPathEntry; @@ -1026,8 +1019,8 @@ void WellSelectionPage::customMenuRequested( const QPoint& pos ) menuBuilder.appendToMenu( &menu ); - // Qt doc: QAbstractScrollArea and its subclasses that map the context menu event to coordinates of the viewport(). - // Since we might get this signal from different treeViews, we need to map the position accordingly. + // Qt doc: QAbstractScrollArea and its subclasses that map the context menu event to coordinates of the + // viewport(). Since we might get this signal from different treeViews, we need to map the position accordingly. QObject* senderObj = this->sender(); QTreeView* treeView = dynamic_cast( senderObj ); if ( treeView ) diff --git a/ApplicationLibCode/Commands/SummaryPlotCommands/RicDeleteSubPlotCtxFeature.cpp b/ApplicationLibCode/Commands/SummaryPlotCommands/RicDeleteSubPlotCtxFeature.cpp index b9b107e2c7..12ca362f8e 100644 --- a/ApplicationLibCode/Commands/SummaryPlotCommands/RicDeleteSubPlotCtxFeature.cpp +++ b/ApplicationLibCode/Commands/SummaryPlotCommands/RicDeleteSubPlotCtxFeature.cpp @@ -18,6 +18,8 @@ #include "RicDeleteSubPlotCtxFeature.h" +#include + CAF_CMD_SOURCE_INIT( RicDeleteSubPlotCtxFeature, "RicDeleteSubPlotCtxFeature" ); //-------------------------------------------------------------------------------------------------- @@ -27,3 +29,12 @@ bool RicDeleteSubPlotCtxFeature::isCommandEnabled() { return true; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicDeleteSubPlotCtxFeature::setupActionLook( QAction* actionToSetup ) +{ + RicDeleteSubPlotFeature::setupActionLook( actionToSetup ); + actionToSetup->setShortcut( QKeySequence() ); +} diff --git a/ApplicationLibCode/Commands/SummaryPlotCommands/RicDeleteSubPlotCtxFeature.h b/ApplicationLibCode/Commands/SummaryPlotCommands/RicDeleteSubPlotCtxFeature.h index e0643f4783..bf0cc88b31 100644 --- a/ApplicationLibCode/Commands/SummaryPlotCommands/RicDeleteSubPlotCtxFeature.h +++ b/ApplicationLibCode/Commands/SummaryPlotCommands/RicDeleteSubPlotCtxFeature.h @@ -29,4 +29,5 @@ class RicDeleteSubPlotCtxFeature : public RicDeleteSubPlotFeature protected: bool isCommandEnabled() override; + void setupActionLook( QAction* actionToSetup ) override; }; diff --git a/ApplicationLibCode/Commands/SummaryPlotCommands/RicNewSummaryEnsembleCurveSetFeature.cpp b/ApplicationLibCode/Commands/SummaryPlotCommands/RicNewSummaryEnsembleCurveSetFeature.cpp index de037df0d8..e636932967 100644 --- a/ApplicationLibCode/Commands/SummaryPlotCommands/RicNewSummaryEnsembleCurveSetFeature.cpp +++ b/ApplicationLibCode/Commands/SummaryPlotCommands/RicNewSummaryEnsembleCurveSetFeature.cpp @@ -32,6 +32,7 @@ #include "RimMainPlotCollection.h" #include "RimOilField.h" #include "RimProject.h" +#include "RimSummaryCaseCollection.h" #include "RimSummaryCaseMainCollection.h" #include "RimSummaryCurve.h" #include "RimSummaryCurveAppearanceCalculator.h" diff --git a/ApplicationLibCode/Commands/SummaryPlotCommands/RicPasteSummaryCurveFeature.cpp b/ApplicationLibCode/Commands/SummaryPlotCommands/RicPasteSummaryCurveFeature.cpp index ec9177fa2c..cf17cb8c03 100644 --- a/ApplicationLibCode/Commands/SummaryPlotCommands/RicPasteSummaryCurveFeature.cpp +++ b/ApplicationLibCode/Commands/SummaryPlotCommands/RicPasteSummaryCurveFeature.cpp @@ -68,7 +68,7 @@ RimSummaryCurve* RicPasteSummaryCurveFeature::copyCurveAndAddToPlot( RimSummaryC summaryPlot->firstAncestorOrThisOfType( summaryMultiPlot ); if ( summaryMultiPlot ) { - summaryMultiPlot->updatePlotWindowTitle(); + summaryMultiPlot->updatePlotTitles(); } else { diff --git a/ApplicationLibCode/Commands/ViewLink/RicCompareTo3dViewFeature.cpp b/ApplicationLibCode/Commands/ViewLink/RicCompareTo3dViewFeature.cpp index ab9dc5b782..d44671a665 100644 --- a/ApplicationLibCode/Commands/ViewLink/RicCompareTo3dViewFeature.cpp +++ b/ApplicationLibCode/Commands/ViewLink/RicCompareTo3dViewFeature.cpp @@ -42,7 +42,7 @@ bool RicCompareTo3dViewFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicCompareTo3dViewFeature::onActionTriggered( bool isChecked ) { - RimGridView* activeView = RiaApplication::instance()->activeGridView(); + auto* activeView = RiaApplication::instance()->activeReservoirView(); QVariant userData = this->userData(); auto view = static_cast( userData.value() ); @@ -51,7 +51,9 @@ void RicCompareTo3dViewFeature::onActionTriggered( bool isChecked ) { activeView->setComparisonView( view ); activeView->scheduleCreateDisplayModelAndRedraw(); - activeView->overlayInfoConfig()->updateConnectedEditors(); + + auto gridView = dynamic_cast( activeView ); + if ( gridView ) gridView->overlayInfoConfig()->updateConnectedEditors(); } } diff --git a/ApplicationLibCode/Commands/ViewLink/RicDeleteAllLinkedViewsFeature.cpp b/ApplicationLibCode/Commands/ViewLink/RicDeleteAllLinkedViewsFeature.cpp index fc60d154ce..0047fb35c9 100644 --- a/ApplicationLibCode/Commands/ViewLink/RicDeleteAllLinkedViewsFeature.cpp +++ b/ApplicationLibCode/Commands/ViewLink/RicDeleteAllLinkedViewsFeature.cpp @@ -19,6 +19,7 @@ #include "RicDeleteAllLinkedViewsFeature.h" +#include "RimEclipseContourMapView.h" #include "RimGridView.h" #include "RimProject.h" #include "RimViewLinker.h" @@ -58,7 +59,7 @@ class DeleteAllLinkedViewsImpl //-------------------------------------------------------------------------------------------------- bool RicDeleteAllLinkedViewsFeature::isCommandEnabled() { - return caf::SelectionManager::instance()->selectedItemAncestorOfType() != nullptr; + return caf::SelectionManager::instance()->selectedItemOfType() != nullptr; } //-------------------------------------------------------------------------------------------------- @@ -66,7 +67,27 @@ bool RicDeleteAllLinkedViewsFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicDeleteAllLinkedViewsFeature::onActionTriggered( bool isChecked ) { - DeleteAllLinkedViewsImpl::execute(); + RimProject* proj = RimProject::current(); + + RimViewLinker* viewLinker = proj->viewLinkerCollection()->viewLinker(); + if ( viewLinker ) + { + // Remove the view linker object from the view linker collection + // viewLinkerCollection->viewLinker is a PdmChildField containing one RimViewLinker child object + proj->viewLinkerCollection->viewLinker.removeChild( viewLinker ); + + auto views = viewLinker->allViews(); + + viewLinker->applyCellFilterCollectionByUserChoice(); + delete viewLinker; + + for ( auto v : views ) + { + if ( dynamic_cast( v ) ) v->zoomAll(); + } + + proj->uiCapability()->updateConnectedEditors(); + } } //-------------------------------------------------------------------------------------------------- @@ -76,4 +97,5 @@ void RicDeleteAllLinkedViewsFeature::setupActionLook( QAction* actionToSetup ) { actionToSetup->setText( "Unlink All Views" ); actionToSetup->setIcon( QIcon( ":/UnLinkView.svg" ) ); + actionToSetup->setShortcut( Qt::Key_Delete ); } diff --git a/ApplicationLibCode/Commands/ViewLink/RicLinkViewFeature.cpp b/ApplicationLibCode/Commands/ViewLink/RicLinkViewFeature.cpp index b039bcece8..b2f06aeafe 100644 --- a/ApplicationLibCode/Commands/ViewLink/RicLinkViewFeature.cpp +++ b/ApplicationLibCode/Commands/ViewLink/RicLinkViewFeature.cpp @@ -24,8 +24,6 @@ #include "RicLinkVisibleViewsFeature.h" #include "Rim3dView.h" -#include "RimEclipseContourMapView.h" -#include "RimGeoMechContourMapView.h" #include "RimGridView.h" #include "RimProject.h" #include "RimViewLinker.h" @@ -55,10 +53,8 @@ class RicLinkViewFeatureImpl if ( contextViewer ) { // Link only the active view to an existing view link collection. - RimGridView* activeView = RiaApplication::instance()->activeGridView(); + auto* activeView = RiaApplication::instance()->activeReservoirView(); if ( !activeView ) return false; - if ( dynamic_cast( activeView ) ) return false; - if ( dynamic_cast( activeView ) ) return false; if ( activeView->assosiatedViewLinker() ) return false; @@ -66,33 +62,20 @@ class RicLinkViewFeatureImpl return true; } - std::vector selectedGridViews; + std::vector selectedGridViews; caf::SelectionManager::instance()->objectsByTypeStrict( &selectedGridViews ); - bool hasAnyUnlinkableViews = false; for ( auto gridView : selectedGridViews ) { if ( !gridView ) continue; - if ( dynamic_cast( gridView ) ) - { - hasAnyUnlinkableViews = true; - break; - } - - if ( dynamic_cast( gridView ) ) - { - hasAnyUnlinkableViews = true; - break; - } - if ( !gridView->assosiatedViewLinker() ) { m_viewsToLink.push_back( gridView ); } } - if ( !m_viewsToLink.empty() && !hasAnyUnlinkableViews ) + if ( !m_viewsToLink.empty() ) { return true; } @@ -102,10 +85,10 @@ class RicLinkViewFeatureImpl void execute() { RicLinkVisibleViewsFeature::linkViews( m_viewsToLink ); } - const std::vector& viewsToLink() { return m_viewsToLink; } + const std::vector& viewsToLink() { return m_viewsToLink; } private: - std::vector m_viewsToLink; + std::vector m_viewsToLink; }; //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/ViewLink/RicLinkVisibleViewsFeature.cpp b/ApplicationLibCode/Commands/ViewLink/RicLinkVisibleViewsFeature.cpp index 30d2d2e50a..4b07022a42 100644 --- a/ApplicationLibCode/Commands/ViewLink/RicLinkVisibleViewsFeature.cpp +++ b/ApplicationLibCode/Commands/ViewLink/RicLinkVisibleViewsFeature.cpp @@ -21,8 +21,6 @@ #include "RicLinkVisibleViewsFeatureUi.h" -#include "RimEclipseContourMapView.h" -#include "RimGeoMechContourMapView.h" #include "RimGridView.h" #include "RimProject.h" #include "RimViewController.h" @@ -46,29 +44,18 @@ bool RicLinkVisibleViewsFeature::isCommandEnabled() RimProject* proj = RimProject::current(); if ( !proj ) return false; - std::vector visibleViews; - std::vector linkedviews; - std::vector visibleGridViews; - + std::vector visibleViews; proj->allVisibleViews( visibleViews ); - for ( Rim3dView* view : visibleViews ) - { - RimGridView* gridView = dynamic_cast( view ); - if ( gridView ) visibleGridViews.push_back( gridView ); - } + std::vector linkedviews; if ( proj->viewLinkerCollection() && proj->viewLinkerCollection()->viewLinker() ) { - proj->viewLinkerCollection()->viewLinker()->allViews( linkedviews ); + linkedviews = proj->viewLinkerCollection()->viewLinker()->allViews(); } - if ( visibleGridViews.size() >= 2 && ( linkedviews.size() < visibleGridViews.size() ) ) + if ( visibleViews.size() >= 2 && ( linkedviews.size() < visibleViews.size() ) ) { - std::vector views; - findLinkableVisibleViews( views ); - RicLinkVisibleViewsFeatureUi testUi; - testUi.setViews( views ); - return !testUi.masterViewCandidates().empty(); + return !findLinkableVisibleViews().empty(); } return false; @@ -79,10 +66,8 @@ bool RicLinkVisibleViewsFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicLinkVisibleViewsFeature::onActionTriggered( bool isChecked ) { - std::vector linkableViews; - findLinkableVisibleViews( linkableViews ); - - linkViews( linkableViews ); + auto linkableViews = findLinkableVisibleViews(); + RicLinkVisibleViewsFeature::linkViews( linkableViews ); } //-------------------------------------------------------------------------------------------------- @@ -97,70 +82,50 @@ void RicLinkVisibleViewsFeature::setupActionLook( QAction* actionToSetup ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RicLinkVisibleViewsFeature::allLinkedViews( std::vector& views ) +std::vector RicLinkVisibleViewsFeature::findLinkableVisibleViews() { RimProject* proj = RimProject::current(); - if ( proj->viewLinkerCollection()->viewLinker() ) - { - proj->viewLinkerCollection()->viewLinker()->allViews( views ); - } -} -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RicLinkVisibleViewsFeature::findLinkableVisibleViews( std::vector& views ) -{ - RimProject* proj = RimProject::current(); - - std::vector alreadyLinkedViews; - allLinkedViews( alreadyLinkedViews ); + std::vector views; - std::vector visibleGridViews; - proj->allVisibleGridViews( visibleGridViews ); + std::vector candidates; + proj->allVisibleViews( candidates ); - for ( auto gridView : visibleGridViews ) + for ( auto gridView : candidates ) { - if ( !gridView ) continue; - if ( dynamic_cast( gridView ) ) continue; - if ( dynamic_cast( gridView ) ) continue; - if ( gridView->assosiatedViewLinker() ) continue; - - views.push_back( gridView ); + if ( gridView && !gridView->assosiatedViewLinker() ) views.push_back( gridView ); } + + return views; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RicLinkVisibleViewsFeature::linkViews( std::vector& linkableViews ) +void RicLinkVisibleViewsFeature::linkViews( std::vector& linkableViews ) { + if ( linkableViews.empty() ) return; + RimProject* proj = RimProject::current(); RimViewLinker* viewLinker = proj->viewLinkerCollection->viewLinker(); - std::vector masterCandidates = linkableViews; - if ( !viewLinker ) { - // Create a new view linker - - RimGridView* masterView = masterCandidates.front(); - viewLinker = new RimViewLinker; proj->viewLinkerCollection()->viewLinker = viewLinker; - viewLinker->setMasterView( masterView ); + viewLinker->setMasterView( linkableViews.front() ); } - for ( RimGridView* rimView : linkableViews ) - { - if ( rimView == viewLinker->masterView() ) continue; + Rim3dView* primaryView = viewLinker->masterView(); - viewLinker->addDependentView( rimView ); + auto matchingViews = RicLinkVisibleViewsFeature::matchingViews( primaryView, linkableViews ); + for ( auto v : matchingViews ) + { + viewLinker->addDependentView( v ); } viewLinker->updateDependentViews(); - viewLinker->updateUiNameAndIcon(); proj->viewLinkerCollection.uiCapability()->updateConnectedEditors(); @@ -168,3 +133,35 @@ void RicLinkVisibleViewsFeature::linkViews( std::vector& linkableV Riu3DMainWindowTools::setExpanded( proj->viewLinkerCollection() ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RicLinkVisibleViewsFeature::matchingViews( Rim3dView* primaryView, + std::vector& candidates ) +{ + if ( !primaryView ) return {}; + + std::vector matchingViews; + + RiaDefines::View3dContent primaryContent = primaryView->viewContent(); + if ( primaryContent == RiaDefines::View3dContent::FLAT_INTERSECTION ) + { + for ( auto v : candidates ) + { + if ( v != primaryView && v->viewContent() == RiaDefines::View3dContent::FLAT_INTERSECTION ) + matchingViews.emplace_back( v ); + } + + return matchingViews; + } + + // We have a 3D view or contour map as primary view, include all views except flat intersection views + for ( auto v : candidates ) + { + if ( v != primaryView && v->viewContent() != RiaDefines::View3dContent::FLAT_INTERSECTION ) + matchingViews.emplace_back( v ); + } + + return matchingViews; +} diff --git a/ApplicationLibCode/Commands/ViewLink/RicLinkVisibleViewsFeature.h b/ApplicationLibCode/Commands/ViewLink/RicLinkVisibleViewsFeature.h index 32e29d854d..4f3d4ad0f7 100644 --- a/ApplicationLibCode/Commands/ViewLink/RicLinkVisibleViewsFeature.h +++ b/ApplicationLibCode/Commands/ViewLink/RicLinkVisibleViewsFeature.h @@ -23,7 +23,7 @@ #include -class RimGridView; +class Rim3dView; //================================================================================================== /// @@ -33,7 +33,9 @@ class RicLinkVisibleViewsFeature : public caf::CmdFeature CAF_CMD_HEADER_INIT; public: - static void linkViews( std::vector& views ); + static void linkViews( std::vector& views ); + + static std::vector matchingViews( Rim3dView* primaryView, std::vector& candidates ); protected: bool isCommandEnabled() override; @@ -42,6 +44,5 @@ class RicLinkVisibleViewsFeature : public caf::CmdFeature void setupActionLook( QAction* actionToSetup ) override; private: - void findLinkableVisibleViews( std::vector& views ); - void allLinkedViews( std::vector& views ); + static std::vector findLinkableVisibleViews(); }; diff --git a/ApplicationLibCode/Commands/ViewLink/RicLinkVisibleViewsFeatureUi.cpp b/ApplicationLibCode/Commands/ViewLink/RicLinkVisibleViewsFeatureUi.cpp index d95b6fd42f..77743ddf12 100644 --- a/ApplicationLibCode/Commands/ViewLink/RicLinkVisibleViewsFeatureUi.cpp +++ b/ApplicationLibCode/Commands/ViewLink/RicLinkVisibleViewsFeatureUi.cpp @@ -22,9 +22,8 @@ #include "RiaApplication.h" #include "RiaOptionItemFactory.h" +#include "Rim3dView.h" #include "RimCase.h" -#include "RimEclipseContourMapView.h" -#include "RimGridView.h" #include "RimViewLinker.h" CAF_PDM_SOURCE_INIT( RicLinkVisibleViewsFeatureUi, "RicLinkVisibleViewsFeatureUi" ); @@ -32,7 +31,7 @@ CAF_PDM_SOURCE_INIT( RicLinkVisibleViewsFeatureUi, "RicLinkVisibleViewsFeatureUi //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RicLinkVisibleViewsFeatureUi::RicLinkVisibleViewsFeatureUi( void ) +RicLinkVisibleViewsFeatureUi::RicLinkVisibleViewsFeatureUi() { CAF_PDM_InitObject( "Link Visible Views Feature UI", ":/LinkView.svg" ); @@ -42,56 +41,35 @@ RicLinkVisibleViewsFeatureUi::RicLinkVisibleViewsFeatureUi( void ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RicLinkVisibleViewsFeatureUi::setViews( const std::vector& allViews ) +void RicLinkVisibleViewsFeatureUi::setViews( const std::vector& allViews ) { m_allViews = allViews; - RimGridView* activeView = RiaApplication::instance()->activeGridView(); + auto activeView = RiaApplication::instance()->activeReservoirView(); - std::vector masterCandidates = masterViewCandidates(); - - // Set Active view as master view if the active view isn't a contour map. - for ( size_t i = 0; i < masterCandidates.size(); i++ ) + for ( size_t i = 0; i < m_allViews.size(); i++ ) { - if ( activeView == masterCandidates[i] ) + if ( activeView == m_allViews[i] ) { m_masterView = allViews[i]; } } // Fallback to use first view if no active view is present - if ( !m_masterView && masterCandidates.size() > 0 ) + if ( !m_masterView && !m_allViews.empty() ) { - m_masterView = masterCandidates[0]; + m_masterView = m_allViews[0]; } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimGridView* RicLinkVisibleViewsFeatureUi::masterView() +Rim3dView* RicLinkVisibleViewsFeatureUi::masterView() { return m_masterView; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -std::vector RicLinkVisibleViewsFeatureUi::masterViewCandidates() const -{ - std::vector masterCandidates; - // Set Active view as master view if the active view isn't a contour map. - for ( size_t i = 0; i < m_allViews.size(); i++ ) - { - RimEclipseContourMapView* contourMap = dynamic_cast( m_allViews[i] ); - if ( contourMap == nullptr ) - { - masterCandidates.push_back( m_allViews[i] ); - } - } - return masterCandidates; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -102,7 +80,7 @@ QList if ( fieldNeedingOptions == &m_masterView ) { - for ( RimGridView* v : masterViewCandidates() ) + for ( auto v : m_allViews ) { RiaOptionItemFactory::appendOptionItemFromViewNameAndCaseName( v, &options ); } diff --git a/ApplicationLibCode/Commands/ViewLink/RicLinkVisibleViewsFeatureUi.h b/ApplicationLibCode/Commands/ViewLink/RicLinkVisibleViewsFeatureUi.h index ab65235bf3..b7366afd3b 100644 --- a/ApplicationLibCode/Commands/ViewLink/RicLinkVisibleViewsFeatureUi.h +++ b/ApplicationLibCode/Commands/ViewLink/RicLinkVisibleViewsFeatureUi.h @@ -25,7 +25,7 @@ #include -class RimGridView; +class Rim3dView; //================================================================================================== /// @@ -37,15 +37,14 @@ class RicLinkVisibleViewsFeatureUi : public caf::PdmObject public: RicLinkVisibleViewsFeatureUi( void ); - void setViews( const std::vector& allViews ); - RimGridView* masterView(); - std::vector masterViewCandidates() const; + void setViews( const std::vector& allViews ); + Rim3dView* masterView(); protected: QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; private: - caf::PdmPtrField m_masterView; + caf::PdmPtrField m_masterView; - std::vector m_allViews; + std::vector m_allViews; }; diff --git a/ApplicationLibCode/Commands/ViewLink/RicSetMasterViewFeature.cpp b/ApplicationLibCode/Commands/ViewLink/RicSetMasterViewFeature.cpp index 46370e18c2..e521990720 100644 --- a/ApplicationLibCode/Commands/ViewLink/RicSetMasterViewFeature.cpp +++ b/ApplicationLibCode/Commands/ViewLink/RicSetMasterViewFeature.cpp @@ -67,7 +67,7 @@ void RicSetMasterViewFeature::onActionTriggered( bool isChecked ) viewLinker->applyCellFilterCollectionByUserChoice(); - RimGridView* previousMasterView = viewLinker->masterView(); + auto previousMasterView = viewLinker->masterView(); viewLinker->setMasterView( activeView ); viewLinker->updateDependentViews(); diff --git a/ApplicationLibCode/Commands/ViewLink/RicShowAllLinkedViewsFeature.cpp b/ApplicationLibCode/Commands/ViewLink/RicShowAllLinkedViewsFeature.cpp index f22a411cef..443f21d7fc 100644 --- a/ApplicationLibCode/Commands/ViewLink/RicShowAllLinkedViewsFeature.cpp +++ b/ApplicationLibCode/Commands/ViewLink/RicShowAllLinkedViewsFeature.cpp @@ -47,23 +47,21 @@ void RicShowAllLinkedViewsFeature::onActionTriggered( bool isChecked ) std::vector managedViews; caf::SelectionManager::instance()->objectsByType( &managedViews ); - for ( size_t i = 0; i < managedViews.size(); i++ ) + for ( auto& managedView : managedViews ) { RimViewLinker* rimLinked = nullptr; - managedViews[i]->firstAncestorOrThisOfType( rimLinked ); + managedView->firstAncestorOrThisOfType( rimLinked ); CVF_ASSERT( rimLinked ); linkedViews.push_back( rimLinked ); } - for ( size_t i = 0; i < linkedViews.size(); i++ ) + for ( auto& linkedView : linkedViews ) { - std::vector views; - linkedViews[i]->allViews( views ); - - for ( size_t j = 0; j < views.size(); j++ ) + auto views = linkedView->allViews(); + for ( auto& view : views ) { - views[j]->forceShowWindowOn(); + view->forceShowWindowOn(); } } } diff --git a/ApplicationLibCode/Commands/ViewLink/RicUnLinkViewFeature.cpp b/ApplicationLibCode/Commands/ViewLink/RicUnLinkViewFeature.cpp index b399451539..df3629bad8 100644 --- a/ApplicationLibCode/Commands/ViewLink/RicUnLinkViewFeature.cpp +++ b/ApplicationLibCode/Commands/ViewLink/RicUnLinkViewFeature.cpp @@ -22,15 +22,16 @@ #include "RiaApplication.h" #include "Rim3dView.h" +#include "RimEclipseContourMapView.h" #include "RimGridView.h" #include "RimProject.h" #include "RimViewController.h" #include "RimViewLinker.h" +#include "RimViewLinkerCollection.h" #include "cafCmdFeatureManager.h" #include "cafSelectionManager.h" -#include "RimViewLinkerCollection.h" #include CAF_CMD_SOURCE_INIT( RicUnLinkViewFeature, "RicUnLinkViewFeature" ); @@ -40,8 +41,7 @@ CAF_CMD_SOURCE_INIT( RicUnLinkViewFeature, "RicUnLinkViewFeature" ); //-------------------------------------------------------------------------------------------------- bool RicUnLinkViewFeature::isCommandEnabled() { - Rim3dView* activeView = RiaApplication::instance()->activeMainOrComparisonGridView(); - ; + Rim3dView* activeView = RiaApplication::instance()->activeReservoirView(); if ( !activeView ) return false; if ( activeView->assosiatedViewLinker() ) @@ -57,8 +57,7 @@ bool RicUnLinkViewFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicUnLinkViewFeature::onActionTriggered( bool isChecked ) { - Rim3dView* activeView = RiaApplication::instance()->activeMainOrComparisonGridView(); - ; + Rim3dView* activeView = RiaApplication::instance()->activeReservoirView(); if ( !activeView ) return; RimViewController* viewController = activeView->viewController(); @@ -68,14 +67,15 @@ void RicUnLinkViewFeature::onActionTriggered( bool isChecked ) { viewController->applyCellFilterCollectionByUserChoice(); delete viewController; - viewLinker->removeViewController( nullptr ); // Remove the slots in the vector that was set to nullptr by the - // destructor + + // Remove the slots in the vector that was set to nullptr by the destructor + viewLinker->removeViewController( nullptr ); } else if ( viewLinker ) { viewLinker->applyCellFilterCollectionByUserChoice(); - RimGridView* firstControlledView = viewLinker->firstControlledView(); + Rim3dView* firstControlledView = viewLinker->firstControlledView(); if ( firstControlledView ) { @@ -94,6 +94,8 @@ void RicUnLinkViewFeature::onActionTriggered( bool isChecked ) activeView->updateAutoName(); } + if ( dynamic_cast( activeView ) ) activeView->zoomAll(); + RimProject::current()->viewLinkerCollection.uiCapability()->updateConnectedEditors(); RimProject::current()->uiCapability()->updateConnectedEditors(); } diff --git a/ApplicationLibCode/Commands/WellLogCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/WellLogCommands/CMakeLists_files.cmake index 93357db61e..23a333ee2d 100644 --- a/ApplicationLibCode/Commands/WellLogCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/WellLogCommands/CMakeLists_files.cmake @@ -29,6 +29,7 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RicNewEnsembleWellLogCurveSetFeature.h ${CMAKE_CURRENT_LIST_DIR}/RicNewRftWellLogPlotFeature.h ${CMAKE_CURRENT_LIST_DIR}/RicNewRftSegmentWellLogPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewMultiPhaseRftSegmentPlotFeature.h ) set(SOURCE_GROUP_SOURCE_FILES @@ -62,6 +63,7 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RicNewEnsembleWellLogCurveSetFeature.cpp ${CMAKE_CURRENT_LIST_DIR}/RicNewRftWellLogPlotFeature.cpp ${CMAKE_CURRENT_LIST_DIR}/RicNewRftSegmentWellLogPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewMultiPhaseRftSegmentPlotFeature.cpp ) list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) diff --git a/ApplicationLibCode/Commands/WellLogCommands/RicNewMultiPhaseRftSegmentPlotFeature.cpp b/ApplicationLibCode/Commands/WellLogCommands/RicNewMultiPhaseRftSegmentPlotFeature.cpp new file mode 100644 index 0000000000..bd6fb360fb --- /dev/null +++ b/ApplicationLibCode/Commands/WellLogCommands/RicNewMultiPhaseRftSegmentPlotFeature.cpp @@ -0,0 +1,159 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022 Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicNewMultiPhaseRftSegmentPlotFeature.h" +#include "RicNewRftSegmentWellLogPlotFeature.h" + +#include "RicNewWellLogPlotFeatureImpl.h" +#include "RicWellLogPlotCurveFeatureImpl.h" +#include "RicWellLogTools.h" + +#include "RiaApplication.h" +#include "RiaLogging.h" +#include "RiaPlotWindowRedrawScheduler.h" +#include "RiaRftDefines.h" + +#include "RifReaderOpmRft.h" + +#include "RimRftCase.h" +#include "RimRftTopologyCurve.h" +#include "RimSummaryCase.h" +#include "RimWellLogPlot.h" +#include "RimWellLogRftCurve.h" +#include "RimWellLogTrack.h" + +#include "RiuPlotMainWindowTools.h" + +#include "cafSelectionManager.h" + +#include + +CAF_CMD_SOURCE_INIT( RicNewMultiPhaseRftSegmentPlotFeature, "RicNewMultiPhaseRftSegmentPlotFeature" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicNewMultiPhaseRftSegmentPlotFeature::isCommandEnabled() +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicNewMultiPhaseRftSegmentPlotFeature::onActionTriggered( bool isChecked ) +{ + auto rftCase = caf::SelectionManager::instance()->selectedItemOfType(); + if ( !rftCase ) return; + + RimSummaryCase* summaryCase = nullptr; + rftCase->firstAncestorOfType( summaryCase ); + if ( !summaryCase ) return; + + auto rftReader = summaryCase->rftReader(); + if ( !rftReader ) + { + RiaLogging::error( "Could not open RFT file or no RFT file present. " ); + return; + } + + auto plot = RicNewWellLogPlotFeatureImpl::createHorizontalWellLogPlot(); + + QString wellName = "Unknown"; + + auto wellNames = rftReader->wellNames(); + if ( !wellNames.empty() ) wellName = *wellNames.begin(); + + appendTrackAndCurveForBranchType( plot, + "Connection Rates", + { "CONGRAT", "CONORAT", "CONWRAT" }, + wellName, + RiaDefines::RftBranchType::RFT_ANNULUS, + summaryCase ); + + { + for ( auto branchType : { RiaDefines::RftBranchType::RFT_ANNULUS, + RiaDefines::RftBranchType::RFT_DEVICE, + RiaDefines::RftBranchType::RFT_TUBING } ) + { + appendTrackAndCurveForBranchType( plot, + "Segment Rates", + { "SEGGRAT", "SEGORAT", "SEGWRAT" }, + wellName, + branchType, + summaryCase ); + } + } + + RicNewRftSegmentWellLogPlotFeature::appendPressureTrack( plot, wellName, summaryCase ); + RicNewRftSegmentWellLogPlotFeature::appendConnectionFactorTrack( plot, wellName, summaryCase ); + RicNewRftSegmentWellLogPlotFeature::appendTopologyTrack( plot, wellName, summaryCase ); + + plot->loadDataAndUpdate(); + + RiaPlotWindowRedrawScheduler::instance()->performScheduledUpdatesAndReplots(); + plot->updateLayout(); + + RiuPlotMainWindowTools::onObjectAppended( plot ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicNewMultiPhaseRftSegmentPlotFeature::appendTrackAndCurveForBranchType( RimWellLogPlot* plot, + const QString& trackName, + const std::vector& resultNames, + const QString& wellName, + RiaDefines::RftBranchType branchType, + RimSummaryCase* summaryCase ) +{ + auto plotTrack = new RimWellLogTrack(); + plot->addPlot( plotTrack ); + plotTrack->setDescription( trackName ); + + plot->loadDataAndUpdate(); + + for ( const auto& resultName : resultNames ) + { + auto curve = RicWellLogTools::addSummaryRftSegmentCurve( plotTrack, resultName, wellName, branchType, summaryCase ); + curve->setNamingMethod( RiaDefines::ObjectNamingMethod::TEMPLATE ); + + QString templateText = RiaDefines::namingVariableResultName() + ", " + RiaDefines::namingVariableResultType(); + curve->setCurveNameTemplateText( templateText ); + + if ( resultName == "SEGGRAT" || resultName == "CONGRAT" ) + { + curve->setScaleFactor( 1e-3 ); + } + curve->setFillStyle( Qt::SolidPattern ); + + curve->setIsStacked( true ); + curve->loadDataAndUpdate( true ); + + curve->updateAllRequiredEditors(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicNewMultiPhaseRftSegmentPlotFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setText( "Create RFT Multi Phase Segment Plot" ); + actionToSetup->setIcon( QIcon( ":/WellLogCurve16x16.png" ) ); +} diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicNewFaultReactAssessmentFeature.h b/ApplicationLibCode/Commands/WellLogCommands/RicNewMultiPhaseRftSegmentPlotFeature.h similarity index 63% rename from ApplicationLibCode/Commands/GeoMechCommands/RicNewFaultReactAssessmentFeature.h rename to ApplicationLibCode/Commands/WellLogCommands/RicNewMultiPhaseRftSegmentPlotFeature.h index 2761f9e364..4ddd255a75 100644 --- a/ApplicationLibCode/Commands/GeoMechCommands/RicNewFaultReactAssessmentFeature.h +++ b/ApplicationLibCode/Commands/WellLogCommands/RicNewMultiPhaseRftSegmentPlotFeature.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////////// // -// Copyright (C) 2021 Equinor ASA +// Copyright (C) 2022 Equinor ASA // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -18,33 +18,30 @@ #pragma once +#include "RiaRftDefines.h" + #include "cafCmdFeature.h" -class RimFaultRAPreprocSettings; -class RimEclipseView; -class RimEclipseInputCase; +class RimWellLogPlot; +class RimSummaryCase; //================================================================================================== /// //================================================================================================== -class RicNewFaultReactAssessmentFeature : public caf::CmdFeature +class RicNewMultiPhaseRftSegmentPlotFeature : public caf::CmdFeature { CAF_CMD_HEADER_INIT; -protected: +private: bool isCommandEnabled() override; void onActionTriggered( bool isChecked ) override; - void setupActionLook( QAction* actionToSetup ) override; -private: - void prepareDirectory( QString dirname, bool deleteExistingContent ) const; - bool showSettingsGUI( RimFaultRAPreprocSettings& settings ); - bool runPreProc( RimFaultRAPreprocSettings& settings ); - - void addParameterFileForCleanUp( QString filename ); - void cleanUpParameterFiles(); - - RimEclipseView* getView( RimEclipseInputCase* eCase ); + void setupActionLook( QAction* actionToSetup ) override; - std::list m_parameterFilesToCleanUp; + void appendTrackAndCurveForBranchType( RimWellLogPlot* plot, + const QString& trackName, + const std::vector& resultNames, + const QString& wellName, + RiaDefines::RftBranchType branchType, + RimSummaryCase* summaryCase ); }; diff --git a/ApplicationLibCode/Commands/WellLogCommands/RicNewPltPlotFeature.cpp b/ApplicationLibCode/Commands/WellLogCommands/RicNewPltPlotFeature.cpp index ae885b90da..6b72c2b483 100644 --- a/ApplicationLibCode/Commands/WellLogCommands/RicNewPltPlotFeature.cpp +++ b/ApplicationLibCode/Commands/WellLogCommands/RicNewPltPlotFeature.cpp @@ -32,6 +32,7 @@ #include "RimSimWellInView.h" #include "RimWellLogExtractionCurve.h" #include "RimWellLogPlot.h" +#include "RimWellLogPlotNameConfig.h" #include "RimWellLogTrack.h" #include "RimWellPath.h" #include "RimWellPltPlot.h" @@ -113,6 +114,7 @@ void RicNewPltPlotFeature::onActionTriggered( bool isChecked ) pltPlotColl->addPlot( pltPlot ); pltPlot->nameConfig()->setCustomName( plotName ); + pltPlot->setNamingMethod( RiaDefines::ObjectNamingMethod::CUSTOM ); // pltPlot->applyInitialSelections(); pltPlot->loadDataAndUpdate(); diff --git a/ApplicationLibCode/Commands/WellLogCommands/RicNewRftPlotFeature.cpp b/ApplicationLibCode/Commands/WellLogCommands/RicNewRftPlotFeature.cpp index 1ab7214719..72c3fa4f65 100644 --- a/ApplicationLibCode/Commands/WellLogCommands/RicNewRftPlotFeature.cpp +++ b/ApplicationLibCode/Commands/WellLogCommands/RicNewRftPlotFeature.cpp @@ -22,6 +22,7 @@ #include "RimRftPlotCollection.h" #include "RimSimWellInView.h" #include "RimWellLogPlot.h" +#include "RimWellLogPlotNameConfig.h" #include "RimWellLogTrack.h" #include "RimWellPath.h" #include "RimWellRftPlot.h" @@ -77,6 +78,7 @@ void RicNewRftPlotFeature::onActionTriggered( bool isChecked ) QString plotName = QString( RimWellRftPlot::plotNameFormatString() ).arg( wellName ); rftPlot->nameConfig()->setCustomName( plotName ); + rftPlot->setNamingMethod( RiaDefines::ObjectNamingMethod::CUSTOM ); rftPlot->loadDataAndUpdate(); rftPlotColl->updateConnectedEditors(); diff --git a/ApplicationLibCode/Commands/WellLogCommands/RicNewRftSegmentWellLogPlotFeature.cpp b/ApplicationLibCode/Commands/WellLogCommands/RicNewRftSegmentWellLogPlotFeature.cpp index 92a585ff1c..fbbf387a31 100644 --- a/ApplicationLibCode/Commands/WellLogCommands/RicNewRftSegmentWellLogPlotFeature.cpp +++ b/ApplicationLibCode/Commands/WellLogCommands/RicNewRftSegmentWellLogPlotFeature.cpp @@ -23,17 +23,19 @@ #include "RicWellLogTools.h" #include "RiaApplication.h" +#include "RiaColorTools.h" +#include "RiaLogging.h" +#include "RiaPlotWindowRedrawScheduler.h" #include "RiaRftDefines.h" -#include "RigWellLogCurveData.h" +#include "RifReaderOpmRft.h" #include "RimRftCase.h" +#include "RimRftTopologyCurve.h" #include "RimSummaryCase.h" -#include "RimWellLogExtractionCurve.h" -#include "RimWellLogPlot.h" +#include "RimWellLogRftCurve.h" #include "RimWellLogTrack.h" -#include "Riu3dSelectionManager.h" #include "RiuPlotMainWindow.h" #include "RiuPlotMainWindowTools.h" @@ -41,8 +43,6 @@ #include -#include - CAF_CMD_SOURCE_INIT( RicNewRftSegmentWellLogPlotFeature, "RicNewRftSegmentWellLogPlotFeature" ); //-------------------------------------------------------------------------------------------------- @@ -63,49 +63,247 @@ void RicNewRftSegmentWellLogPlotFeature::onActionTriggered( bool isChecked ) RimSummaryCase* summaryCase = nullptr; rftCase->firstAncestorOfType( summaryCase ); + if ( !summaryCase ) return; + + auto rftReader = summaryCase->rftReader(); + if ( !rftReader ) + { + RiaLogging::error( "Could not open RFT file or no RFT file present. " ); + return; + } auto plot = RicNewWellLogPlotFeatureImpl::createHorizontalWellLogPlot(); - QString resultName = "SEGGRAT"; + QString wellName = "Unknown"; + auto wellNames = rftReader->wellNames(); + if ( !wellNames.empty() ) wellName = *wellNames.begin(); { - auto branchType = RiaDefines::RftBranchType::RFT_TUBING; + RimWellLogTrack* plotTrack = new RimWellLogTrack(); + plot->addPlot( plotTrack ); + plotTrack->setDescription( "Connection Rates" ); - appendTrackAndCurveForBranchType( plot, resultName, branchType, summaryCase ); + auto curve = + createAndAddCurve( plotTrack, "CONGRAT", wellName, RiaDefines::RftBranchType::RFT_ANNULUS, summaryCase ); + curve->setScaleFactor( 1e-3 ); + curve->setFillStyle( Qt::SolidPattern ); } - { - auto branchType = RiaDefines::RftBranchType::RFT_DEVICE; - appendTrackAndCurveForBranchType( plot, resultName, branchType, summaryCase ); - } + for ( auto branchType : { RiaDefines::RftBranchType::RFT_ANNULUS, + RiaDefines::RftBranchType::RFT_DEVICE, + RiaDefines::RftBranchType::RFT_TUBING } ) { - auto branchType = RiaDefines::RftBranchType::RFT_ANNULUS; - - appendTrackAndCurveForBranchType( plot, resultName, branchType, summaryCase ); + QString resultName = "SEGGRAT"; + QString trackName = "Segment Rates"; + auto curve = appendTrackAndCurveForBranchType( plot, trackName, resultName, wellName, branchType, summaryCase ); + curve->setScaleFactor( 1e-3 ); + curve->setFillStyle( Qt::SolidPattern ); } + appendPressureTrack( plot, wellName, summaryCase ); + appendConnectionFactorTrack( plot, wellName, summaryCase ); + appendTopologyTrack( plot, wellName, summaryCase ); + + plot->loadDataAndUpdate(); + + RiaPlotWindowRedrawScheduler::instance()->performScheduledUpdatesAndReplots(); + plot->updateLayout(); + RiuPlotMainWindowTools::onObjectAppended( plot ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RicNewRftSegmentWellLogPlotFeature::appendTrackAndCurveForBranchType( RimWellLogPlot* plot, - const QString& resultName, - RiaDefines::RftBranchType branchType, - RimSummaryCase* summaryCase ) +RimWellLogRftCurve* RicNewRftSegmentWellLogPlotFeature::appendTrackAndCurveForBranchType( RimWellLogPlot* plot, + const QString& trackName, + const QString& resultName, + const QString& wellName, + RiaDefines::RftBranchType branchType, + RimSummaryCase* summaryCase ) { RimWellLogTrack* plotTrack = new RimWellLogTrack(); plot->addPlot( plotTrack ); - plotTrack->setDescription( QString( "Track %1" ).arg( plot->plotCount() ) ); + plotTrack->setDescription( trackName ); plot->loadDataAndUpdate(); - auto curve = RicWellLogTools::addSummaryRftSegmentCurve( plotTrack, resultName, branchType, summaryCase ); - curve->loadDataAndUpdate( true ); + auto curve = createAndAddCurve( plotTrack, resultName, wellName, branchType, summaryCase ); + curve->loadDataAndUpdate( true ); curve->updateAllRequiredEditors(); - RiuPlotMainWindowTools::setExpanded( curve ); + + return curve; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellLogRftCurve* RicNewRftSegmentWellLogPlotFeature::createAndAddCurve( RimWellLogTrack* track, + const QString& resultName, + const QString& wellName, + RiaDefines::RftBranchType branchType, + RimSummaryCase* summaryCase ) +{ + auto curve = RicWellLogTools::addSummaryRftSegmentCurve( track, resultName, wellName, branchType, summaryCase ); + curve->setNamingMethod( RiaDefines::ObjectNamingMethod::TEMPLATE ); + + QString templateText = RiaDefines::namingVariableResultName() + ", " + RiaDefines::namingVariableResultType(); + curve->setCurveNameTemplateText( templateText ); + + return curve; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RicNewRftSegmentWellLogPlotFeature::appendAdditionalDataSourceTrack( RimWellLogPlot* plot, + const QString& wellName, + RimSummaryCase* summaryCase ) +{ + auto additionalDataSourceTrack = new RimWellLogTrack(); + additionalDataSourceTrack->setDescription( "Additional Data Source Curves" ); + + plot->addPlot( additionalDataSourceTrack ); + additionalDataSourceTrack->setShowWindow( false ); + + QString resultName = RiaDefines::segmentNumberResultName(); + QString templateText = RiaDefines::namingVariableResultName() + ", " + RiaDefines::namingVariableResultType(); + + std::vector curves; + + for ( auto branchType : { RiaDefines::RftBranchType::RFT_TUBING, + RiaDefines::RftBranchType::RFT_DEVICE, + RiaDefines::RftBranchType::RFT_ANNULUS } ) + { + auto curve = RicWellLogTools::addSummaryRftSegmentCurve( additionalDataSourceTrack, + resultName, + wellName, + branchType, + summaryCase ); + curve->setFillStyle( Qt::NoBrush ); + curve->setNamingMethod( RiaDefines::ObjectNamingMethod::TEMPLATE ); + curve->setCurveNameTemplateText( templateText ); + + curves.push_back( curve ); + } + + additionalDataSourceTrack->updateAllRequiredEditors(); + + return curves; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicNewRftSegmentWellLogPlotFeature::appendTopologyTrack( RimWellLogPlot* plot, + const QString& wellName, + RimSummaryCase* summaryCase ) +{ + auto rftReader = dynamic_cast( summaryCase->rftReader() ); + if ( !rftReader ) return; + + QDateTime dateTime; + int branchIndex = 1; + + auto timeSteps = rftReader->availableTimeSteps( wellName ); + if ( !timeSteps.empty() ) dateTime = *timeSteps.rbegin(); + + auto track = new RimWellLogTrack(); + track->setDescription( "Topology" ); + track->enablePropertyAxis( false ); + track->setRowSpan( RimPlot::TWO ); + + plot->addPlot( track ); + + std::vector additionalDataSourceCurves = appendAdditionalDataSourceTrack( plot, wellName, summaryCase ); + + for ( auto branchType : { RiaDefines::RftBranchType::RFT_TUBING, + RiaDefines::RftBranchType::RFT_DEVICE, + RiaDefines::RftBranchType::RFT_ANNULUS } ) + { + auto curve = RimRftTopologyCurve::createTopologyCurve( summaryCase, dateTime, wellName, branchIndex, branchType ); + curve->setAdditionalDataSources( additionalDataSourceCurves ); + curve->applyDefaultAppearance(); + track->addCurve( curve ); + } + + auto packerCurve = RimRftTopologyCurve::createPackerCurve( summaryCase, dateTime, wellName, branchIndex ); + packerCurve->setAdditionalDataSources( additionalDataSourceCurves ); + packerCurve->applyDefaultAppearance(); + track->addCurve( packerCurve ); + + track->updateAllRequiredEditors(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicNewRftSegmentWellLogPlotFeature::appendPressureTrack( RimWellLogPlot* plot, + const QString& wellName, + RimSummaryCase* summaryCase ) +{ + auto track = new RimWellLogTrack(); + track->setDescription( "Pressure" ); + + plot->addPlot( track ); + + QString resultName = "SEGPRES"; + for ( auto branchType : { RiaDefines::RftBranchType::RFT_TUBING, + RiaDefines::RftBranchType::RFT_DEVICE, + RiaDefines::RftBranchType::RFT_ANNULUS } ) + { + auto curve = createAndAddCurve( track, resultName, wellName, branchType, summaryCase ); + auto color = RimRftTopologyCurve::colorForRftBranchType( branchType ); + curve->setColor( color ); + curve->setLineThickness( 3 ); + } + + auto curve = createAndAddCurve( track, "PRESSURE", wellName, RiaDefines::RftBranchType::RFT_ANNULUS, summaryCase ); + curve->setLineThickness( 3 ); + + track->updateAllRequiredEditors(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicNewRftSegmentWellLogPlotFeature::appendConnectionFactorTrack( RimWellLogPlot* plot, + const QString& wellName, + RimSummaryCase* summaryCase ) +{ + QString resultName = "CONFAC"; + + // Connection factor data can be found in the tubing, device and annulus branches. + // Search for data ordered by annulus, device and tubing. + RiaDefines::RftBranchType branchType = RiaDefines::RftBranchType::RFT_ANNULUS; + bool foundData = false; + if ( RicWellLogTools::hasData( resultName, wellName, branchType, summaryCase ) ) + { + foundData = true; + } + + if ( !foundData && RicWellLogTools::hasData( resultName, wellName, RiaDefines::RftBranchType::RFT_DEVICE, summaryCase ) ) + { + branchType = RiaDefines::RftBranchType::RFT_DEVICE; + foundData = true; + } + + if ( !foundData && RicWellLogTools::hasData( resultName, wellName, RiaDefines::RftBranchType::RFT_TUBING, summaryCase ) ) + { + branchType = RiaDefines::RftBranchType::RFT_TUBING; + foundData = true; + } + + QString trackName = "Connection Factors"; + auto curve = appendTrackAndCurveForBranchType( plot, trackName, resultName, wellName, branchType, summaryCase ); + + auto curveColor = cvf::Color3f( cvf::Color3f::ColorIdent::ORANGE ); + curve->setColor( curveColor ); + + auto fillColor = RiaColorTools::makeLighter( curveColor, 0.3f ); + curve->setFillColor( fillColor ); + curve->setFillStyle( Qt::SolidPattern ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/WellLogCommands/RicNewRftSegmentWellLogPlotFeature.h b/ApplicationLibCode/Commands/WellLogCommands/RicNewRftSegmentWellLogPlotFeature.h index 24a144e993..25e25f426e 100644 --- a/ApplicationLibCode/Commands/WellLogCommands/RicNewRftSegmentWellLogPlotFeature.h +++ b/ApplicationLibCode/Commands/WellLogCommands/RicNewRftSegmentWellLogPlotFeature.h @@ -24,6 +24,9 @@ class RimWellLogPlot; class RimSummaryCase; +class RimPlotCurve; +class RimWellLogTrack; +class RimWellLogRftCurve; //================================================================================================== /// @@ -32,14 +35,30 @@ class RicNewRftSegmentWellLogPlotFeature : public caf::CmdFeature { CAF_CMD_HEADER_INIT; +public: + static void appendTopologyTrack( RimWellLogPlot* plot, const QString& wellName, RimSummaryCase* summaryCase ); + static void appendPressureTrack( RimWellLogPlot* plot, const QString& wellName, RimSummaryCase* summaryCase ); + static void appendConnectionFactorTrack( RimWellLogPlot* plot, const QString& wellName, RimSummaryCase* summaryCase ); + private: bool isCommandEnabled() override; void onActionTriggered( bool isChecked ) override; void setupActionLook( QAction* actionToSetup ) override; - void appendTrackAndCurveForBranchType( RimWellLogPlot* plot, - const QString& resultName, - RiaDefines::RftBranchType branchType, - RimSummaryCase* summaryCase ); + static RimWellLogRftCurve* appendTrackAndCurveForBranchType( RimWellLogPlot* plot, + const QString& trackName, + const QString& resultName, + const QString& wellName, + RiaDefines::RftBranchType branchType, + RimSummaryCase* summaryCase ); + + static RimWellLogRftCurve* createAndAddCurve( RimWellLogTrack* track, + const QString& resultName, + const QString& wellName, + RiaDefines::RftBranchType branchType, + RimSummaryCase* summaryCase ); + + static std::vector + appendAdditionalDataSourceTrack( RimWellLogPlot* plot, const QString& wellName, RimSummaryCase* summaryCase ); }; diff --git a/ApplicationLibCode/Commands/WellLogCommands/RicNewWellBoreStabilityPlotFeature.cpp b/ApplicationLibCode/Commands/WellLogCommands/RicNewWellBoreStabilityPlotFeature.cpp index 84fb67e70f..6e6431e7c8 100644 --- a/ApplicationLibCode/Commands/WellLogCommands/RicNewWellBoreStabilityPlotFeature.cpp +++ b/ApplicationLibCode/Commands/WellLogCommands/RicNewWellBoreStabilityPlotFeature.cpp @@ -110,7 +110,15 @@ RimWellBoreStabilityPlot* { auto task = progInfo.task( "Updating all tracks", 5 ); - plot->nameConfig()->setAutoNameTags( true, true, true, true, true ); + QString templateText = QString( "Well Bore Stability: %1, %2, %3, %4, %5" ) + .arg( RiaDefines::namingVariableCase() ) + .arg( RiaDefines::namingVariableWell() ) + .arg( RiaDefines::namingVariableTime() ) + .arg( RiaDefines::namingVariableAirGap() ) + .arg( RiaDefines::namingVariableWaterDepth() ); + plot->setNameTemplateText( templateText ); + plot->setNamingMethod( RiaDefines::ObjectNamingMethod::TEMPLATE ); + plot->setPlotTitleVisible( true ); plot->setLegendsVisible( true ); plot->setLegendsHorizontal( true ); @@ -220,6 +228,7 @@ void RicNewWellBoreStabilityPlotFeature::createFormationTrack( RimWellBoreStabil formationTrack->setFormationCase( geoMechCase ); formationTrack->setAnnotationType( RiaDefines::RegionAnnotationType::FORMATION_ANNOTATIONS ); formationTrack->setVisiblePropertyValueRange( 0.0, 0.0 ); + formationTrack->enablePropertyAxis( false ); formationTrack->setColSpan( RimPlot::ONE ); } @@ -242,6 +251,7 @@ void RicNewWellBoreStabilityPlotFeature::createCasingShoeTrack( RimWellBoreStabi casingShoeTrack->setAnnotationTransparency( 90 ); casingShoeTrack->setWellPathAttributesSource( wellPath ); casingShoeTrack->setVisiblePropertyValueRange( 0.0, 0.0 ); + casingShoeTrack->enablePropertyAxis( false ); casingShoeTrack->setAutoScalePropertyValuesEnabled( true ); casingShoeTrack->loadDataAndUpdate(); } @@ -286,7 +296,8 @@ void RicNewWellBoreStabilityPlotFeature::createParametersTrack( RimWellBoreStabi curve->setLineStyle( lineStyles[i % lineStyles.size()] ); curve->setLineThickness( 2 ); curve->loadDataAndUpdate( false ); - curve->setCustomName( param.name() ); + curve->setAutoNameComponents( false, true, false, false, false ); + i++; } paramCurvesTrack->setAutoScalePropertyValuesEnabled( true ); diff --git a/ApplicationLibCode/Commands/WellLogCommands/RicNewWellLogPlotFeatureImpl.cpp b/ApplicationLibCode/Commands/WellLogCommands/RicNewWellLogPlotFeatureImpl.cpp index e8036affb4..6e0e85390f 100644 --- a/ApplicationLibCode/Commands/WellLogCommands/RicNewWellLogPlotFeatureImpl.cpp +++ b/ApplicationLibCode/Commands/WellLogCommands/RicNewWellLogPlotFeatureImpl.cpp @@ -29,6 +29,7 @@ #include "RimWellLogCurveCommonDataSource.h" #include "RimWellLogPlot.h" #include "RimWellLogPlotCollection.h" +#include "RimWellLogPlotNameConfig.h" #include "RimWellLogTrack.h" #include "RimWellPath.h" @@ -88,7 +89,19 @@ RimWellBoreStabilityPlot* RimWellLogPlot* RicNewWellLogPlotFeatureImpl::createHorizontalWellLogPlot() { auto plot = createWellLogPlot(); - plot->setDepthOrientation( RimDepthTrackPlot::DepthOrientation::HORIZONTAL ); + + plot->setDepthOrientation( RiaDefines::Orientation::HORIZONTAL ); + plot->setNamingMethod( RiaDefines::ObjectNamingMethod::TEMPLATE ); + QString templateText = RiaDefines::namingVariableCase() + ", " + RiaDefines::namingVariableWell() + " - Branch " + + RiaDefines::namingVariableWellBranch() + ", " + RiaDefines::namingVariableTime(); + plot->setNameTemplateText( templateText ); + plot->setPlotTitleVisible( true ); + plot->setLegendItemsClickable( false ); + plot->enableDepthMarkerLine( true ); + plot->setLegendPosition( RimPlotWindow::LegendPosition::INSIDE_UPPER_RIGHT ); + plot->setLegendFontSize( caf::FontTools::RelativeSize::XSmall ); + plot->setLegendsHorizontal( false ); + plot->setAutoZoomMaximumDepthFactor( 0.1 ); return plot; } diff --git a/ApplicationLibCode/Commands/WellLogCommands/RicPasteWellLogPlotFeature.cpp b/ApplicationLibCode/Commands/WellLogCommands/RicPasteWellLogPlotFeature.cpp index e1f4818b6c..d1ba5d5d86 100644 --- a/ApplicationLibCode/Commands/WellLogCommands/RicPasteWellLogPlotFeature.cpp +++ b/ApplicationLibCode/Commands/WellLogCommands/RicPasteWellLogPlotFeature.cpp @@ -22,6 +22,7 @@ #include "RimWellLogPlot.h" #include "RimWellLogPlotCollection.h" +#include "RimWellLogPlotNameConfig.h" #include "cafPdmObjectGroup.h" #include "cafPdmObjectHandle.h" diff --git a/ApplicationLibCode/Doxyfile b/ApplicationLibCode/Doxyfile index bd499a9804..55e5481fde 100644 --- a/ApplicationLibCode/Doxyfile +++ b/ApplicationLibCode/Doxyfile @@ -1,4 +1,4 @@ -# Doxyfile 1.8.13 +# Doxyfile 1.9.5 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -12,16 +12,26 @@ # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). +# +# Note: +# +# Use doxygen to compare the used configuration file with the template +# configuration file: +# doxygen -x [configFile] +# Use doxygen to compare the used configuration file with the template +# configuration file without replacing the environment variables or CMake type +# replacement variables: +# doxygen -x_noenv [configFile] #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all text -# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv -# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv -# for the list of possible encodings. +# This tag specifies the encoding used for all characters in the configuration +# file that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. # The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 @@ -32,44 +42,56 @@ DOXYFILE_ENCODING = UTF-8 # title of most generated pages and in a few other places. # The default value is: My Project. -PROJECT_NAME = "ResInsight Project Data Model" +PROJECT_NAME = "ResInsight Application Lib Code" # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = +PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. -PROJECT_BRIEF = +PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. -PROJECT_LOGO = +PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. -OUTPUT_DIRECTORY = +OUTPUT_DIRECTORY = -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 +# sub-directories (in 2 levels) under the output directory of each output format +# and will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes -# performance problems for the file system. +# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to +# control the number of sub-directories. # The default value is: NO. CREATE_SUBDIRS = NO +# Controls the number of sub-directories that will be created when +# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every +# level increment doubles the number of directories, resulting in 4096 +# directories at level 8 which is the default and also the maximum value. The +# sub-directories are organized in 2 levels, the first level always has a fixed +# numer of 16 directories. +# Minimum value: 0, maximum value: 8, default value: 8. +# This tag requires that the tag CREATE_SUBDIRS is set to YES. + +CREATE_SUBDIRS_LEVEL = 8 + # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode @@ -81,14 +103,14 @@ ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, +# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English +# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, +# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with +# English messages), Korean, Korean-en (Korean with English messages), Latvian, +# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, +# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, +# Swedish, Turkish, Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English @@ -162,7 +184,7 @@ FULL_PATH_NAMES = YES # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. -STRIP_FROM_PATH = +STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which @@ -171,7 +193,7 @@ STRIP_FROM_PATH = # specify the list of include paths that are normally passed to the compiler # using the -I flag. -STRIP_FROM_INC_PATH = +STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't @@ -189,6 +211,16 @@ SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus @@ -209,6 +241,14 @@ QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO +# By default Python docstrings are displayed as preformatted text and doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. @@ -232,19 +272,18 @@ TAB_SIZE = 8 # the documentation. An alias has the form: # name=value # For example adding -# "sideeffect=@par Side Effects:\n" +# "sideeffect=@par Side Effects:^^" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines. - -ALIASES = - -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) -TCL_SUBST = +ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For @@ -274,28 +313,40 @@ OPTIMIZE_FOR_FORTRAN = NO OPTIMIZE_OUTPUT_VHDL = NO +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, Javascript, -# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: -# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: -# Fortran. In the later case the parser tries to guess whether the code is fixed -# or free formatted code, this is the default for Fortran type files), VHDL. For -# instance to make doxygen treat .inc files as Fortran files (default is PHP), -# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. -EXTENSION_MAPPING = +EXTENSION_MAPPING = # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable -# documentation. See http://daringfireball.net/projects/markdown/ for details. +# documentation. See https://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you can # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. @@ -307,7 +358,7 @@ MARKDOWN_SUPPORT = YES # to that level are automatically included in the table of contents, even if # they do not have an id attribute. # Note: This feature currently applies only to Markdown headings. -# Minimum value: 0, maximum value: 99, default value: 0. +# Minimum value: 0, maximum value: 99, default value: 5. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. TOC_INCLUDE_HEADINGS = 0 @@ -337,7 +388,7 @@ BUILTIN_STL_SUPPORT = NO CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen # will parse them like normal C++ but will assume all classes use public instead # of private inheritance when no explicit protection keyword is present. # The default value is: NO. @@ -423,6 +474,19 @@ TYPEDEF_HIDES_STRUCT = NO LOOKUP_CACHE_SIZE = 0 +# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use +# during processing. When set to 0 doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which effectively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 32, default value: 1. + +NUM_PROC_THREADS = 1 + #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- @@ -443,6 +507,12 @@ EXTRACT_ALL = NO EXTRACT_PRIVATE = NO +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. @@ -480,6 +550,13 @@ EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation @@ -497,8 +574,8 @@ HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# (class|struct|union) declarations. If set to NO, these declarations will be -# included in the documentation. +# declarations. If set to NO, these declarations will be included in the +# documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO @@ -517,12 +594,20 @@ HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES, upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. -# The default value is: system dependent. +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and MacOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. +# Possible values are: SYSTEM, NO and YES. +# The default value is: SYSTEM. CASE_SENSE_NAMES = NO @@ -540,6 +625,12 @@ HIDE_SCOPE_NAMES = NO HIDE_COMPOUND_REFERENCE= NO +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. @@ -648,7 +739,7 @@ GENERATE_DEPRECATEDLIST= YES # sections, marked by \if ... \endif and \cond # ... \endcond blocks. -ENABLED_SECTIONS = +ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the @@ -690,30 +781,31 @@ SHOW_NAMESPACES = YES # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. -FILE_VERSION_FILTER = +FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. -LAYOUT_FILE = +LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib # extension is automatically appended if omitted. This requires the bibtex tool -# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. See also \cite for info how to create references. -CITE_BIB_FILES = +CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages @@ -743,23 +835,35 @@ WARNINGS = YES WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES +# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete +# function parameter documentation. If set to NO, doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong or incomplete -# parameter documentation, but not about the absence of documentation. +# value. If set to NO, doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC # The default value is: NO. WARN_NO_PARAMDOC = NO # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when -# a warning is encountered. +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# Possible values are: NO, YES and FAIL_ON_WARNINGS. # The default value is: NO. WARN_AS_ERROR = NO @@ -770,15 +874,29 @@ WARN_AS_ERROR = NO # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) +# See also: WARN_LINE_FORMAT # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" +# In the $text part of the WARN_FORMAT command it is possible that a reference +# to a more specific place is given. To make it easier to jump to this place +# (outside of doxygen) the user can define a custom "cut" / "paste" string. +# Example: +# WARN_LINE_FORMAT = "'vi $file +$line'" +# See also: WARN_FORMAT +# The default value is: at line $line of file $file. + +WARN_LINE_FORMAT = "at line $line of file $file" + # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard -# error (stderr). +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). -WARN_LOGFILE = +WARN_LOGFILE = #--------------------------------------------------------------------------- # Configuration options related to the input files @@ -790,21 +908,32 @@ WARN_LOGFILE = # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. -INPUT = ProjectDataModel \ - ../cafPdmCvf \ - ../cafProjectDataModel \ - ../cafUserInterface \ - ../cafViewer +INPUT = . \ + ReservoirDataModel \ + GeoMech \ + ProjectDataModel \ + UserInterface # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: http://www.gnu.org/software/libiconv) for the list of -# possible encodings. +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# See also: INPUT_FILE_ENCODING # The default value is: UTF-8. INPUT_ENCODING = UTF-8 +# This tag can be used to specify the character encoding of the source files +# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify +# character encoding on a per file pattern basis. Doxygen will compare the file +# name with each pattern and apply the encoding instead of the default +# INPUT_ENCODING) if there is a match. The character encodings are a list of the +# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding +# "INPUT_ENCODING" for further information on supported encodings. + +INPUT_FILE_ENCODING = + # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. @@ -813,11 +942,15 @@ INPUT_ENCODING = UTF-8 # need to set EXTENSION_MAPPING for the extension otherwise the files are not # read by doxygen. # +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, -# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. +# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, +# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C +# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, +# *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = *.c \ *.cc \ @@ -865,7 +998,7 @@ RECURSIVE = YES # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = +EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded @@ -887,18 +1020,18 @@ EXCLUDE_PATTERNS = *test* # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test +# ANamespace::AClass, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* -EXCLUDE_SYMBOLS = +EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). -EXAMPLE_PATH = +EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and @@ -918,7 +1051,7 @@ EXAMPLE_RECURSIVE = NO # that contain images that are to be included in the documentation (see the # \image command). -IMAGE_PATH = +IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program @@ -935,11 +1068,16 @@ IMAGE_PATH = # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. # +# Note that doxygen will use the data processed and written to standard output +# for further processing, therefore nothing else, like debug statements or used +# commands (so in case of a Windows batch file always use @echo OFF), should be +# written to standard output. +# # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. -INPUT_FILTER = +INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the @@ -952,7 +1090,7 @@ INPUT_FILTER = # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. -FILTER_PATTERNS = +FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will also be used to filter the input files that are used for @@ -967,14 +1105,23 @@ FILTER_SOURCE_FILES = NO # *.ext= (so without naming a filter). # This tag requires that the tag FILTER_SOURCE_FILES is set to YES. -FILTER_SOURCE_PATTERNS = +FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. -USE_MDFILE_AS_MAINPAGE = +USE_MDFILE_AS_MAINPAGE = + +# The Fortran standard specifies that for fixed formatted Fortran code all +# characters from position 72 are to be considered as comment. A common +# extension is to allow longer lines before the automatic comment starts. The +# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can +# be processed before the automatic comment starts. +# Minimum value: 7, maximum value: 10000, default value: 72. + +FORTRAN_COMMENT_AFTER = 72 #--------------------------------------------------------------------------- # Configuration options related to source browsing @@ -1003,7 +1150,7 @@ INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES then for each documented -# function all documented functions referencing it will be listed. +# entity all documented functions referencing it will be listed. # The default value is: NO. REFERENCED_BY_RELATION = NO @@ -1035,12 +1182,12 @@ SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will # point to the HTML generated by the htags(1) tool instead of doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system -# (see http://www.gnu.org/software/global/global.html). You will need version +# (see https://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. # # To use it do the following: # - Install the latest version of global -# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file # - Make sure the INPUT points to the root of the source tree # - Run doxygen as normal # @@ -1063,23 +1210,44 @@ USE_HTAGS = NO VERBATIM_HEADERS = YES # If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the -# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the -# cost of reduced performance. This can be particularly helpful with template -# rich C++ code for which doxygen's built-in parser lacks the necessary type -# information. +# clang parser (see: +# http://clang.llvm.org/) for more accurate parsing at the cost of reduced +# performance. This can be particularly helpful with template rich C++ code for +# which doxygen's built-in parser lacks the necessary type information. # Note: The availability of this option depends on whether or not doxygen was -# generated with the -Duse-libclang=ON option for CMake. +# generated with the -Duse_libclang=ON option for CMake. # The default value is: NO. CLANG_ASSISTED_PARSING = NO +# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS +# tag is set to YES then doxygen will add the directory of each input to the +# include path. +# The default value is: YES. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_ADD_INC_PATHS = YES + # If clang assisted parsing is enabled you can provide the compiler with command # line options that you would normally use when invoking the compiler. Note that # the include paths will already be set by doxygen for the files and directories # specified with INPUT and INCLUDE_PATH. # This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. -CLANG_OPTIONS = +CLANG_OPTIONS = + +# If clang assisted parsing is enabled you can provide the clang parser with the +# path to the directory containing a file called compile_commands.json. This +# file is the compilation database (see: +# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the +# options used when the source files were built. This is equivalent to +# specifying the -p option to a clang tool, such as clang-check. These options +# will then be passed to the parser. Any options specified with CLANG_OPTIONS +# will be added as well. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. + +CLANG_DATABASE_PATH = #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index @@ -1092,20 +1260,13 @@ CLANG_OPTIONS = ALPHABETICAL_INDEX = YES -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -COLS_IN_ALPHA_INDEX = 5 - # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # can be used to specify a prefix (or a list of prefixes) that should be ignored # while generating the index headers. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. -IGNORE_PREFIX = +IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output @@ -1149,7 +1310,7 @@ HTML_FILE_EXTENSION = .html # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_HEADER = +HTML_HEADER = # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard @@ -1159,7 +1320,7 @@ HTML_HEADER = # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_FOOTER = +HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of @@ -1171,7 +1332,7 @@ HTML_FOOTER = # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_STYLESHEET = +HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets @@ -1184,7 +1345,7 @@ HTML_STYLESHEET = # list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_STYLESHEET = +HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note @@ -1194,12 +1355,29 @@ HTML_EXTRA_STYLESHEET = # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_FILES = +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output +# should be rendered with a dark or light theme. Default setting AUTO_LIGHT +# enables light output unless the user preference is dark output. Other options +# are DARK to always use dark mode, LIGHT to always use light mode, AUTO_DARK to +# default to dark mode unless the user prefers light mode, and TOGGLE to let the +# user toggle between dark and light mode via a button. +# Possible values are: LIGHT Always generate light output., DARK Always generate +# dark output., AUTO_LIGHT Automatically set the mode according to the user +# preference, use light mode if no preference is set (the default)., AUTO_DARK +# Automatically set the mode according to the user preference, use dark mode if +# no preference is set. and TOGGLE Allow to user to switch between light and +# dark mode via a button.. +# The default value is: AUTO_LIGHT. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE = AUTO_LIGHT # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see -# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# this color. Hue is specified as an angle on a color-wheel, see +# https://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. # Minimum value: 0, maximum value: 359, default value: 220. @@ -1208,7 +1386,7 @@ HTML_EXTRA_FILES = HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A +# in the HTML output. For a value of 0 the output will use gray-scales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1235,6 +1413,17 @@ HTML_COLORSTYLE_GAMMA = 80 HTML_TIMESTAMP = YES +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via JavaScript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have JavaScript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = YES + # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. @@ -1258,13 +1447,14 @@ HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: http://developer.apple.com/tools/xcode/), introduced with -# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a -# Makefile in the HTML output directory. Running make will produce the docset in -# that directory and running make install will install the docset in +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at -# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. +# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy +# genXcode/_index.html for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1278,6 +1468,13 @@ GENERATE_DOCSET = NO DOCSET_FEEDNAME = "Doxygen generated docs" +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. @@ -1303,8 +1500,12 @@ DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on -# Windows. +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline the HTML help workshop was already many years +# in maintenance mode). You can download the HTML help workshop from the web +# archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML @@ -1323,7 +1524,7 @@ GENERATE_HTMLHELP = NO # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -CHM_FILE = +CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler (hhc.exe). If non-empty, @@ -1331,10 +1532,10 @@ CHM_FILE = # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -HHC_LOCATION = +HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated -# (YES) or that it should be included in the master .chm file (NO). +# (YES) or that it should be included in the main .chm file (NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. @@ -1344,7 +1545,7 @@ GENERATE_CHI = NO # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -CHM_INDEX_ENCODING = +CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated # (YES) or a normal table of contents (NO) in the .chm file. Furthermore it @@ -1375,11 +1576,12 @@ GENERATE_QHP = NO # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. -QCH_FILE = +QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace -# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1387,8 +1589,8 @@ QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- -# folders). +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1396,33 +1598,33 @@ QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_CUST_FILTER_NAME = +QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_CUST_FILTER_ATTRS = +QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: -# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_SECT_FILTER_ATTRS = +QHP_SECT_FILTER_ATTRS = -# The QHG_LOCATION tag can be used to specify the location of Qt's -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the -# generated .qhp file. +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# run qhelpgenerator on the generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. -QHG_LOCATION = +QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To @@ -1462,15 +1664,27 @@ DISABLE_INDEX = NO # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has the same information as the tab index, you could +# consider setting DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -GENERATE_TREEVIEW = NO +GENERATE_TREEVIEW = YES + +# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the +# FULL_SIDEBAR option determines if the side bar is limited to only the treeview +# area (value NO) or if it should extend to the full height of the window (value +# YES). Setting this to YES gives a layout similar to +# https://docs.readthedocs.io with more room for contents, but less room for the +# project logo, title, and description. If either GENERATE_TREEVIEW or +# DISABLE_INDEX is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. @@ -1496,6 +1710,24 @@ TREEVIEW_WIDTH = 250 EXT_LINKS_IN_WINDOW = NO +# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML @@ -1505,19 +1737,14 @@ EXT_LINKS_IN_WINDOW = NO FORMULA_FONTSIZE = 10 -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. -FORMULA_TRANSPARENT = YES +FORMULA_MACROFILE = # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# http://www.mathjax.org) which uses client side Javascript for the rendering +# https://www.mathjax.org) which uses client side JavaScript for the rendering # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path @@ -1527,11 +1754,29 @@ FORMULA_TRANSPARENT = YES USE_MATHJAX = NO +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2 and MathJax_3. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + # When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/latest/output.html) for more details. +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 +# (see: +# http://docs.mathjax.org/en/latest/web/components/output.html). # Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. @@ -1544,26 +1789,33 @@ MATHJAX_FORMAT = HTML-CSS # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of -# MathJax from http://www.mathjax.org before deployment. -# The default value is: http://cdn.mathjax.org/mathjax/latest. +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://www.mathjax.org/mathjax # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see +# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_EXTENSIONS = +MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site -# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_CODEFILE = +MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and @@ -1587,7 +1839,7 @@ MATHJAX_CODEFILE = SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a web server instead of a web client using Javascript. There +# implemented using a web server instead of a web client using JavaScript. There # are two flavors of web server based searching depending on the EXTERNAL_SEARCH # setting. When disabled, doxygen will generate a PHP script for searching and # an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing @@ -1606,7 +1858,8 @@ SERVER_BASED_SEARCH = NO # # Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: http://xapian.org/). +# Xapian (see: +# https://xapian.org/). # # See the section "External Indexing and Searching" for details. # The default value is: NO. @@ -1619,11 +1872,12 @@ EXTERNAL_SEARCH = NO # # Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: http://xapian.org/). See the section "External Indexing and -# Searching" for details. +# Xapian (see: +# https://xapian.org/). See the section "External Indexing and Searching" for +# details. # This tag requires that the tag SEARCHENGINE is set to YES. -SEARCHENGINE_URL = +SEARCHENGINE_URL = # When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed # search data is written to a file for indexing by an external tool. With the @@ -1639,7 +1893,7 @@ SEARCHDATA_FILE = searchdata.xml # projects and redirect the results back to the right project. # This tag requires that the tag SEARCHENGINE is set to YES. -EXTERNAL_SEARCH_ID = +EXTERNAL_SEARCH_ID = # The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen # projects other than the one defined by this configuration file, but that are @@ -1649,7 +1903,7 @@ EXTERNAL_SEARCH_ID = # EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... # This tag requires that the tag SEARCHENGINE is set to YES. -EXTRA_SEARCH_MAPPINGS = +EXTRA_SEARCH_MAPPINGS = #--------------------------------------------------------------------------- # Configuration options related to the LaTeX output @@ -1671,21 +1925,35 @@ LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. # -# Note that when enabling USE_PDFLATEX this option is only used for generating -# bitmaps for formulas in the HTML output, but not in the Makefile that is -# written to the output directory. -# The default file is: latex. +# Note that when not enabling USE_PDFLATEX the default is latex when enabling +# USE_PDFLATEX the default is pdflatex and when in the later case latex is +# chosen this is overwritten by pdflatex. For specific output languages the +# default can have been set differently, this depends on the implementation of +# the output language. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate # index for LaTeX. +# Note: This tag is used in the Makefile / make.bat. +# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file +# (.tex). # The default file is: makeindex. # This tag requires that the tag GENERATE_LATEX is set to YES. MAKEINDEX_CMD_NAME = makeindex +# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to +# generate index for LaTeX. In case there is no backslash (\) as first character +# it will be automatically added in the LaTeX code. +# Note: This tag is used in the generated output file (.tex). +# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat. +# The default value is: makeindex. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_MAKEINDEX_CMD = makeindex + # If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX # documents. This may be useful for small projects and may help to save some # trees in general. @@ -1713,34 +1981,36 @@ PAPER_TYPE = a4 # If left blank no extra packages will be included. # This tag requires that the tag GENERATE_LATEX is set to YES. -EXTRA_PACKAGES = +EXTRA_PACKAGES = -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the -# generated LaTeX document. The header should contain everything until the first -# chapter. If it is left blank doxygen will generate a standard header. See -# section "Doxygen usage" for information on how to let doxygen write the -# default header to a separate file. +# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for +# the generated LaTeX document. The header should contain everything until the +# first chapter. If it is left blank doxygen will generate a standard header. It +# is highly recommended to start with a default header using +# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty +# and then modify the file new_header.tex. See also section "Doxygen usage" for +# information on how to generate the default header that doxygen normally uses. # -# Note: Only use a user-defined header if you know what you are doing! The -# following commands have a special meaning inside the header: $title, -# $datetime, $date, $doxygenversion, $projectname, $projectnumber, -# $projectbrief, $projectlogo. Doxygen will replace $title with the empty -# string, for the replacement values of the other commands the user is referred -# to HTML_HEADER. +# Note: Only use a user-defined header if you know what you are doing! +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. The following +# commands have a special meaning inside the header (and footer): For a +# description of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_HEADER = +LATEX_HEADER = -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the -# generated LaTeX document. The footer should contain everything after the last -# chapter. If it is left blank doxygen will generate a standard footer. See +# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for +# the generated LaTeX document. The footer should contain everything after the +# last chapter. If it is left blank doxygen will generate a standard footer. See # LATEX_HEADER for more information on how to generate a default footer and what -# special commands can be used inside the footer. -# -# Note: Only use a user-defined footer if you know what you are doing! +# special commands can be used inside the footer. See also section "Doxygen +# usage" for information on how to generate the default footer that doxygen +# normally uses. Note: Only use a user-defined footer if you know what you are +# doing! # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_FOOTER = +LATEX_FOOTER = # The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined # LaTeX style sheets that are included after the standard style sheets created @@ -1751,7 +2021,7 @@ LATEX_FOOTER = # list). # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_EXTRA_STYLESHEET = +LATEX_EXTRA_STYLESHEET = # The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the LATEX_OUTPUT output @@ -1759,7 +2029,7 @@ LATEX_EXTRA_STYLESHEET = # markers available. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_EXTRA_FILES = +LATEX_EXTRA_FILES = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is # prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will @@ -1770,9 +2040,11 @@ LATEX_EXTRA_FILES = PDF_HYPERLINKS = YES -# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate -# the PDF file directly from the LaTeX files. Set this option to YES, to get a -# higher quality PDF documentation. +# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as +# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX +# files. Set this option to YES, to get a higher quality PDF documentation. +# +# See also section LATEX_CMD_NAME for selecting the engine. # The default value is: YES. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -1780,8 +2052,7 @@ USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode # command to the generated LaTeX files. This will instruct LaTeX to keep running -# if errors occur, instead of asking the user for help. This option is also used -# when generating formulas in HTML. +# if errors occur, instead of asking the user for help. # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -1794,19 +2065,9 @@ LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO -# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source -# code with syntax highlighting in the LaTeX output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_SOURCE_CODE = NO - # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. See -# http://en.wikipedia.org/wiki/BibTeX and \cite for more info. +# https://en.wikipedia.org/wiki/BibTeX and \cite for more info. # The default value is: plain. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -1820,6 +2081,14 @@ LATEX_BIB_STYLE = plain LATEX_TIMESTAMP = NO +# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute) +# path from which the emoji images will be read. If a relative path is entered, +# it will be relative to the LATEX_OUTPUT directory. If left blank the +# LATEX_OUTPUT directory will be used. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_EMOJI_DIRECTORY = + #--------------------------------------------------------------------------- # Configuration options related to the RTF output #--------------------------------------------------------------------------- @@ -1859,32 +2128,22 @@ COMPACT_RTF = NO RTF_HYPERLINKS = NO -# Load stylesheet definitions from file. Syntax is similar to doxygen's config -# file, i.e. a series of assignments. You only have to provide replacements, -# missing definitions are set to their default value. +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# configuration file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. # # See also section "Doxygen usage" for information on how to generate the # default style sheet that doxygen normally uses. # This tag requires that the tag GENERATE_RTF is set to YES. -RTF_STYLESHEET_FILE = +RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an RTF document. Syntax is -# similar to doxygen's config file. A template extensions file can be generated -# using doxygen -e rtf extensionFile. +# similar to doxygen's configuration file. A template extensions file can be +# generated using doxygen -e rtf extensionFile. # This tag requires that the tag GENERATE_RTF is set to YES. -RTF_EXTENSIONS_FILE = - -# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code -# with syntax highlighting in the RTF output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_SOURCE_CODE = NO +RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # Configuration options related to the man page output @@ -1919,7 +2178,7 @@ MAN_EXTENSION = .3 # MAN_EXTENSION with the initial . removed. # This tag requires that the tag GENERATE_MAN is set to YES. -MAN_SUBDIR = +MAN_SUBDIR = # If the MAN_LINKS tag is set to YES and doxygen generates man output, then it # will generate one additional man file for each entity documented in the real @@ -1957,6 +2216,13 @@ XML_OUTPUT = xml XML_PROGRAMLISTING = YES +# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include +# namespace members in file scope as well, matching the HTML output. +# The default value is: NO. +# This tag requires that the tag GENERATE_XML is set to YES. + +XML_NS_MEMB_FILE_SCOPE = NO + #--------------------------------------------------------------------------- # Configuration options related to the DOCBOOK output #--------------------------------------------------------------------------- @@ -1975,27 +2241,22 @@ GENERATE_DOCBOOK = NO DOCBOOK_OUTPUT = docbook -# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the -# program listings (including syntax highlighting and cross-referencing -# information) to the DOCBOOK output. Note that enabling this will significantly -# increase the size of the DOCBOOK output. -# The default value is: NO. -# This tag requires that the tag GENERATE_DOCBOOK is set to YES. - -DOCBOOK_PROGRAMLISTING = NO - #--------------------------------------------------------------------------- # Configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an -# AutoGen Definitions (see http://autogen.sf.net) file that captures the -# structure of the code including all documentation. Note that this feature is -# still experimental and incomplete at the moment. +# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures +# the structure of the code including all documentation. Note that this feature +# is still experimental and incomplete at the moment. # The default value is: NO. GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# Configuration options related to Sqlite3 output +#--------------------------------------------------------------------------- + #--------------------------------------------------------------------------- # Configuration options related to the Perl module output #--------------------------------------------------------------------------- @@ -2032,7 +2293,7 @@ PERLMOD_PRETTY = YES # overwrite each other's variables. # This tag requires that the tag GENERATE_PERLMOD is set to YES. -PERLMOD_MAKEVAR_PREFIX = +PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor @@ -2070,10 +2331,11 @@ SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by the -# preprocessor. +# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of +# RECURSIVE has no effect here. # This tag requires that the tag SEARCH_INCLUDES is set to YES. -INCLUDE_PATH = +INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the @@ -2081,7 +2343,7 @@ INCLUDE_PATH = # used. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -INCLUDE_FILE_PATTERNS = +INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that are # defined before the preprocessor is started (similar to the -D option of e.g. @@ -2091,7 +2353,7 @@ INCLUDE_FILE_PATTERNS = # recursively expanded use the := operator instead of the = operator. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -PREDEFINED = +PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The @@ -2100,7 +2362,7 @@ PREDEFINED = # definition found in the source code. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -EXPAND_AS_DEFINED = +EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will # remove all references to function-like macros that are alone on a line, have @@ -2129,13 +2391,13 @@ SKIP_FUNCTION_MACROS = YES # the path). If a tag file is not located in the directory in which doxygen is # run, you must also specify the path to the tagfile here. -TAGFILES = +TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create a # tag file that is based on the input files it reads. See section "Linking to # external documentation" for more information about the usage of tag files. -GENERATE_TAGFILE = +GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES, all external class will be listed in # the class index. If set to NO, only the inherited external classes will be @@ -2158,40 +2420,16 @@ EXTERNAL_GROUPS = YES EXTERNAL_PAGES = YES -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of 'which perl'). -# The default file (with absolute path) is: /usr/bin/perl. - -PERL_PATH = /usr/bin/perl - #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- -# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram -# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to -# NO turns the diagrams off. Note that this option also works with HAVE_DOT -# disabled, but it is recommended to install and use dot, since it yields more -# powerful graphs. -# The default value is: YES. - -CLASS_DIAGRAMS = YES - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see: -# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - # You can include diagrams made with dia in doxygen documentation. Doxygen will # then run dia to produce the diagram and insert it in the documentation. The # DIA_PATH tag allows you to specify the directory where the dia binary resides. # If left empty dia is assumed to be found in the default search path. -DIA_PATH = +DIA_PATH = # If set to YES the inheritance and collaboration graphs will hide inheritance # and usage relations if the target is undocumented or is not a class. @@ -2218,36 +2456,51 @@ HAVE_DOT = NO DOT_NUM_THREADS = 0 -# When you want a differently looking font in the dot files that doxygen -# generates you can specify the font name using DOT_FONTNAME. You need to make -# sure dot is able to find the font, which can be done by putting it in a -# standard location or by setting the DOTFONTPATH environment variable or by -# setting DOT_FONTPATH to the directory containing the font. -# The default value is: Helvetica. +# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of +# subgraphs. When you want a differently looking font in the dot files that +# doxygen generates you can specify fontname, fontcolor and fontsize attributes. +# For details please see Node, +# Edge and Graph Attributes specification You need to make sure dot is able +# to find the font, which can be done by putting it in a standard location or by +# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. Default graphviz fontsize is 14. +# The default value is: fontname=Helvetica,fontsize=10. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTNAME = Helvetica +DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10" -# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of -# dot graphs. -# Minimum value: 4, maximum value: 24, default value: 10. +# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can +# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. Complete documentation about +# arrows shapes. +# The default value is: labelfontname=Helvetica,labelfontsize=10. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTSIZE = 10 +DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10" -# By default doxygen will tell dot to use the default font as specified with -# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set -# the path where dot can find it using this tag. +# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes +# around nodes set 'shape=plain' or 'shape=plaintext' Shapes specification +# The default value is: shape=box,height=0.2,width=0.4. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTPATH = +DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4" -# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for -# each documented class showing the direct and indirect inheritance relations. -# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. -# The default value is: YES. +# You can set the path where dot can find font specified with fontname in +# DOT_COMMON_ATTR and others dot attributes. # This tag requires that the tag HAVE_DOT is set to YES. +DOT_FONTPATH = + +# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a +# graph for each documented class showing the direct and indirect inheritance +# relations. In case HAVE_DOT is set as well dot will be used to draw the graph, +# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set +# to TEXT the direct and indirect inheritance relations will be shown as texts / +# links. +# Possible values are: NO, YES, TEXT and GRAPH. +# The default value is: YES. + CLASS_GRAPH = YES # If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a @@ -2260,7 +2513,8 @@ CLASS_GRAPH = YES COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for -# groups, showing the direct groups dependencies. +# groups, showing the direct groups dependencies. See also the chapter Grouping +# in the manual. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2283,10 +2537,32 @@ UML_LOOK = NO # but if the number exceeds 15, the total amount of fields shown is limited to # 10. # Minimum value: 0, maximum value: 100, default value: 10. -# This tag requires that the tag HAVE_DOT is set to YES. +# This tag requires that the tag UML_LOOK is set to YES. UML_LIMIT_NUM_FIELDS = 10 +# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and +# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS +# tag is set to YES, doxygen will add type and arguments for attributes and +# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen +# will not generate fields with class member information in the UML graphs. The +# class diagrams will look similar to the default class diagrams but using UML +# notation for the relationships. +# Possible values are: NO, YES and NONE. +# The default value is: NO. +# This tag requires that the tag UML_LOOK is set to YES. + +DOT_UML_DETAILS = NO + +# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters +# to display on a single line. If the actual line length exceeds this threshold +# significantly it will wrapped across multiple lines. Some heuristics are apply +# to avoid ugly line breaks. +# Minimum value: 0, maximum value: 1000, default value: 17. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_WRAP_THRESHOLD = 17 + # If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and # collaboration graphs will show the relations between templates and their # instances. @@ -2353,6 +2629,13 @@ GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES +# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels +# of child directories generated in directory dependency graphs by dot. +# Minimum value: 1, maximum value: 25, default value: 1. +# This tag requires that the tag DIRECTORY_GRAPH is set to YES. + +DIR_GRAPH_MAX_DEPTH = 1 + # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. For an explanation of the image formats see the section # output formats in the documentation of the dot tool (Graphviz (see: @@ -2384,44 +2667,44 @@ INTERACTIVE_SVG = NO # found. If left blank, it is assumed the dot tool can be found in the path. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_PATH = +DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the \dotfile # command). # This tag requires that the tag HAVE_DOT is set to YES. -DOTFILE_DIRS = +DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the \mscfile # command). -MSCFILE_DIRS = +MSCFILE_DIRS = # The DIAFILE_DIRS tag can be used to specify one or more directories that # contain dia files that are included in the documentation (see the \diafile # command). -DIAFILE_DIRS = +DIAFILE_DIRS = # When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the -# path where java can find the plantuml.jar file. If left blank, it is assumed -# PlantUML is not used or called during a preprocessing step. Doxygen will -# generate a warning when it encounters a \startuml command in this case and -# will not generate output for the diagram. +# path where java can find the plantuml.jar file or to the filename of jar file +# to be used. If left blank, it is assumed PlantUML is not used or called during +# a preprocessing step. Doxygen will generate a warning when it encounters a +# \startuml command in this case and will not generate output for the diagram. -PLANTUML_JAR_PATH = +PLANTUML_JAR_PATH = # When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a # configuration file for plantuml. -PLANTUML_CFG_FILE = +PLANTUML_CFG_FILE = # When using plantuml, the specified paths are searched for files specified by # the !include statement in a plantuml block. -PLANTUML_INCLUDE_PATH = +PLANTUML_INCLUDE_PATH = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes # that will be shown in the graph. If the number of nodes in a graph becomes @@ -2447,18 +2730,6 @@ DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 0 -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not seem -# to support this out of the box. -# -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_TRANSPARENT = NO - # Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) support @@ -2471,14 +2742,18 @@ DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page # explaining the meaning of the various boxes and arrows in the dot generated # graphs. +# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal +# graphical representation for inheritance and collaboration diagrams is used. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. GENERATE_LEGEND = YES -# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot +# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate # files that are used to generate the various graphs. +# +# Note: This setting is not only used for dot files but also for msc temporary +# files. # The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. DOT_CLEANUP = YES diff --git a/ApplicationLibCode/FileInterface/CMakeLists_files.cmake b/ApplicationLibCode/FileInterface/CMakeLists_files.cmake index 7759377c46..8a488e718e 100644 --- a/ApplicationLibCode/FileInterface/CMakeLists_files.cmake +++ b/ApplicationLibCode/FileInterface/CMakeLists_files.cmake @@ -1,6 +1,7 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RifTextDataTableFormatter.h ${CMAKE_CURRENT_LIST_DIR}/RifEclipseInputFileTools.h + ${CMAKE_CURRENT_LIST_DIR}/RifRoffFileTools.h ${CMAKE_CURRENT_LIST_DIR}/RifEclipseOutputFileTools.h ${CMAKE_CURRENT_LIST_DIR}/RifEclipseRestartDataAccess.h ${CMAKE_CURRENT_LIST_DIR}/RifEclipseRestartFilesetAccess.h @@ -50,6 +51,7 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RifActiveCellsReader.h ${CMAKE_CURRENT_LIST_DIR}/RifCsvDataTableFormatter.h ${CMAKE_CURRENT_LIST_DIR}/RifEclipseInputPropertyLoader.h + ${CMAKE_CURRENT_LIST_DIR}/RifInputPropertyLoader.h ${CMAKE_CURRENT_LIST_DIR}/RifSurfaceImporter.h ${CMAKE_CURRENT_LIST_DIR}/RifRoffReader.h ${CMAKE_CURRENT_LIST_DIR}/RifColorLegendData.h @@ -59,9 +61,8 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelDeviationFrkExporter.h ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelPerfsFrkExporter.h ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelAsymmetricFrkExporter.h + ${CMAKE_CURRENT_LIST_DIR}/RifThermalFractureTemplateSurfaceExporter.h ${CMAKE_CURRENT_LIST_DIR}/RifSurfaceExporter.h - ${CMAKE_CURRENT_LIST_DIR}/RifFaultRAXmlWriter.h - ${CMAKE_CURRENT_LIST_DIR}/RifFaultRAJsonWriter.h ${CMAKE_CURRENT_LIST_DIR}/RifParameterXmlReader.h ${CMAKE_CURRENT_LIST_DIR}/RifOpmCommonSummary.h ${CMAKE_CURRENT_LIST_DIR}/RifEnsembleFractureStatisticsExporter.h @@ -79,6 +80,7 @@ set(SOURCE_GROUP_HEADER_FILES set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RifTextDataTableFormatter.cpp ${CMAKE_CURRENT_LIST_DIR}/RifEclipseInputFileTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifRoffFileTools.cpp ${CMAKE_CURRENT_LIST_DIR}/RifEclipseOutputFileTools.cpp ${CMAKE_CURRENT_LIST_DIR}/RifEclipseRestartDataAccess.cpp ${CMAKE_CURRENT_LIST_DIR}/RifEclipseRestartFilesetAccess.cpp @@ -126,6 +128,7 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RifCsvDataTableFormatter.cpp ${CMAKE_CURRENT_LIST_DIR}/RifReaderEnsembleStatisticsRft.cpp ${CMAKE_CURRENT_LIST_DIR}/RifEclipseInputPropertyLoader.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifInputPropertyLoader.cpp ${CMAKE_CURRENT_LIST_DIR}/RifSurfaceImporter.cpp ${CMAKE_CURRENT_LIST_DIR}/RifRoffReader.cpp ${CMAKE_CURRENT_LIST_DIR}/RifColorLegendData.cpp @@ -135,9 +138,8 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelDeviationFrkExporter.cpp ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelPerfsFrkExporter.cpp ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelAsymmetricFrkExporter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifThermalFractureTemplateSurfaceExporter.cpp ${CMAKE_CURRENT_LIST_DIR}/RifSurfaceExporter.cpp - ${CMAKE_CURRENT_LIST_DIR}/RifFaultRAXmlWriter.cpp - ${CMAKE_CURRENT_LIST_DIR}/RifFaultRAJsonWriter.cpp ${CMAKE_CURRENT_LIST_DIR}/RifParameterXmlReader.cpp ${CMAKE_CURRENT_LIST_DIR}/RifOpmCommonSummary.cpp ${CMAKE_CURRENT_LIST_DIR}/RifEnsembleFractureStatisticsExporter.cpp diff --git a/ApplicationLibCode/FileInterface/RifCsvUserDataParser.cpp b/ApplicationLibCode/FileInterface/RifCsvUserDataParser.cpp index 175c1c2ef2..9998141063 100644 --- a/ApplicationLibCode/FileInterface/RifCsvUserDataParser.cpp +++ b/ApplicationLibCode/FileInterface/RifCsvUserDataParser.cpp @@ -313,19 +313,69 @@ bool RifCsvUserDataParser::parseColumnInfo( QTextStream* dataStr QString line = dataStream->readLine(); if ( line.trimmed().isEmpty() ) continue; - QStringList lineColumns = RifFileParseTools::splitLineAndTrim( line, parseOptions.cellSeparator ); + QStringList columnHeaders = RifFileParseTools::splitLineAndTrim( line, parseOptions.cellSeparator ); + + // Optional support for unit text (second header line) and names (third header line) + QStringList unitTexts; + QStringList names; - int colCount = lineColumns.size(); + auto startOfLineWithDataValues = dataStream->pos(); + bool hasDataValues = false; + while ( !hasDataValues ) + { + QString candidateLine = dataStream->readLine(); + + QStringList candidateColumnHeaders = + RifFileParseTools::splitLineAndTrim( candidateLine, parseOptions.cellSeparator ); + for ( const auto& text : candidateColumnHeaders ) + { + if ( RiaStdStringTools::isNumber( text.toStdString(), parseOptions.locale.decimalPoint().toLatin1() ) ) + hasDataValues = true; + } + + if ( !hasDataValues && candidateColumnHeaders.size() == columnHeaders.size() ) + { + if ( unitTexts.empty() ) + { + unitTexts = candidateColumnHeaders; + } + else if ( names.empty() ) + { + names = candidateColumnHeaders; + } + + startOfLineWithDataValues = dataStream->pos(); + } + } + + dataStream->seek( startOfLineWithDataValues ); + + int colCount = columnHeaders.size(); for ( int iCol = 0; iCol < colCount; iCol++ ) { - QString colName = RiaTextStringTools::trimAndRemoveDoubleSpaces( lineColumns[iCol] ); + QString colName = RiaTextStringTools::trimAndRemoveDoubleSpaces( columnHeaders[iCol] ); + + if ( iCol < names.size() ) + { + QString name = RiaTextStringTools::trimAndRemoveDoubleSpaces( names[iCol] ); + if ( !name.isEmpty() ) + { + // Create summary address in the form "WBHP:A-1", : + colName += ":" + name; + } + } + + QString unit; + if ( iCol < unitTexts.size() ) unit = unitTexts[iCol]; + RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( colName.toStdString() ); - Column col = Column::createColumnInfoFromCsvData( addr, "" ); + Column col = Column::createColumnInfoFromCsvData( addr, unit.toStdString() ); columnInfoList->push_back( col ); } + headerFound = true; } diff --git a/ApplicationLibCode/FileInterface/RifEclipseInputFileTools.cpp b/ApplicationLibCode/FileInterface/RifEclipseInputFileTools.cpp index ad889028ec..ccd82e8e89 100644 --- a/ApplicationLibCode/FileInterface/RifEclipseInputFileTools.cpp +++ b/ApplicationLibCode/FileInterface/RifEclipseInputFileTools.cpp @@ -501,10 +501,10 @@ void RifEclipseInputFileTools::saveFault( QString const cvf::Vec3st& refinement ) { QFile exportFile( completeFilename ); - if ( !exportFile.open( QIODevice::WriteOnly | QIODevice::Text ) ) { RiaLogging::error( "Could not open the file : " + completeFilename ); + return; } QTextStream stream( &exportFile ); diff --git a/ApplicationLibCode/FileInterface/RifEclipseInputPropertyLoader.cpp b/ApplicationLibCode/FileInterface/RifEclipseInputPropertyLoader.cpp index 1e541d6334..48b11b4746 100644 --- a/ApplicationLibCode/FileInterface/RifEclipseInputPropertyLoader.cpp +++ b/ApplicationLibCode/FileInterface/RifEclipseInputPropertyLoader.cpp @@ -31,65 +31,6 @@ #include "RimEclipseInputProperty.h" #include "RimEclipseInputPropertyCollection.h" -#include "RimTools.h" - -#include "cafProgressInfo.h" - -#include - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RifEclipseInputPropertyLoader::loadAndSyncronizeInputProperties( RimEclipseInputPropertyCollection* inputPropertyCollection, - RigEclipseCaseData* eclipseCaseData, - const std::vector& filenames, - bool allowImportOfFaults ) -{ - std::vector existingProperties = inputPropertyCollection->inputProperties.children(); - - caf::ProgressInfo progInfo( static_cast( filenames.size() ), "Reading Input properties" ); - - for ( const auto& filename : filenames ) - { - progInfo.setProgressDescription( filename ); - - auto resultNamesEclipseKeywords = RifEclipseInputPropertyLoader::readProperties( filename, eclipseCaseData ); - - for ( const auto& [resultName, eclipseKeyword] : resultNamesEclipseKeywords ) - { - bool isProperyPresent = false; - bool isFaultKeywordPresent = false; - for ( const auto* propertyObj : existingProperties ) - { - if ( propertyObj->resultName() == resultName ) - { - isProperyPresent = true; - } - else if ( propertyObj->resultName() == "FAULTS" ) - { - isFaultKeywordPresent = true; - } - } - - if ( !isProperyPresent ) - { - RimEclipseInputProperty* inputProperty = new RimEclipseInputProperty; - inputProperty->resultName = resultName; - inputProperty->eclipseKeyword = eclipseKeyword; - inputProperty->fileName = filename; - inputProperty->resolvedState = RimEclipseInputProperty::RESOLVED; - inputPropertyCollection->inputProperties.push_back( inputProperty ); - } - - if ( allowImportOfFaults && isFaultKeywordPresent ) - { - RifEclipseInputFileTools::importFaultsFromFile( eclipseCaseData, filename ); - } - } - - progInfo.incrementProgress(); - } -} //-------------------------------------------------------------------------------------------------- /// diff --git a/ApplicationLibCode/FileInterface/RifEclipseInputPropertyLoader.h b/ApplicationLibCode/FileInterface/RifEclipseInputPropertyLoader.h index 81b8c92a64..d178464b14 100644 --- a/ApplicationLibCode/FileInterface/RifEclipseInputPropertyLoader.h +++ b/ApplicationLibCode/FileInterface/RifEclipseInputPropertyLoader.h @@ -41,21 +41,16 @@ class ProgressInfo; class RifEclipseInputPropertyLoader { public: - static void loadAndSyncronizeInputProperties( RimEclipseInputPropertyCollection* inputPropertyCollection, - RigEclipseCaseData* eclipseCaseData, - const std::vector& filenames, - bool allowImportOfFaults ); - static void createInputPropertiesFromKeywords( RigEclipseCaseData* eclipseCase, const std::vector& keywordContent ); + // Returns map of assigned resultName and Eclipse Keyword. + static std::map readProperties( const QString& fileName, RigEclipseCaseData* eclipseCase ); + private: // Hide constructor to prevent instantiation RifEclipseInputPropertyLoader(); - // Returns map of assigned resultName and Eclipse Keyword. - static std::map readProperties( const QString& fileName, RigEclipseCaseData* eclipseCase ); - static const std::vector& invalidPropertyDataKeywords(); static bool isValidDataKeyword( const QString& keyword ); diff --git a/ApplicationLibCode/FileInterface/RifEclipseTextFileReader.cpp b/ApplicationLibCode/FileInterface/RifEclipseTextFileReader.cpp index a9e3ce0525..5c548606b1 100644 --- a/ApplicationLibCode/FileInterface/RifEclipseTextFileReader.cpp +++ b/ApplicationLibCode/FileInterface/RifEclipseTextFileReader.cpp @@ -28,6 +28,7 @@ #include "RiaPreferencesSystem.h" #include "RiaStdStringTools.h" +#include #include #include #include @@ -71,6 +72,8 @@ std::vector RifEclipseTextFileReader::readKeywordAndVa std::vector RifEclipseTextFileReader::readKeywordAndValuesMemoryMappedFile( const std::string& filename ) { + if ( !std::filesystem::exists( filename ) ) return {}; + mio::mmap_source mmap( filename ); std::error_code error; diff --git a/ApplicationLibCode/FileInterface/RifFaultRAJsonWriter.cpp b/ApplicationLibCode/FileInterface/RifFaultRAJsonWriter.cpp deleted file mode 100644 index 712f3b9407..0000000000 --- a/ApplicationLibCode/FileInterface/RifFaultRAJsonWriter.cpp +++ /dev/null @@ -1,109 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2021 Equinor ASA -// -// ResInsight 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 3 of the License, or -// (at your option) any later version. -// -// ResInsight 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 at -// for more details. -// -///////////////////////////////////////////////////////////////////////////////// - -#include "RifFaultRAJsonWriter.h" - -#include "RimFaultRAPostprocSettings.h" -#include "RimFaultRAPreprocSettings.h" -#include "RimGenericParameter.h" -#include "RimParameterGroup.h" - -#include "caf.h" - -#include -#include - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RifFaultRAJSonWriter::writeToPreprocFile( RimFaultRAPreprocSettings& settings, QString& outErrorText ) -{ - QString filename = settings.preprocParameterFilename(); - - outErrorText = "Unable to write to file \"" + filename + "\" - "; - - QFile file( filename ); - if ( file.open( QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text ) ) - { - QTextStream stream( &file ); - - stream << "{" << caf::endl; - stream << "\"odb_path\": \"" + settings.geomechCaseFilename() + "\"," << caf::endl; - stream << "\"time_start\": \"" + settings.startTimeStepGeoMech() + "\"," << caf::endl; - stream << "\"time_end\": \"" + settings.endTimeStepGeoMech() + "\"," << caf::endl; - stream << "\"out_path\": \"" + settings.outputAbaqusDirectory() + "\"" << caf::endl; - stream << "}" << caf::endl; - - file.close(); - } - else - { - outErrorText += "Could not open file."; - return false; - } - - outErrorText = ""; - return true; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RifFaultRAJSonWriter::writeToPostprocFile( int faultID, RimFaultRAPostprocSettings* settings, QString& outErrorText ) -{ - QString filename = settings->postprocParameterFilename( faultID ); - - outErrorText = "Unable to write to file \"" + filename + "\" - "; - - QFile file( filename ); - if ( file.open( QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text ) ) - { - QTextStream stream( &file ); - - stream << "{" << caf::endl; - - if ( settings->geomechEnabled() ) - { - if ( QFile::exists( settings->advancedMacrisDatabase() ) ) - stream << "\"MacrisCalcCalibration_path\": \"" + settings->advancedMacrisDatabase() + "\"," << caf::endl; - } - - if ( QFile::exists( settings->basicMacrisDatabase() ) ) - stream << "\"MacrisCalc_path\": \"" + settings->basicMacrisDatabase() + "\"," << caf::endl; - - stream << "\"base_directory_path\": \"" + settings->outputBaseDirectory() + "\"," << caf::endl; - - for ( auto p : settings->parameters()->parameters() ) - { - stream << "\"" + p->name() + "\" : " + p->stringValue() + "," << caf::endl; - } - - stream << "\"tsurf_loadsteps\": [ " + settings->stepsToLoad().join( ',' ) + " ]" << caf::endl; - stream << "}" << caf::endl; - - file.close(); - } - else - { - outErrorText += "Could not open file."; - return false; - } - - outErrorText = ""; - return true; -} diff --git a/ApplicationLibCode/FileInterface/RifFaultRAXmlWriter.cpp b/ApplicationLibCode/FileInterface/RifFaultRAXmlWriter.cpp deleted file mode 100644 index 801a067e29..0000000000 --- a/ApplicationLibCode/FileInterface/RifFaultRAXmlWriter.cpp +++ /dev/null @@ -1,81 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2021 Equinor ASA -// -// ResInsight 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 3 of the License, or -// (at your option) any later version. -// -// ResInsight 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 at -// for more details. -// -///////////////////////////////////////////////////////////////////////////////// - -#include "RifFaultRAXmlWriter.h" - -#include "RimFaultRASettings.h" -#include "RimGenericParameter.h" - -#include "caf.h" - -#include -#include - -RifFaultRAXmlWriter::RifFaultRAXmlWriter( RimFaultRASettings* settings ) - : m_settings( settings ) -{ -} - -RifFaultRAXmlWriter::~RifFaultRAXmlWriter() -{ -} - -bool RifFaultRAXmlWriter::writeCalculateFile( QString filename, int faultID, QString& outErrorText ) -{ - std::list paramlist = m_settings->basicParameters( faultID ); - return writeParametersToXML( filename, paramlist, outErrorText ); -} - -bool RifFaultRAXmlWriter::writeCalibrateFile( QString filename, int faultID, QString& outErrorText ) -{ - std::list paramlist = m_settings->advancedParameters( faultID ); - return writeParametersToXML( filename, paramlist, outErrorText ); -} - -bool RifFaultRAXmlWriter::writeParametersToXML( QString filename, std::list& params, QString& outErrorText ) -{ - bool bResult = false; - - outErrorText = "Unable to write to file \"" + filename + "\" - "; - - QFile file( filename ); - if ( file.open( QIODevice::ReadWrite ) ) - { - QTextStream stream( &file ); - - stream << "" << caf::endl; - stream << "" << caf::endl; - - for ( auto& p : params ) - { - QString tmpStr = QString( "<%1>%2" ).arg( p->name(), p->stringValue() ); - stream << tmpStr << caf::endl; - } - stream << "" << caf::endl; - - bResult = true; - } - else - { - outErrorText += "Could not open file."; - } - - if ( bResult ) outErrorText = ""; - - return bResult; -} diff --git a/ApplicationLibCode/FileInterface/RifFileParseTools.cpp b/ApplicationLibCode/FileInterface/RifFileParseTools.cpp index c355bb6f24..1e26e0e32e 100644 --- a/ApplicationLibCode/FileInterface/RifFileParseTools.cpp +++ b/ApplicationLibCode/FileInterface/RifFileParseTools.cpp @@ -22,6 +22,10 @@ #ifdef _MSC_VER #pragma warning( disable : 4996 ) #endif +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/FileInterface/RifHdf5SummaryExporter.cpp b/ApplicationLibCode/FileInterface/RifHdf5SummaryExporter.cpp index 0f82a43b07..e25c0a21d0 100644 --- a/ApplicationLibCode/FileInterface/RifHdf5SummaryExporter.cpp +++ b/ApplicationLibCode/FileInterface/RifHdf5SummaryExporter.cpp @@ -18,6 +18,7 @@ #include "RifHdf5SummaryExporter.h" +#include "RiaFilePathTools.h" #include "RiaLogging.h" #include "RiaPreferencesSummary.h" #include "RiaStdStringTools.h" @@ -98,7 +99,7 @@ bool RifHdf5SummaryExporter::ensureHdf5FileIsCreated( const std::string& smspecF { exportIsRequired = true; } - else if ( RifHdf5SummaryExporter::isFirstOlderThanSecond( h5FileName, smspecFileName ) ) + else if ( RiaFilePathTools::isFirstOlderThanSecond( h5FileName, smspecFileName ) ) { exportIsRequired = true; } @@ -269,18 +270,3 @@ bool RifHdf5SummaryExporter::writeSummaryVectors( RifHdf5Exporter& exporter, Opm return true; } - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RifHdf5SummaryExporter::isFirstOlderThanSecond( const std::string& firstFileName, const std::string& secondFileName ) -{ - // Use Opm namespace to make sure the code compiles on older compilers - - if ( !std::filesystem::exists( firstFileName ) || !std::filesystem::exists( secondFileName ) ) return false; - - auto timeA = std::filesystem::last_write_time( firstFileName ); - auto timeB = std::filesystem::last_write_time( secondFileName ); - - return ( timeA < timeB ); -} diff --git a/ApplicationLibCode/FileInterface/RifHdf5SummaryExporter.h b/ApplicationLibCode/FileInterface/RifHdf5SummaryExporter.h index 47d25d2c96..afc5ae3beb 100644 --- a/ApplicationLibCode/FileInterface/RifHdf5SummaryExporter.h +++ b/ApplicationLibCode/FileInterface/RifHdf5SummaryExporter.h @@ -51,6 +51,4 @@ class RifHdf5SummaryExporter private: static bool writeGeneralSection( RifHdf5Exporter& exporter, Opm::EclIO::ESmry& sourceSummaryData ); static bool writeSummaryVectors( RifHdf5Exporter& exporter, Opm::EclIO::ESmry& sourceSummaryData ); - - static bool isFirstOlderThanSecond( const std::string& firstFileName, const std::string& secondFileName ); }; diff --git a/ApplicationLibCode/FileInterface/RifInputPropertyLoader.cpp b/ApplicationLibCode/FileInterface/RifInputPropertyLoader.cpp new file mode 100644 index 0000000000..e593ef111d --- /dev/null +++ b/ApplicationLibCode/FileInterface/RifInputPropertyLoader.cpp @@ -0,0 +1,102 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022- Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RifInputPropertyLoader.h" + +#include "RifEclipseInputFileTools.h" +#include "RifEclipseInputPropertyLoader.h" +#include "RifRoffFileTools.h" + +#include "RigEclipseCaseData.h" + +#include "RimEclipseInputProperty.h" +#include "RimEclipseInputPropertyCollection.h" + +#include "cafProgressInfo.h" + +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RifInputPropertyLoader::loadAndSynchronizeInputProperties( RimEclipseInputPropertyCollection* inputPropertyCollection, + RigEclipseCaseData* eclipseCaseData, + const std::vector& filenames, + bool allowImportOfFaults ) +{ + std::vector existingProperties = inputPropertyCollection->inputProperties.children(); + + caf::ProgressInfo progInfo( static_cast( filenames.size() ), "Reading Input properties" ); + + for ( const auto& filename : filenames ) + { + progInfo.setProgressDescription( filename ); + + auto resultNamesEclipseKeywords = RifInputPropertyLoader::readProperties( filename, eclipseCaseData ); + + for ( const auto& [resultName, eclipseKeyword] : resultNamesEclipseKeywords ) + { + bool isProperyPresent = false; + bool isFaultKeywordPresent = false; + for ( const auto* propertyObj : existingProperties ) + { + if ( propertyObj->resultName() == resultName ) + { + isProperyPresent = true; + } + else if ( propertyObj->resultName() == "FAULTS" ) + { + isFaultKeywordPresent = true; + } + } + + if ( !isProperyPresent ) + { + RimEclipseInputProperty* inputProperty = new RimEclipseInputProperty; + inputProperty->resultName = resultName; + inputProperty->eclipseKeyword = eclipseKeyword; + inputProperty->fileName = filename; + inputProperty->resolvedState = RimEclipseInputProperty::RESOLVED; + inputPropertyCollection->inputProperties.push_back( inputProperty ); + } + + if ( allowImportOfFaults && isFaultKeywordPresent ) + { + RifEclipseInputFileTools::importFaultsFromFile( eclipseCaseData, filename ); + } + } + + progInfo.incrementProgress(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::map RifInputPropertyLoader::readProperties( const QString& fileName, + RigEclipseCaseData* eclipseCaseData ) +{ + RiaDefines::ImportFileType fileType = RiaDefines::obtainFileTypeFromFileName( fileName ); + if ( fileType == RiaDefines::ImportFileType::ROFF_FILE ) + { + auto [isOk, keywordMapping] = RifRoffFileTools::createInputProperties( fileName, eclipseCaseData ); + return keywordMapping; + } + + return RifEclipseInputPropertyLoader::readProperties( fileName, eclipseCaseData ); +} diff --git a/ApplicationLibCode/FileInterface/RifInputPropertyLoader.h b/ApplicationLibCode/FileInterface/RifInputPropertyLoader.h new file mode 100644 index 0000000000..4c81a45806 --- /dev/null +++ b/ApplicationLibCode/FileInterface/RifInputPropertyLoader.h @@ -0,0 +1,44 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022- Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include + +#include +#include + +class RimEclipseInputPropertyCollection; +class RigEclipseCaseData; + +//================================================================================================== +// +// +// +//================================================================================================== +class RifInputPropertyLoader +{ +public: + static void loadAndSynchronizeInputProperties( RimEclipseInputPropertyCollection* inputPropertyCollection, + RigEclipseCaseData* eclipseCaseData, + const std::vector& filenames, + bool allowImportOfFaults ); + +private: + static std::map readProperties( const QString& fileName, RigEclipseCaseData* eclipseCaseData ); +}; diff --git a/ApplicationLibCode/FileInterface/RifJsonEncodeDecode.cpp b/ApplicationLibCode/FileInterface/RifJsonEncodeDecode.cpp index 5f1fe11b00..5dede33d8c 100644 --- a/ApplicationLibCode/FileInterface/RifJsonEncodeDecode.cpp +++ b/ApplicationLibCode/FileInterface/RifJsonEncodeDecode.cpp @@ -16,15 +16,13 @@ // ///////////////////////////////////////////////////////////////////////////////// -// Json parser based on code example found on: -// http://stackoverflow.com/questions/4169988/easiest-way-to-parse-json-in-qt-4-7 - #include "RifJsonEncodeDecode.h" #include +#include +#include +#include #include -#include -#include namespace ResInsightInternalJson { @@ -35,117 +33,65 @@ QMap JsonReader::decodeFile( QString filePath ) file.open( QIODevice::ReadOnly ); QByteArray byteArray = file.readAll(); file.close(); - QString jsonString( byteArray ); - Json json; - return json.decode( jsonString ); + return Json::decode( byteArray ); } -#if IMPL_DUMP_TO_FILE -void JsonReader::dumpToFile( std::vector& points, QString filePath ) +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QVariantList JsonReader::getVariantList( const QMap& map ) { - QFile file; - file.setFileName( filePath ); - file.open( QIODevice::WriteOnly ); - for ( size_t idx = 0; idx < points.size(); idx++ ) - { - cvf::Vec3d point = points[idx]; - QString string; - string.sprintf( "(%0.10e, %0.10e, %0.10e)\n", point.x(), point.y(), point.z() ); - QByteArray byteArray( string.toLatin1() ); - file.write( byteArray ); - } - file.close(); + // Assume a "root" key with a variant list + return map[JsonReader::rootKeyText()].toList(); } -#endif +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString JsonReader::rootKeyText() +{ + return "root"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- QString Json::encode( const QMap& map, bool prettify ) { - QScriptEngine engine; - if ( prettify ) - { - engine.evaluate( "function toString() { return JSON.stringify(this, null, ' ') }" ); - } - else - { - engine.evaluate( "function toString() { return JSON.stringify(this) }" ); - } + QJsonDocument doc( QJsonObject::fromVariantMap( map ) ); - QScriptValue toString = engine.globalObject().property( "toString" ); - QScriptValue obj = encodeInner( map, &engine ); - return toString.call( obj ).toString(); + QJsonDocument::JsonFormat format = prettify ? QJsonDocument::JsonFormat::Indented : QJsonDocument::JsonFormat::Compact; + return doc.toJson( format ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- QMap Json::decode( const QString& jsonStr ) { - QScriptValue object; - QScriptEngine engine; - object = engine.evaluate( "(" + jsonStr + ")" ); - return decodeInner( object ); + return Json::decode( jsonStr.toUtf8() ); } -QScriptValue Json::encodeInner( const QMap& map, QScriptEngine* engine ) +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QMap Json::decode( const QByteArray& byteArray ) { - QScriptValue obj = engine->newObject(); - QMapIterator i( map ); - while ( i.hasNext() ) - { - i.next(); - if ( i.value().type() == QVariant::String ) - obj.setProperty( i.key(), i.value().toString() ); - else if ( i.value().type() == QVariant::Int ) - obj.setProperty( i.key(), i.value().toInt() ); - else if ( i.value().type() == QVariant::Double ) - obj.setProperty( i.key(), i.value().toDouble() ); - else if ( i.value().type() == QVariant::List ) - obj.setProperty( i.key(), qScriptValueFromSequence( engine, i.value().toList() ) ); - else if ( i.value().type() == QVariant::Map ) - obj.setProperty( i.key(), encodeInner( i.value().toMap(), engine ) ); - } - return obj; -} + auto document = QJsonDocument::fromJson( byteArray ); + if ( document.isObject() ) return QJsonDocument::fromJson( byteArray ).object().toVariantMap(); -QMap Json::decodeInner( QScriptValue object ) -{ - QMap map; - QScriptValueIterator it( object ); - while ( it.hasNext() ) + // Return a variant map with "root" as key and a variant list if the document contains an array + if ( document.isArray() ) { - it.next(); - if ( it.value().isArray() ) - map.insert( it.name(), QVariant( decodeInnerToList( it.value() ) ) ); - else if ( it.value().isNumber() ) - map.insert( it.name(), QVariant( it.value().toNumber() ) ); - else if ( it.value().isString() ) - map.insert( it.name(), QVariant( it.value().toString() ) ); - else if ( it.value().isNull() ) - map.insert( it.name(), QVariant() ); - else if ( it.value().isObject() ) - map.insert( it.name(), QVariant( decodeInner( it.value() ) ) ); - } - return map; -} + auto variantList = document.array().toVariantList(); -QList Json::decodeInnerToList( QScriptValue arrayValue ) -{ - QList list; - QScriptValueIterator it( arrayValue ); - while ( it.hasNext() ) - { - it.next(); - if ( it.name() == "length" ) continue; + QMap map; - if ( it.value().isArray() ) - list.append( QVariant( decodeInnerToList( it.value() ) ) ); - else if ( it.value().isNumber() ) - list.append( QVariant( it.value().toNumber() ) ); - else if ( it.value().isString() ) - list.append( QVariant( it.value().toString() ) ); - else if ( it.value().isNull() ) - list.append( QVariant() ); - else if ( it.value().isObject() ) - list.append( QVariant( decodeInner( it.value() ) ) ); + map[JsonReader::rootKeyText()] = variantList; + return map; } - return list; + + return {}; } -} // namespace ResInsightInternalJson \ No newline at end of file +} // namespace ResInsightInternalJson diff --git a/ApplicationLibCode/FileInterface/RifJsonEncodeDecode.h b/ApplicationLibCode/FileInterface/RifJsonEncodeDecode.h index a2f59d47d5..679f0ac710 100644 --- a/ApplicationLibCode/FileInterface/RifJsonEncodeDecode.h +++ b/ApplicationLibCode/FileInterface/RifJsonEncodeDecode.h @@ -18,23 +18,9 @@ #pragma once -// Json parser based on code example found on: -// http://stackoverflow.com/questions/4169988/easiest-way-to-parse-json-in-qt-4-7 - -//#define IMPL_DUMP_TO_FILE - -#include #include #include #include -#include - -#if IMPL_DUMP_TO_FILE -#include -#include -#endif - -class QScriptEngine; // Encapsulate the JSON code in a namespace to avoid issues with JSON classes used in opm-parser namespace ResInsightInternalJson @@ -44,22 +30,18 @@ class JsonReader public: QMap decodeFile( QString filePath ); -#if IMPL_DUMP_TO_FILE - void dumpToFile( std::vector& points, QString filePath ); -#endif + // Get a variant list from a map + static QVariantList getVariantList( const QMap& map ); + + static QString rootKeyText(); }; class Json { public: - Json(){}; - QString encode( const QMap& map, bool prettify ); - QMap decode( const QString& jsonStr ); - -private: - QScriptValue encodeInner( const QMap& map, QScriptEngine* engine ); - QMap decodeInner( QScriptValue object ); - QList decodeInnerToList( QScriptValue arrayValue ); + static QString encode( const QMap& map, bool prettify ); + static QMap decode( const QString& jsonStr ); + static QMap decode( const QByteArray& byteArray ); }; -} // namespace ResInsightInternalJson \ No newline at end of file +} // namespace ResInsightInternalJson diff --git a/ApplicationLibCode/FileInterface/RifOpmCommonSummary.cpp b/ApplicationLibCode/FileInterface/RifOpmCommonSummary.cpp index 6374024d68..e126da77cd 100644 --- a/ApplicationLibCode/FileInterface/RifOpmCommonSummary.cpp +++ b/ApplicationLibCode/FileInterface/RifOpmCommonSummary.cpp @@ -18,6 +18,7 @@ #include "RifOpmCommonSummary.h" +#include "RiaFilePathTools.h" #include "RiaLogging.h" #include "RiaStdStringTools.h" @@ -28,10 +29,6 @@ #include "opm/io/eclipse/ESmry.hpp" #include "opm/io/eclipse/ExtESmry.hpp" -#ifdef USE_OPENMP -#include -#endif - #include size_t RifOpmCommonEclipseSummary::sm_createdEsmryFileCount = 0; @@ -85,19 +82,37 @@ size_t RifOpmCommonEclipseSummary::numberOfEnhancedSummaryFileCreated() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RifOpmCommonEclipseSummary::open( const QString& headerFileName, - bool includeRestartFiles, - RiaThreadSafeLogger* threadSafeLogger ) +bool RifOpmCommonEclipseSummary::open( const QString& fileName, bool includeRestartFiles, RiaThreadSafeLogger* threadSafeLogger ) { if ( m_createEsmryFiles ) { - auto candidateFileName = enhancedSummaryFilename( headerFileName ); - if ( !QFileInfo::exists( candidateFileName ) ) + auto candidateEsmryFileName = enhancedSummaryFilename( fileName ); + + // Make sure to check the smspec file name, as it is supported to import ESMRY files without any SMSPEC data + auto smspecFileName = smspecSummaryFilename( fileName ); + + if ( QFile::exists( candidateEsmryFileName ) && QFile::exists( smspecFileName ) && + RiaFilePathTools::isFirstOlderThanSecond( candidateEsmryFileName.toStdString(), smspecFileName.toStdString() ) ) + { + QString root = QFileInfo( smspecFileName ).canonicalPath(); + + const QString smspecFileNameShort = QFileInfo( smspecFileName ).fileName(); + const QString esmryFileNameShort = QFileInfo( candidateEsmryFileName ).fileName(); + + RiaLogging::debug( QString( " %3 : %1 is older than %2, recreating %1." ) + .arg( esmryFileNameShort ) + .arg( smspecFileNameShort ) + .arg( root ) ); + + std::filesystem::remove( candidateEsmryFileName.toStdString() ); + } + + if ( !QFile::exists( candidateEsmryFileName ) && QFile::exists( smspecFileName ) ) { try { auto temporarySummaryFile = - std::make_unique( headerFileName.toStdString(), includeRestartFiles ); + std::make_unique( smspecFileName.toStdString(), includeRestartFiles ); temporarySummaryFile->make_esmry_file(); @@ -105,16 +120,18 @@ bool RifOpmCommonEclipseSummary::open( const QString& headerFileName, } catch ( std::exception& e ) { - QString txt = QString( "Failed to create optimized summary file. Error text : %1" ).arg( e.what() ); - - if ( threadSafeLogger ) threadSafeLogger->error( txt ); + if ( threadSafeLogger ) + { + QString txt = QString( "Warning, could not open summary file : %1" ).arg( smspecFileName ); + threadSafeLogger->warning( txt ); + } return false; } } } - if ( !openFileReader( headerFileName, includeRestartFiles, threadSafeLogger ) ) return false; + if ( !openFileReader( fileName, includeRestartFiles, threadSafeLogger ) ) return false; if ( !m_standardReader && !m_enhancedReader ) return false; @@ -222,19 +239,54 @@ void RifOpmCommonEclipseSummary::buildMetaData() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RifOpmCommonEclipseSummary::openFileReader( const QString& headerFileName, +bool RifOpmCommonEclipseSummary::openFileReader( const QString& fileName, bool includeRestartFiles, RiaThreadSafeLogger* threadSafeLogger ) { + // Make sure to check the SMSPEC file name, as it is supported to import ESMRY files without any SMSPEC data. + auto smspecFileName = smspecSummaryFilename( fileName ); + if ( m_useEsmryFiles ) { try { - auto candidateFileName = enhancedSummaryFilename( headerFileName ); - m_enhancedReader = - std::make_unique( candidateFileName.toStdString(), includeRestartFiles ); + auto candidateEsmryFileName = enhancedSummaryFilename( fileName ); - return true; + if ( QFile::exists( candidateEsmryFileName ) ) + { + bool isValidEsmryFile = false; + + if ( !QFile::exists( smspecFileName ) ) + { + // No SMSPEC file present, OK to import ESMRY file + isValidEsmryFile = true; + } + else if ( RiaFilePathTools::isFirstOlderThanSecond( smspecFileName.toStdString(), + candidateEsmryFileName.toStdString() ) ) + { + isValidEsmryFile = true; + } + else + { + QString root = QFileInfo( smspecFileName ).canonicalPath(); + + const QString smspecFileNameShort = QFileInfo( smspecFileName ).fileName(); + const QString esmryFileNameShort = QFileInfo( candidateEsmryFileName ).fileName(); + + RiaLogging::warning( QString( " %3 : %1 is older than %2, importing data from newest file %2." ) + .arg( esmryFileNameShort ) + .arg( smspecFileNameShort ) + .arg( root ) ); + } + + if ( isValidEsmryFile ) + { + m_enhancedReader = std::make_unique( candidateEsmryFileName.toStdString(), + includeRestartFiles ); + + return true; + } + } } catch ( ... ) { @@ -244,7 +296,11 @@ bool RifOpmCommonEclipseSummary::openFileReader( const QString& headerFile try { - m_standardReader = std::make_unique( headerFileName.toStdString(), includeRestartFiles ); + // The standard reader will import data from SMSPEC and UNSMRY files + if ( QFile::exists( smspecFileName ) ) + { + m_standardReader = std::make_unique( smspecFileName.toStdString(), includeRestartFiles ); + } } catch ( std::exception& e ) { @@ -271,12 +327,21 @@ void RifOpmCommonEclipseSummary::increaseEsmryFileCount() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QString RifOpmCommonEclipseSummary::enhancedSummaryFilename( const QString& headerFileName ) +QString RifOpmCommonEclipseSummary::enhancedSummaryFilename( const QString& fileName ) { - QString s( headerFileName ); + QString s( fileName ); return s.replace( ".SMSPEC", ".ESMRY" ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RifOpmCommonEclipseSummary::smspecSummaryFilename( const QString& fileName ) +{ + QString s( fileName ); + return s.replace( ".ESMRY", ".SMSPEC" ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/FileInterface/RifOpmCommonSummary.h b/ApplicationLibCode/FileInterface/RifOpmCommonSummary.h index 77ee4be84f..f5959758ec 100644 --- a/ApplicationLibCode/FileInterface/RifOpmCommonSummary.h +++ b/ApplicationLibCode/FileInterface/RifOpmCommonSummary.h @@ -72,7 +72,7 @@ class RifOpmCommonEclipseSummary : public RifSummaryReaderInterface static void resetEnhancedSummaryFileCount(); static size_t numberOfEnhancedSummaryFileCreated(); - bool open( const QString& headerFileName, bool includeRestartFiles, RiaThreadSafeLogger* threadSafeLogger ); + bool open( const QString& fileName, bool includeRestartFiles, RiaThreadSafeLogger* threadSafeLogger ); const std::vector& timeSteps( const RifEclipseSummaryAddress& resultAddress ) const override; bool values( const RifEclipseSummaryAddress& resultAddress, std::vector* values ) const override; @@ -81,10 +81,11 @@ class RifOpmCommonEclipseSummary : public RifSummaryReaderInterface private: void buildMetaData(); - bool openFileReader( const QString& headerFileName, bool includeRestartFiles, RiaThreadSafeLogger* threadSafeLogger ); + bool openFileReader( const QString& fileName, bool includeRestartFiles, RiaThreadSafeLogger* threadSafeLogger ); static void increaseEsmryFileCount(); - static QString enhancedSummaryFilename( const QString& headerFileName ); + static QString enhancedSummaryFilename( const QString& fileName ); + static QString smspecSummaryFilename( const QString& fileName ); private: std::unique_ptr m_standardReader; diff --git a/ApplicationLibCode/FileInterface/RifOpmHdf5Summary.cpp b/ApplicationLibCode/FileInterface/RifOpmHdf5Summary.cpp index 4ff202e7cb..3d2a982c43 100644 --- a/ApplicationLibCode/FileInterface/RifOpmHdf5Summary.cpp +++ b/ApplicationLibCode/FileInterface/RifOpmHdf5Summary.cpp @@ -32,10 +32,6 @@ #include -#ifdef USE_OPENMP -#include -#endif - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/FileInterface/RifReaderEclipseOutput.cpp b/ApplicationLibCode/FileInterface/RifReaderEclipseOutput.cpp index 8ab512011f..b59592adf9 100644 --- a/ApplicationLibCode/FileInterface/RifReaderEclipseOutput.cpp +++ b/ApplicationLibCode/FileInterface/RifReaderEclipseOutput.cpp @@ -1178,11 +1178,8 @@ void RifReaderEclipseOutput::sourSimRlResult( const QString& result, size_t step return; } - size_t activeCellCount = cvf::UNDEFINED_SIZE_T; - { - RigActiveCellInfo* fracActCellInfo = m_eclipseCase->activeCellInfo( RiaDefines::PorosityModelType::MATRIX_MODEL ); - fracActCellInfo->gridActiveCellCounts( 0, activeCellCount ); - } + RigActiveCellInfo* fracActCellInfo = m_eclipseCase->activeCellInfo( RiaDefines::PorosityModelType::MATRIX_MODEL ); + size_t activeCellCount = fracActCellInfo->gridActiveCellCounts( 0 ); size_t fileIndex = timeStepIndexOnFile( stepIndex ); @@ -2262,10 +2259,8 @@ QStringList RifReaderEclipseOutput::validKeywordsForPorosityModel( const QString { if ( timeStepCount == 1 ) { - size_t mainGridMatrixActiveCellCount; - matrixActiveCellInfo->gridActiveCellCounts( 0, mainGridMatrixActiveCellCount ); - size_t mainGridFractureActiveCellCount; - fractureActiveCellInfo->gridActiveCellCounts( 0, mainGridFractureActiveCellCount ); + size_t mainGridMatrixActiveCellCount = matrixActiveCellInfo->gridActiveCellCounts( 0 ); + size_t mainGridFractureActiveCellCount = fractureActiveCellInfo->gridActiveCellCounts( 0 ); if ( keywordDataItemCount == mainGridMatrixActiveCellCount || keywordDataItemCount == mainGridFractureActiveCellCount || @@ -2413,11 +2408,8 @@ void RifReaderEclipseOutput::extractResultValuesBasedOnPorosityModel( RiaDefines { if ( m_eclipseCase->mainGrid()->gridByIndex( i )->isTempGrid() ) continue; - size_t matrixActiveCellCount = 0; - size_t fractureActiveCellCount = 0; - - actCellInfo->gridActiveCellCounts( i, matrixActiveCellCount ); - fracActCellInfo->gridActiveCellCounts( i, fractureActiveCellCount ); + size_t matrixActiveCellCount = actCellInfo->gridActiveCellCounts( i ); + size_t fractureActiveCellCount = fracActCellInfo->gridActiveCellCounts( i ); if ( matrixOrFracture == RiaDefines::PorosityModelType::MATRIX_MODEL ) { diff --git a/ApplicationLibCode/FileInterface/RifReaderEclipseSummary.cpp b/ApplicationLibCode/FileInterface/RifReaderEclipseSummary.cpp index 42af9effd9..62722b056e 100644 --- a/ApplicationLibCode/FileInterface/RifReaderEclipseSummary.cpp +++ b/ApplicationLibCode/FileInterface/RifReaderEclipseSummary.cpp @@ -63,7 +63,7 @@ bool RifReaderEclipseSummary::open( const QString& headerFileName, RiaThreadSafe // Create reader as specified by the user using the following fallback strategy // // ESMRY - // - if h5 file is present on disk + // - if h5 file is present on disk and prefSummary->createEnhancedSummaryDataFiles() is false // - use h5 reader // - else // - create ESMRY file if defined in preference @@ -91,8 +91,9 @@ bool RifReaderEclipseSummary::open( const QString& headerFileName, RiaThreadSafe bool h5FileFound = QFile::exists( h5FileName ); - if ( h5FileFound || - ( prefSummary->summaryDataReader() == RiaPreferencesSummary::SummaryReaderMode::HDF5_OPM_COMMON ) ) + if ( !prefSummary->createEnhancedSummaryDataFiles() && + ( h5FileFound || + ( prefSummary->summaryDataReader() == RiaPreferencesSummary::SummaryReaderMode::HDF5_OPM_COMMON ) ) ) { #ifdef USE_HDF5 if ( prefSummary->createH5SummaryDataFiles() ) diff --git a/ApplicationLibCode/FileInterface/RifReaderOpmRft.cpp b/ApplicationLibCode/FileInterface/RifReaderOpmRft.cpp index 5a030f4773..ca9eca32a1 100644 --- a/ApplicationLibCode/FileInterface/RifReaderOpmRft.cpp +++ b/ApplicationLibCode/FileInterface/RifReaderOpmRft.cpp @@ -39,16 +39,19 @@ /// //-------------------------------------------------------------------------------------------------- RifReaderOpmRft::RifReaderOpmRft( const QString& fileName, const QString& dataDeckFileName ) + : m_fileName( fileName ) + , m_dataDeckFileName( dataDeckFileName ) + , m_detectedErrorWhenOpeningRftFile( false ) { - openFiles( fileName, dataDeckFileName ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RifReaderOpmRft::RifReaderOpmRft( const QString& fileName ) + : m_fileName( fileName ) + , m_detectedErrorWhenOpeningRftFile( false ) { - openFiles( fileName, "" ); } //-------------------------------------------------------------------------------------------------- @@ -56,6 +59,8 @@ RifReaderOpmRft::RifReaderOpmRft( const QString& fileName ) //-------------------------------------------------------------------------------------------------- std::set RifReaderOpmRft::eclipseRftAddresses() { + openFiles(); + return m_addresses; } @@ -64,6 +69,8 @@ std::set RifReaderOpmRft::eclipseRftAddresses() //-------------------------------------------------------------------------------------------------- void RifReaderOpmRft::values( const RifEclipseRftAddress& rftAddress, std::vector* values ) { + if ( !openFiles() ) return; + auto wellName = rftAddress.wellName().toStdString(); auto resultName = rftAddress.segmentResultName().toStdString(); @@ -81,7 +88,8 @@ void RifReaderOpmRft::values( const RifEclipseRftAddress& rftAddress, std::vecto { auto data = segment.topology(); - auto indices = segment.indicesForBranchIndex( rftAddress.segmentBranchIndex(), rftAddress.segmentBranchType() ); + auto indices = + segment.segmentIndicesForBranchIndex( rftAddress.segmentBranchIndex(), rftAddress.segmentBranchType() ); for ( const auto& i : indices ) { CAF_ASSERT( i < data.size() ); @@ -98,15 +106,6 @@ void RifReaderOpmRft::values( const RifEclipseRftAddress& rftAddress, std::vecto } return; } - else if ( rftAddress.segmentResultName() == RiaDefines::segmentOneBasedBranchIndexResultName() ) - { - auto branchIndices = segment.oneBasedBranchIndices(); - for ( const auto& branchNumber : branchIndices ) - { - values->push_back( branchNumber ); - } - return; - } } if ( resultName.empty() ) @@ -116,7 +115,8 @@ void RifReaderOpmRft::values( const RifEclipseRftAddress& rftAddress, std::vecto try { - auto data = m_opm_rft->getRft( resultName, wellName, y, m, d ); + std::vector data = resultAsFloat( resultName, wellName, y, m, d ); + if ( !data.empty() ) { if ( rftAddress.wellLogChannel() == RifEclipseRftAddress::RftWellLogChannelType::SEGMENT_VALUES ) @@ -124,7 +124,7 @@ void RifReaderOpmRft::values( const RifEclipseRftAddress& rftAddress, std::vecto auto key = std::make_pair( wellName, RftDate{ y, m, d } ); auto segment = m_rftWellDateSegments[key]; - if ( resultName.find( "CON" ) == 0 ) + if ( m_connectionResultItemCount.count( wellName ) && data.size() == m_connectionResultItemCount[wellName] ) { // Connection results with size equal to length of result CONSEGNO. CONSEGNO defines the segment // numbers the connection is connected to. @@ -154,14 +154,20 @@ void RifReaderOpmRft::values( const RifEclipseRftAddress& rftAddress, std::vecto } else { - auto indices = - segment.indicesForBranchIndex( rftAddress.segmentBranchIndex(), rftAddress.segmentBranchType() ); + auto indices = segment.segmentIndicesForBranchIndex( rftAddress.segmentBranchIndex(), + rftAddress.segmentBranchType() ); for ( const auto& i : indices ) { CAF_ASSERT( i < data.size() ); values->push_back( data[i] ); } } + + if ( resultName == "CONFAC" || resultName == "CONKH" ) + { + // Replace undefined values with zero to improve readability of plots + std::replace( values->begin(), values->end(), std::numeric_limits::infinity(), 0.0 ); + } } else { @@ -179,6 +185,8 @@ void RifReaderOpmRft::values( const RifEclipseRftAddress& rftAddress, std::vecto //-------------------------------------------------------------------------------------------------- std::set RifReaderOpmRft::availableTimeSteps( const QString& wellName ) { + openFiles(); + std::set timeSteps; for ( const auto& address : m_addresses ) @@ -198,6 +206,8 @@ std::set RifReaderOpmRft::availableTimeSteps( const QString& wellName, const RifEclipseRftAddress::RftWellLogChannelType& wellLogChannelName ) { + openFiles(); + if ( wellLogChannelName == RifEclipseRftAddress::RftWellLogChannelType::SEGMENT_VALUES ) return m_rftSegmentTimeSteps; @@ -220,6 +230,8 @@ std::set RifReaderOpmRft::availableTimeSteps( const QString& wellName, const std::set& relevantChannels ) { + openFiles(); + std::set timeSteps; for ( const auto& address : m_addresses ) @@ -237,6 +249,8 @@ std::set //-------------------------------------------------------------------------------------------------- std::set RifReaderOpmRft::availableWellLogChannels( const QString& wellName ) { + openFiles(); + std::set types; for ( const auto& a : m_addresses ) @@ -255,6 +269,8 @@ std::set RifReaderOpmRft::available //-------------------------------------------------------------------------------------------------- std::set RifReaderOpmRft::wellNames() { + openFiles(); + return m_wellNames; } @@ -263,6 +279,8 @@ std::set RifReaderOpmRft::wellNames() //-------------------------------------------------------------------------------------------------- void RifReaderOpmRft::cellIndices( const RifEclipseRftAddress& rftAddress, std::vector* indices ) { + if ( !openFiles() ) return; + auto wellName = rftAddress.wellName().toStdString(); auto date = rftAddress.timeStep().date(); @@ -295,20 +313,72 @@ void RifReaderOpmRft::cellIndices( const RifEclipseRftAddress& rftAddress, std:: } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::map RifReaderOpmRft::branchIdsAndOneBasedIndices( const QString& wellName, + const QDateTime& timeStep, + RiaDefines::RftBranchType branchType ) +{ + int y = timeStep.date().year(); + int m = timeStep.date().month(); + int d = timeStep.date().day(); + + auto key = std::make_pair( wellName.toStdString(), RftDate{ y, m, d } ); + if ( m_rftWellDateSegments.count( key ) > 0 ) + { + auto segment = m_rftWellDateSegments[key]; + return segment.branchIdsAndOneBasedBranchIndices( branchType ); + } + + return {}; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RifRftSegment RifReaderOpmRft::segmentForWell( const QString& wellName, const QDateTime& timeStep ) +{ + openFiles(); + + int y = timeStep.date().year(); + int m = timeStep.date().month(); + int d = timeStep.date().day(); + + auto key = std::make_pair( wellName.toStdString(), RftDate{ y, m, d } ); + if ( m_rftWellDateSegments.count( key ) > 0 ) + { + return m_rftWellDateSegments[key]; + } + + return {}; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RifReaderOpmRft::readWseglink( const std::string& filePath ) { - m_wseglink = RiaOpmParserTools::extractWseglink( filePath ); + if ( filePath.empty() ) return; + + QString text = QString( "Scanning for WSEGLINK data in %1\n" ).arg( QString::fromStdString( filePath ) ); + m_wseglink = RiaOpmParserTools::extractWseglink( filePath ); if ( !m_wseglink.empty() ) { - QString text = QString( "Imported segment data from %1\n" ).arg( QString::fromStdString( filePath ) ); - text += QString( "Number of wells: %1\n" ).arg( m_wseglink.size() ); + text += "Imported WSEGLINK data from well(s):\n"; - RiaLogging::info( text ); + for ( auto [wellName, links] : m_wseglink ) + { + text += " " + QString::fromStdString( wellName ) + "\n"; + } } + else + { + text += QString( " No WSEGLINK data found." ); + } + + RiaLogging::info( text ); } //-------------------------------------------------------------------------------------------------- @@ -323,6 +393,8 @@ void RifReaderOpmRft::openFiles( const QString& fileName, const QString& dataDec readWseglink( dataDeckFileName.toStdString() ); buildMetaData(); + + return; } catch ( const std::exception& e ) { @@ -332,6 +404,8 @@ void RifReaderOpmRft::openFiles( const QString& fileName, const QString& dataDec { RiaLogging::error( QString( "Failed to open RFT file %1" ).arg( fileName ) ); } + + m_detectedErrorWhenOpeningRftFile = true; } //-------------------------------------------------------------------------------------------------- @@ -345,22 +419,17 @@ void RifReaderOpmRft::buildMetaData() importWellNames(); auto reports = m_opm_rft->listOfRftReports(); - for ( const auto& report : reports ) + for ( const auto& [wellName, reportDate, reportTime] : reports ) { - auto [wellName, reportDate, reportTime] = report; - auto rftVectors = m_opm_rft->listOfRftArrays( wellName, reportDate ); + auto results = m_opm_rft->listOfRftArrays( wellName, reportDate ); - for ( const auto& rftVec : rftVectors ) + for ( const auto& [name, arrayType, size] : results ) { - auto [resultDataName, arrType, itemCount] = rftVec; - - int y = std::get<0>( reportDate ); - int m = std::get<1>( reportDate ); - int d = std::get<2>( reportDate ); + const auto& [y, m, d] = reportDate; auto dt = RiaQDateTimeTools::createUtcDateTime( QDate( y, m, d ) ); - auto channelType = identifyChannelType( resultDataName ); + auto channelType = identifyChannelType( name ); if ( channelType != RifEclipseRftAddress::RftWellLogChannelType::NONE ) { auto adr = RifEclipseRftAddress::createAddress( QString::fromStdString( wellName ), dt, channelType ); @@ -377,22 +446,17 @@ void RifReaderOpmRft::buildMetaData() auto [wellName, reportDate] = segmentWellData.first; auto segmentData = segmentWellData.second; - auto resultNameAndSizes = segmentData.resultNameAndSize(); - - int y = std::get<0>( reportDate ); - int m = std::get<1>( reportDate ); - int d = std::get<2>( reportDate ); - - auto dt = RiaQDateTimeTools::createUtcDateTime( QDate( y, m, d ) ); + const auto& [y, m, d] = reportDate; + auto dt = RiaQDateTimeTools::createUtcDateTime( QDate( y, m, d ) ); m_rftSegmentTimeSteps.insert( dt ); - for ( const auto& resultNameAndSize : resultNameAndSizes ) + auto resultNameAndSizes = segmentData.resultNameAndSize(); + for ( const auto& [name, arrayType, size] : resultNameAndSizes ) { - auto resultName = std::get<0>( resultNameAndSize ); - auto adr = RifEclipseRftAddress::createSegmentAddress( QString::fromStdString( wellName ), + auto adr = RifEclipseRftAddress::createSegmentAddress( QString::fromStdString( wellName ), dt, - QString::fromStdString( resultName ) ); + QString::fromStdString( name ) ); m_addresses.insert( adr ); } @@ -462,11 +526,34 @@ void RifReaderOpmRft::buildSegmentData() RifRftSegment segment; segment.setSegmentData( segmentsForWellDate ); - auto arraysAtWellDate = m_opm_rft->listOfRftArrays( wellName, date ); - for ( const auto& rftResultMetaData : arraysAtWellDate ) + auto results = m_opm_rft->listOfRftArrays( wellName, date ); + + for ( const auto& [name, arrayType, size] : results ) { - auto [name, arrayType, size] = rftResultMetaData; - if ( ( name.find( "SEG" ) == 0 ) || ( name.find( "CON" ) == 0 ) ) + if ( ( name.find( "SEG" ) == 0 ) && m_segmentResultItemCount.count( wellName ) == 0 ) + { + m_segmentResultItemCount[wellName] = size; + } + if ( name.find( "CON" ) == 0 && m_connectionResultItemCount.count( wellName ) == 0 ) + { + m_connectionResultItemCount[wellName] = size; + } + } + + for ( const auto& rftResultMetaData : results ) + { + const auto& [name, arrayType, size] = rftResultMetaData; + + bool isResultItemCountValid = false; + if ( m_segmentResultItemCount.count( wellName ) && + size == static_cast( m_segmentResultItemCount[wellName] ) ) + isResultItemCountValid = true; + + if ( m_connectionResultItemCount.count( wellName ) && + size == static_cast( m_connectionResultItemCount[wellName] ) ) + isResultItemCountValid = true; + + if ( isResultItemCountValid ) { segment.addResultNameAndSize( rftResultMetaData ); } @@ -490,8 +577,9 @@ void RifReaderOpmRft::segmentDataDebugLog() const auto [wellName, date] = a.first; auto segmentData = a.second; - std::cout << "\nWell: " << wellName << "Date : " << std::get<0>( date ) << " " << std::get<1>( date ) << " " - << std::get<2>( date ) << " \n"; + const auto& [y, m, d] = date; + + std::cout << "\nWell: " << wellName << "Date : " << y << " " << m << " " << d << " \n"; for ( const auto& r : segmentData.topology() ) { @@ -538,17 +626,15 @@ void RifReaderOpmRft::buildSegmentBranchTypes( const RftSegmentKey& segmentKey ) // The device segment is connected to a segment on the tubing branch // // Annulus branch - // Layer between device branch and reservoir. The segment connection data is imported from WSEGLINK in the data deck + // Layer between device branch and reservoir. The segment connection data is imported from WSEGLINK in the + // data deck auto wellName = segmentKey.first; auto date = segmentKey.second; RifRftSegment& segmentRef = m_rftWellDateSegments[segmentKey]; - int y = std::get<0>( date ); - int m = std::get<1>( date ); - int d = std::get<2>( date ); - - auto dt = RiaQDateTimeTools::createUtcDateTime( QDate( y, m, d ) ); + const auto& [y, m, d] = date; + auto dt = RiaQDateTimeTools::createUtcDateTime( QDate( y, m, d ) ); std::vector seglenstValues; std::vector seglenenValues; @@ -568,116 +654,225 @@ void RifReaderOpmRft::buildSegmentBranchTypes( const RftSegmentKey& segmentKey ) values( resultName, &seglenenValues ); } - int oneBasedBranchIndex = 1; - if ( !seglenenValues.empty() && !seglenstValues.empty() ) { - // Find tubing and annulus branch types + identifyTubingCandidateBranches( segmentRef, wellName, seglenstValues, seglenenValues ); + identifyAnnulusBranches( segmentRef, seglenstValues ); + + // The tubing branches are given increasing branch indices. If a tubing branch is categorized as an + // annulus branch, the index values must be reassigned. Each triplet of tubing/device/annulus has a + // unique branch index. + reassignBranchIndices( segmentRef ); + + identifyDeviceBranches( segmentRef, seglenstValues ); + // Assign branch index to annulus branches auto branchIds = segmentRef.branchIds(); - for ( auto id : branchIds ) + for ( auto branchId : branchIds ) { - double minimumMD = std::numeric_limits::max(); - double maximumMD = std::numeric_limits::min(); + auto branchType = segmentRef.branchType( branchId ); + if ( branchType == RiaDefines::RftBranchType::RFT_ANNULUS ) + { + auto segmentIndices = segmentRef.segmentIndicesForBranchNumber( branchId ); + if ( segmentIndices.empty() ) continue; - std::vector segmentNumbers; + auto firstSegmentIndex = segmentIndices.front(); + auto firstSegment = segmentRef.topology()[firstSegmentIndex]; + auto candidateSegmentNumber = firstSegment.segNext(); - auto indices = segmentRef.indicesForBranchNumber( id ); - for ( auto i : indices ) - { - minimumMD = std::min( minimumMD, seglenstValues[i] ); - maximumMD = std::max( maximumMD, seglenenValues[i] ); - segmentNumbers.push_back( segmentRef.topology()[i].segNo() ); + auto candidateDeviceSeg = segmentRef.segmentData( candidateSegmentNumber ); + if ( candidateDeviceSeg ) + { + auto branchIndex = segmentRef.oneBasedBranchIndexForBranchId( candidateDeviceSeg->segBrno() ); + if ( branchIndex >= 0 ) + { + segmentRef.setOneBasedBranchIndex( branchId, branchIndex ); + } + } } + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RifReaderOpmRft::identifyTubingCandidateBranches( RifRftSegment& segmentRef, + const std::string& wellName, + const std::vector& seglenstValues, + const std::vector& seglenenValues ) +{ + int oneBasedBranchIndex = 1; + + auto branchIds = segmentRef.branchIds(); + for ( auto id : branchIds ) + { + double minimumMD = std::numeric_limits::max(); + double maximumMD = std::numeric_limits::min(); + + std::vector segmentNumbers; - double length = maximumMD - minimumMD; + auto indices = segmentRef.segmentIndicesForBranchNumber( id ); + for ( auto i : indices ) + { + minimumMD = std::min( minimumMD, seglenstValues[i] ); + maximumMD = std::max( maximumMD, seglenenValues[i] ); + segmentNumbers.push_back( segmentRef.topology()[i].segNo() ); + } - segmentRef.setBranchLength( id, length ); + double length = maximumMD - minimumMD; - RiaDefines::RftBranchType branchType = RiaDefines::RftBranchType::RFT_UNKNOWN; + segmentRef.setBranchLength( id, length ); - bool hasFoundAnnulusBranch = false; + RiaDefines::RftBranchType branchType = RiaDefines::RftBranchType::RFT_UNKNOWN; - auto annulusSegments = annulusSegmentsForWell( wellName ); + bool hasFoundAnnulusBranch = false; - std::vector matchingSegments; - std::set_intersection( segmentNumbers.begin(), - segmentNumbers.end(), - annulusSegments.begin(), - annulusSegments.end(), - std::inserter( matchingSegments, matchingSegments.end() ) ); + // If WESEGLINK is imported, get annulus segments for well + auto annulusSegments = annulusSegmentsForWell( wellName ); - if ( !matchingSegments.empty() ) + std::vector matchingSegments; + std::set_intersection( segmentNumbers.begin(), + segmentNumbers.end(), + annulusSegments.begin(), + annulusSegments.end(), + std::inserter( matchingSegments, matchingSegments.end() ) ); + + if ( !matchingSegments.empty() ) + { { - { - branchType = RiaDefines::RftBranchType::RFT_ANNULUS; + branchType = RiaDefines::RftBranchType::RFT_ANNULUS; - // NOTE: Assign branch index after device branch is detected - hasFoundAnnulusBranch = true; - } + // NOTE: Assign branch index after device branch is detected + hasFoundAnnulusBranch = true; } + } - if ( !hasFoundAnnulusBranch ) + if ( !hasFoundAnnulusBranch ) + { + const double tubingThreshold = 1.0; + if ( length > tubingThreshold ) { - const double tubingThreshold = 1.0; - if ( length > tubingThreshold ) - { - branchType = RiaDefines::RftBranchType::RFT_TUBING; - segmentRef.setOneBasedBranchIndex( id, oneBasedBranchIndex++ ); - } + branchType = RiaDefines::RftBranchType::RFT_TUBING; + segmentRef.setOneBasedBranchIndex( id, oneBasedBranchIndex++ ); } + } + + segmentRef.setBranchType( id, branchType ); + } +} - segmentRef.setBranchType( id, branchType ); +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RifReaderOpmRft::identifyAnnulusBranches( RifRftSegment& segmentRef, const std::vector& seglenstValues ) +{ + // If no WESEGLINK data is present, compare the location of the last N segments of two tubing branches. If + // the difference is correct, mark candidate branch as annulus branch instead of tubing. + + if ( m_wseglink.empty() ) + { + auto tubingIds = segmentRef.tubingBranchIds(); + + std::map> seglenstForBranch; + + for ( auto branchId : tubingIds ) + { + std::vector values; + + auto indices = segmentRef.segmentIndicesForBranchNumber( branchId ); + for ( auto i : indices ) + { + values.push_back( seglenstValues[i] ); + } + + seglenstForBranch[branchId] = values; } - auto tubingBranchIds = segmentRef.tubingBranchIds(); + std::set annulusBranchIds; - for ( auto& segment : segmentRef.topology() ) + for ( auto branchId : tubingIds ) { - auto segmentBranchId = segment.segBrno(); - auto it = std::find( tubingBranchIds.begin(), tubingBranchIds.end(), segmentBranchId ); - if ( it == tubingBranchIds.end() ) + if ( annulusBranchIds.count( branchId ) ) continue; + + for ( auto candidateBranchId : tubingIds ) { - auto tubingSegmentNumber = segment.segNext(); + if ( candidateBranchId == branchId ) continue; + if ( annulusBranchIds.count( candidateBranchId ) ) continue; + + auto branchValues = seglenstForBranch.at( branchId ); + auto candidateValues = seglenstForBranch.at( candidateBranchId ); + + double lastBranchValue = branchValues.back(); + double lastCandidateValue = candidateValues.back(); - auto tubingSegmentData = segmentRef.segmentData( tubingSegmentNumber ); - if ( tubingSegmentData != nullptr ) + double diff = lastCandidateValue - lastBranchValue; + + const double epsilon = 1e-3; + const double distanceTubingAnnulus = 0.1; + if ( std::fabs( ( std::fabs( diff ) - distanceTubingAnnulus ) ) < epsilon ) { - auto it = std::find( tubingBranchIds.begin(), tubingBranchIds.end(), tubingSegmentData->segBrno() ); - if ( it != tubingBranchIds.end() ) - { - // Find all connected segments that is not assigned a branch type, and mark as device - // layer + int annulusBranchId = ( diff > 0 ) ? candidateBranchId : branchId; - auto tubingBranchIndex = segmentRef.oneBasedBranchIndexForBranchId( tubingSegmentData->segBrno() ); - segmentRef.createDeviceBranch( segment.segNo(), tubingBranchIndex ); - } + segmentRef.setBranchType( annulusBranchId, RiaDefines::RftBranchType::RFT_ANNULUS ); + annulusBranchIds.insert( annulusBranchId ); } } } + } +} - // Assign branch index to annulus branches +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RifReaderOpmRft::reassignBranchIndices( RifRftSegment& segmentRef ) +{ + auto tubingBranchIds = segmentRef.tubingBranchIds(); - for ( auto branchId : branchIds ) + int oneBasedBranchIndex = 1; + + std::map newOneBasedBranchIndex; + for ( auto branchId : tubingBranchIds ) + { + auto previsousIndex = segmentRef.oneBasedBranchIndexForBranchId( branchId ); + newOneBasedBranchIndex[previsousIndex] = oneBasedBranchIndex++; + } + + for ( auto branchId : segmentRef.branchIds() ) + { + auto branchIndex = segmentRef.oneBasedBranchIndexForBranchId( branchId ); + if ( newOneBasedBranchIndex.count( branchIndex ) ) { - auto branchType = segmentRef.branchType( branchId ); - if ( branchType == RiaDefines::RftBranchType::RFT_ANNULUS ) - { - auto segmentIndices = segmentRef.indicesForBranchNumber( branchId ); - if ( segmentIndices.empty() ) continue; + segmentRef.setOneBasedBranchIndex( branchId, newOneBasedBranchIndex.at( branchIndex ) ); + } + } +} - auto firstSegmentIndex = segmentIndices.front(); - auto firstSegment = segmentRef.topology()[firstSegmentIndex]; - auto candidateSegmentNumber = firstSegment.segNext(); +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RifReaderOpmRft::identifyDeviceBranches( RifRftSegment& segmentRef, const std::vector& seglenstValues ) +{ + auto tubingBranchIds = segmentRef.tubingBranchIds(); - auto candidateDeviceSeg = segmentRef.segmentData( candidateSegmentNumber ); - if ( candidateDeviceSeg ) + for ( auto& segment : segmentRef.topology() ) + { + auto segmentBranchId = segment.segBrno(); + auto it = std::find( tubingBranchIds.begin(), tubingBranchIds.end(), segmentBranchId ); + if ( it == tubingBranchIds.end() ) + { + auto tubingSegmentNumber = segment.segNext(); + + auto tubingSegmentData = segmentRef.segmentData( tubingSegmentNumber ); + if ( tubingSegmentData != nullptr ) + { + auto it = std::find( tubingBranchIds.begin(), tubingBranchIds.end(), tubingSegmentData->segBrno() ); + if ( it != tubingBranchIds.end() ) { - auto branchIndex = segmentRef.oneBasedBranchIndexForBranchId( candidateDeviceSeg->segBrno() ); - if ( branchIndex >= 0 ) - { - segmentRef.setOneBasedBranchIndex( branchId, branchIndex ); - } + // Find all connected segments that is not assigned a branch type, and mark as device layer + + auto tubingBranchIndex = segmentRef.oneBasedBranchIndexForBranchId( tubingSegmentData->segBrno() ); + segmentRef.createDeviceBranch( segment.segNo(), tubingBranchIndex, seglenstValues ); } } } @@ -772,3 +967,57 @@ std::string RifReaderOpmRft::resultNameFromChannelType( RifEclipseRftAddress::Rf return {}; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector + RifReaderOpmRft::resultAsFloat( const std::string& resultName, const std::string& wellName, int year, int month, int day ) const +{ + Opm::EclIO::eclArrType resultDataType = Opm::EclIO::eclArrType::REAL; + + auto results = m_opm_rft->listOfRftArrays( wellName, year, month, day ); + for ( const auto& [name, arrayType, size] : results ) + { + if ( resultName == name ) + { + resultDataType = arrayType; + break; + } + } + + if ( resultDataType == Opm::EclIO::eclArrType::INTE ) + { + std::vector data; + + auto integerData = m_opm_rft->getRft( resultName, wellName, year, month, day ); + for ( auto val : integerData ) + { + data.push_back( val ); + } + + return data; + } + else + { + return m_opm_rft->getRft( resultName, wellName, year, month, day ); + } + + return {}; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifReaderOpmRft::openFiles() +{ + // The file open operations can be costly, so do lazy loading of the files + // NB! Make sure that this function is called from all public functions that needs to access the files + + if ( !isOpen() && !m_detectedErrorWhenOpeningRftFile ) + { + openFiles( m_fileName, m_dataDeckFileName ); + } + + return isOpen(); +} diff --git a/ApplicationLibCode/FileInterface/RifReaderOpmRft.h b/ApplicationLibCode/FileInterface/RifReaderOpmRft.h index df716becb6..d694c077dc 100644 --- a/ApplicationLibCode/FileInterface/RifReaderOpmRft.h +++ b/ApplicationLibCode/FileInterface/RifReaderOpmRft.h @@ -53,6 +53,12 @@ class RifReaderOpmRft : public RifReaderRftInterface, public cvf::Object void cellIndices( const RifEclipseRftAddress& rftAddress, std::vector* indices ) override; + std::map branchIdsAndOneBasedIndices( const QString& wellName, + const QDateTime& timeStep, + RiaDefines::RftBranchType branchType ); + + RifRftSegment segmentForWell( const QString& wellName, const QDateTime& timeStep ); + private: // Segment data // RftDate must be synced with definition in Opm::EclIO::ERft::RftDate @@ -66,6 +72,13 @@ class RifReaderOpmRft : public RifReaderRftInterface, public cvf::Object bool isOpen() const; void importWellNames(); void buildSegmentBranchTypes( const RftSegmentKey& segmentKey ); + void identifyTubingCandidateBranches( RifRftSegment& segmentRef, + const std::string& wellName, + const std::vector& seglenstValues, + const std::vector& seglenenValues ); + void identifyAnnulusBranches( RifRftSegment& segmentRef, const std::vector& seglenstValues ); + void reassignBranchIndices( RifRftSegment& segmentRef ); + void identifyDeviceBranches( RifRftSegment& segmentRef, const std::vector& seglenstValues ); std::vector importWellData( const std::string& wellName, const std::string& propertyName, const RftDate& date ) const; @@ -76,6 +89,11 @@ class RifReaderOpmRft : public RifReaderRftInterface, public cvf::Object static RifEclipseRftAddress::RftWellLogChannelType identifyChannelType( const std::string& resultName ); static std::string resultNameFromChannelType( RifEclipseRftAddress::RftWellLogChannelType channelType ); + std::vector + resultAsFloat( const std::string& resultName, const std::string& wellName, int year, int month, int day ) const; + + bool openFiles(); + private: std::unique_ptr m_opm_rft; @@ -86,5 +104,12 @@ class RifReaderOpmRft : public RifReaderRftInterface, public cvf::Object std::map m_rftWellDateSegments; std::set m_rftSegmentTimeSteps; + std::map m_segmentResultItemCount; + std::map m_connectionResultItemCount; + std::map>> m_wseglink; + + QString m_fileName; + QString m_dataDeckFileName; + bool m_detectedErrorWhenOpeningRftFile; }; diff --git a/ApplicationLibCode/FileInterface/RifRftSegment.cpp b/ApplicationLibCode/FileInterface/RifRftSegment.cpp index 2392702fc7..f44c852fe3 100644 --- a/ApplicationLibCode/FileInterface/RifRftSegment.cpp +++ b/ApplicationLibCode/FileInterface/RifRftSegment.cpp @@ -21,6 +21,8 @@ #include #include +#include "cvfAssert.h" + //-------------------------------------------------------------------------------------------------- /// segnxt : Int ID for the next segment /// brno : Branch ID number @@ -152,26 +154,31 @@ std::vector RifRftSegment::branchIds() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::set RifRftSegment::oneBasedBranchIndices() const +int RifRftSegment::oneBasedBranchIndexForBranchId( int branchId ) const { - std::set indices; - - for ( auto b : m_oneBasedBranchIndexMap ) - { - indices.insert( b.second ); - } + if ( m_oneBasedBranchIndexMap.count( branchId ) > 0 ) return m_oneBasedBranchIndexMap.at( branchId ); - return indices; + return -1; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -int RifRftSegment::oneBasedBranchIndexForBranchId( int branchId ) const +std::map RifRftSegment::branchIdsAndOneBasedBranchIndices( RiaDefines::RftBranchType branchType ) const { - if ( m_oneBasedBranchIndexMap.count( branchId ) > 0 ) return m_oneBasedBranchIndexMap.at( branchId ); + std::map mapForBranchType; - return -1; + // find all branch ids for the given branch type + + for ( const auto& [branchId, branchIndex] : m_oneBasedBranchIndexMap ) + { + if ( branchType == RiaDefines::RftBranchType::RFT_UNKNOWN || this->branchType( branchId ) == branchType ) + { + mapForBranchType[branchId] = branchIndex; + } + } + + return mapForBranchType; } //-------------------------------------------------------------------------------------------------- @@ -190,8 +197,21 @@ const RifRftSegmentData* RifRftSegment::segmentData( int segmentNumber ) const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RifRftSegment::createDeviceBranch( int deviceBranchFirstSegmentNumber, int oneBasedBranchIndex ) +const RifRftSegmentData* RifRftSegment::segmentDataByIndex( int segmentIndex ) const { + CVF_ASSERT( segmentIndex < static_cast( m_topology.size() ) ); + + return &( m_topology[segmentIndex] ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RifRftSegment::createDeviceBranch( int deviceBranchFirstSegmentNumber, + int oneBasedBranchIndex, + const std::vector& seglenstValues ) +{ + double lastAssignedDeviceBranchDepth = -1.0; for ( auto& segData : m_topology ) { if ( segData.segNo() < deviceBranchFirstSegmentNumber ) continue; @@ -199,6 +219,13 @@ void RifRftSegment::createDeviceBranch( int deviceBranchFirstSegmentNumber, int auto branchNumber = segData.segBrno(); if ( branchType( branchNumber ) != RiaDefines::RftBranchType::RFT_UNKNOWN ) return; + auto segmentIndex = segmentIndexFromSegmentNumber( segData.segNo() ); + if ( segmentIndex < 0 ) continue; + + double candidateSegmentDepth = seglenstValues[segmentIndex]; + if ( lastAssignedDeviceBranchDepth > -1.0 && lastAssignedDeviceBranchDepth > candidateSegmentDepth ) return; + + lastAssignedDeviceBranchDepth = candidateSegmentDepth; setOneBasedBranchIndex( segData.segBrno(), oneBasedBranchIndex ); setBranchType( segData.segBrno(), RiaDefines::RftBranchType::RFT_DEVICE ); @@ -242,7 +269,7 @@ RiaDefines::RftBranchType RifRftSegment::branchType( int branchId ) const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RifRftSegment::indicesForBranchNumber( int branchNumber ) const +std::vector RifRftSegment::segmentIndicesForBranchNumber( int branchNumber ) const { std::vector v; for ( size_t i = 0; i < m_topology.size(); i++ ) @@ -260,7 +287,7 @@ std::vector RifRftSegment::indicesForBranchNumber( int branchNumber ) co //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RifRftSegment::indicesForBranchIndex( int branchIndex, RiaDefines::RftBranchType branchType ) const +std::vector RifRftSegment::segmentIndicesForBranchIndex( int branchIndex, RiaDefines::RftBranchType branchType ) const { std::vector v; for ( size_t i = 0; i < m_topology.size(); i++ ) @@ -286,6 +313,33 @@ std::vector RifRftSegment::indicesForBranchIndex( int branchIndex, RiaDe return v; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RifRftSegment::packerSegmentIndicesOnAnnulus( int branchIndex ) const +{ + auto segmentIndices = segmentIndicesForBranchIndex( branchIndex, RiaDefines::RftBranchType::RFT_ANNULUS ); + + std::vector packerSegmentIndices; + + for ( auto segmentIndex : segmentIndices ) + { + auto segment = m_topology[segmentIndex]; + auto outflowSegmentNumber = segment.segNext(); + + auto candidateSegment = segmentData( outflowSegmentNumber ); + if ( !candidateSegment ) continue; + + auto candidateBranchType = branchType( candidateSegment->segBrno() ); + if ( candidateBranchType == RiaDefines::RftBranchType::RFT_DEVICE ) + { + packerSegmentIndices.push_back( segmentIndex ); + } + } + + return packerSegmentIndices; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -294,7 +348,7 @@ std::vector RifRftSegment::segmentNumbersForBranchIndex( int { std::vector v; - auto indices = indicesForBranchIndex( oneBasedBranchIndex, branchType ); + auto indices = segmentIndicesForBranchIndex( oneBasedBranchIndex, branchType ); for ( auto index : indices ) { v.push_back( m_topology[index].segNo() ); @@ -302,3 +356,33 @@ std::vector RifRftSegment::segmentNumbersForBranchIndex( int return v; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::set RifRftSegment::uniqueOneBasedBranchIndices( RiaDefines::RftBranchType branchType ) const +{ + std::set indices; + + for ( const auto [branchId, branchIndex] : m_oneBasedBranchIndexMap ) + { + indices.insert( branchIndex ); + } + + return indices; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RifRftSegment::segmentIndexFromSegmentNumber( int segmentNumber ) const +{ + for ( size_t i = 0; i < m_topology.size(); i++ ) + { + auto segment = m_topology[i]; + + if ( segment.segNo() == segmentNumber ) return static_cast( i ); + } + + return -1; +} diff --git a/ApplicationLibCode/FileInterface/RifRftSegment.h b/ApplicationLibCode/FileInterface/RifRftSegment.h index 6276a0953f..3c8226188a 100644 --- a/ApplicationLibCode/FileInterface/RifRftSegment.h +++ b/ApplicationLibCode/FileInterface/RifRftSegment.h @@ -55,13 +55,17 @@ class RifRftSegment void addResultNameAndSize( const Opm::EclIO::EclFile::EclEntry& resultNameAndSize ); std::vector resultNameAndSize() const; - std::vector tubingBranchIds() const; - std::vector branchIds() const; - std::set oneBasedBranchIndices() const; - int oneBasedBranchIndexForBranchId( int branchId ) const; + std::vector tubingBranchIds() const; + std::vector branchIds() const; + int oneBasedBranchIndexForBranchId( int branchId ) const; + std::map branchIdsAndOneBasedBranchIndices( RiaDefines::RftBranchType branchType ) const; + const RifRftSegmentData* segmentData( int segmentNumber ) const; + const RifRftSegmentData* segmentDataByIndex( int segmentIndex ) const; - void createDeviceBranch( int deviceBranchFirstSegmentNumber, int oneBasedBranchIndex ); + void createDeviceBranch( int deviceBranchFirstSegmentNumber, + int oneBasedBranchIndex, + const std::vector& seglenstValues ); void setBranchLength( int branchId, double length ); void setBranchType( int branchId, RiaDefines::RftBranchType branchType ); @@ -69,11 +73,17 @@ class RifRftSegment RiaDefines::RftBranchType branchType( int branchId ) const; - std::vector indicesForBranchNumber( int branchNumber ) const; - std::vector indicesForBranchIndex( int branchIndex, RiaDefines::RftBranchType branchType ) const; + std::vector segmentIndicesForBranchNumber( int branchNumber ) const; + std::vector segmentIndicesForBranchIndex( int branchIndex, RiaDefines::RftBranchType branchType ) const; + std::vector packerSegmentIndicesOnAnnulus( int branchIndex ) const; std::vector segmentNumbersForBranchIndex( int oneBasedBranchIndex, RiaDefines::RftBranchType branchType ) const; + std::set uniqueOneBasedBranchIndices( RiaDefines::RftBranchType branchType ) const; + +private: + int segmentIndexFromSegmentNumber( int segmentNumber ) const; + private: std::vector m_topology; std::vector m_resultNameAndSize; diff --git a/ApplicationLibCode/FileInterface/RifRoffFileTools.cpp b/ApplicationLibCode/FileInterface/RifRoffFileTools.cpp new file mode 100644 index 0000000000..2fc61b529f --- /dev/null +++ b/ApplicationLibCode/FileInterface/RifRoffFileTools.cpp @@ -0,0 +1,627 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022- Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RifRoffFileTools.h" + +#include "RiaApplication.h" +#include "RiaLogging.h" + +#include "RigActiveCellInfo.h" +#include "RigCaseCellResultsData.h" +#include "RigEclipseCaseData.h" +#include "RigMainGrid.h" + +#include "cafProgressInfo.h" + +#include +#include +#include +#include +#include + +#include "Reader.hpp" + +#ifdef USE_OPENMP +#include +#endif + +using namespace std::chrono; + +//-------------------------------------------------------------------------------------------------- +/// Constructor +//-------------------------------------------------------------------------------------------------- +RifRoffFileTools::RifRoffFileTools() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// Destructor +//-------------------------------------------------------------------------------------------------- +RifRoffFileTools::~RifRoffFileTools() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifRoffFileTools::openGridFile( const QString& fileName, RigEclipseCaseData* eclipseCase, QString* errorMessages ) +{ + RiaLogging::info( QString( "Opening roff file: %1" ).arg( fileName ) ); + + std::string filename = fileName.toStdString(); + + std::ifstream stream( filename, std::ios::binary ); + if ( !stream.good() ) + { + if ( errorMessages ) *errorMessages = QString( "Unable to open roff file" ); + return false; + } + + auto getInt = []( auto values, const std::string& name ) { + auto v = std::find_if( values.begin(), values.end(), [&name]( const auto& arg ) { return arg.first == name; } ); + if ( v != values.end() ) + return std::get( v->second ); + else + throw std::runtime_error( "Missing parameter (integer): " + name ); + }; + + auto getFloat = []( auto values, const std::string& name ) { + auto v = std::find_if( values.begin(), values.end(), [&name]( const auto& arg ) { return arg.first == name; } ); + if ( v != values.end() ) + return std::get( v->second ); + else + throw std::runtime_error( "Missing parameter (float): " + name ); + }; + + try + { + const auto totalStart = high_resolution_clock::now(); + + roff::Reader reader( stream ); + reader.parse(); + + const auto tokenizeDone = high_resolution_clock::now(); + + std::vector> values = reader.scalarNamedValues(); + std::vector> arrayTypes = reader.getNamedArrayTypes(); + + int nx = getInt( values, "dimensions.nX" ); + int ny = getInt( values, "dimensions.nY" ); + int nz = getInt( values, "dimensions.nZ" ); + + float xOffset = getFloat( values, "translate.xoffset" ); + float yOffset = getFloat( values, "translate.yoffset" ); + float zOffset = getFloat( values, "translate.zoffset" ); + + float xScale = getFloat( values, "scale.xscale" ); + float yScale = getFloat( values, "scale.yscale" ); + float zScale = getFloat( values, "scale.zscale" ); + + if ( RiaApplication::enableDevelopmentFeatures() ) + { + RiaLogging::info( QString( "Grid dimensions: %1 %2 %3" ).arg( nx ).arg( ny ).arg( nz ) ); + RiaLogging::info( QString( "Offset: %1 %2 %3" ).arg( xOffset ).arg( yOffset ).arg( zOffset ) ); + RiaLogging::info( QString( "Scale: %1 %2 %3" ).arg( xScale ).arg( yScale ).arg( zScale ) ); + } + + std::vector cornerLines = reader.getFloatArray( "cornerLines.data" ); + std::vector zValues = reader.getFloatArray( "zvalues.data" ); + std::vector splitEnz = reader.getByteArray( "zvalues.splitEnz" ); + std::vector active = reader.getByteArray( "active.data" ); + + const auto parsingDone = high_resolution_clock::now(); + + unsigned int zCornerSize = static_cast( ( nx + 1 ) * ( ny + 1 ) * ( nz + 1 ) * 4u ); + std::vector zCorners( zCornerSize, 0.0 ); + + interpretSplitenzData( static_cast( nz ) + 1, zOffset, zScale, splitEnz, zValues, zCorners ); + + RigActiveCellInfo* activeCellInfo = eclipseCase->activeCellInfo( RiaDefines::PorosityModelType::MATRIX_MODEL ); + CVF_ASSERT( activeCellInfo ); + + RigActiveCellInfo* fractureActiveCellInfo = + eclipseCase->activeCellInfo( RiaDefines::PorosityModelType::FRACTURE_MODEL ); + CVF_ASSERT( fractureActiveCellInfo ); + + RigMainGrid* mainGrid = eclipseCase->mainGrid(); + CVF_ASSERT( mainGrid ); + + cvf::Vec3st gridPointDim( nx + 1, ny + 1, nz + 1 ); + mainGrid->setGridPointDimensions( gridPointDim ); + mainGrid->setGridName( "Main grid" ); + + size_t totalCellCount = nx * ny * nz; + + activeCellInfo->setGridCount( 1 ); + fractureActiveCellInfo->setGridCount( 1 ); + + activeCellInfo->setReservoirCellCount( totalCellCount ); + fractureActiveCellInfo->setReservoirCellCount( totalCellCount ); + + // Reserve room for the cells and nodes and fill them with data + mainGrid->globalCellArray().reserve( totalCellCount ); + mainGrid->nodes().reserve( 8 * totalCellCount ); + + int progTicks = 100; + caf::ProgressInfo progInfo( progTicks, "" ); + + int cellCount = static_cast( totalCellCount ); + size_t cellStartIndex = mainGrid->globalCellArray().size(); + size_t nodeStartIndex = mainGrid->nodes().size(); + + RigCell defaultCell; + defaultCell.setHostGrid( mainGrid ); + mainGrid->globalCellArray().resize( cellStartIndex + cellCount, defaultCell ); + + mainGrid->nodes().resize( nodeStartIndex + static_cast( cellCount ) * 8, cvf::Vec3d( 0, 0, 0 ) ); + + // Swap i and j to get correct faces + const size_t cellMappingECLRi[8] = { 2, 3, 1, 0, 6, 7, 5, 4 }; + + cvf::Vec3d offset( xOffset, yOffset, zOffset ); + cvf::Vec3d scale( xScale, yScale, zScale ); + + std::vector activeCells; + convertToReservoirIndexOrder( nx, ny, nz, active, activeCells ); + + // Precompute the active cell matrix index + size_t numActiveCells = computeActiveCellMatrixIndex( activeCells ); + + // Loop over cells and fill them with data +#pragma omp parallel + { + int cellCountPerThread = cellCount; +#ifdef USE_OPENMP + cellCountPerThread = std::max( 1, cellCount / omp_get_num_threads() ); +#endif + + int computedThreadCellCount = 0; + + int cellsPrProgressTick = std::max( 1, cellCountPerThread / progTicks ); + int maxProgressCell = cellsPrProgressTick * progTicks; + +#pragma omp for + for ( int gridLocalCellIndex = 0; gridLocalCellIndex < cellCount; ++gridLocalCellIndex ) + { + RigCell& cell = mainGrid->globalCellArray()[cellStartIndex + gridLocalCellIndex]; + + cell.setGridLocalCellIndex( gridLocalCellIndex ); + + // Active cell index + int matrixActiveIndex = activeCells[gridLocalCellIndex]; + if ( matrixActiveIndex != -1 ) + { + activeCellInfo->setCellResultIndex( cellStartIndex + gridLocalCellIndex, matrixActiveIndex ); + } + + cell.setParentCellIndex( cvf::UNDEFINED_SIZE_T ); + + // Corner coordinates + for ( int cIdx = 0; cIdx < 8; ++cIdx ) + { + double* point = + mainGrid->nodes()[nodeStartIndex + (size_t)gridLocalCellIndex * 8 + cellMappingECLRi[cIdx]].ptr(); + auto corner = getCorner( *mainGrid, cornerLines, zCorners, gridLocalCellIndex, cIdx, offset, scale ); + + point[0] = corner.x(); + point[1] = corner.y(); + point[2] = corner.z(); + + cell.cornerIndices()[cIdx] = nodeStartIndex + (size_t)gridLocalCellIndex * 8 + cIdx; + } + + // Mark inactive long pyramid looking cells as invalid + cell.setInvalid( cell.isLongPyramidCell() ); + +#ifdef USE_OPENMP + if ( omp_get_thread_num() == 0 ) + { + computedThreadCellCount++; + if ( computedThreadCellCount <= maxProgressCell && computedThreadCellCount % cellsPrProgressTick == 0 ) + progInfo.incrementProgress(); + } +#else + computedThreadCellCount++; + if ( computedThreadCellCount <= maxProgressCell && computedThreadCellCount % cellsPrProgressTick == 0 ) + progInfo.incrementProgress(); +#endif + } + } + + activeCellInfo->setGridActiveCellCounts( 0, numActiveCells ); + fractureActiveCellInfo->setGridActiveCellCounts( 0, 0 ); + + mainGrid->initAllSubGridsParentGridPointer(); + activeCellInfo->computeDerivedData(); + fractureActiveCellInfo->computeDerivedData(); + + if ( RiaApplication::enableDevelopmentFeatures() ) + { + auto gridConstructionDone = high_resolution_clock::now(); + + auto tokenizeDuration = duration_cast( tokenizeDone - totalStart ); + RiaLogging::info( QString( "Tokenizing: %1 ms" ).arg( tokenizeDuration.count() ) ); + + auto parsingDuration = duration_cast( parsingDone - tokenizeDone ); + RiaLogging::info( QString( "Parsing: %1 ms" ).arg( parsingDuration.count() ) ); + + auto gridConstructionDuration = duration_cast( gridConstructionDone - parsingDone ); + RiaLogging::info( QString( "Grid Construction: %1 ms" ).arg( gridConstructionDuration.count() ) ); + + auto totalDuration = duration_cast( gridConstructionDone - totalStart ); + RiaLogging::info( QString( "Total: %1 ms" ).arg( totalDuration.count() ) ); + } + } + catch ( std::runtime_error& err ) + { + RiaLogging::error( QString( "Roff file import failed: %1" ).arg( err.what() ) ); + return false; + } + + return true; +} + +//-------------------------------------------------------------------------------------------------- +// The indexing conventions for vertices in Roff file +// +// 1-------------0 +// /| /| +// / | / | /j +// / | / | / +// 3-------------2 | *---i +// | | | | | +// | 5---------|---4 | +// | / | / |k +// | / | / +// |/ |/ +// 7-------------6 +// vertex indices +// + +// +// The indexing conventions for vertices in ResInsight +// +// 7-------------6 |k +// /| /| | /j +// / | / | |/ +// / | / | *---i +// 4-------------5 | +// | | | | +// | 3---------|---2 +// | / | / +// | / | / +// |/ |/ +// 0-------------1 +// vertex indices +// +//-------------------------------------------------------------------------------------------------- +cvf::Vec3d RifRoffFileTools::getCorner( const RigMainGrid& grid, + const std::vector& cornerLines, + const std::vector& zcorn, + size_t cellIdx, + int cornerIdx, + const cvf::Vec3d& offset, + const cvf::Vec3d& scale ) +{ + size_t iOffset = 0; + if ( !( cornerIdx == 1 || cornerIdx == 3 || cornerIdx == 5 || cornerIdx == 7 ) ) + { + iOffset = 1; + } + + size_t jOffset = 0; + if ( !( cornerIdx == 2 || cornerIdx == 3 || cornerIdx == 6 || cornerIdx == 7 ) ) + { + jOffset = 1; + } + + size_t i; + size_t j; + size_t k; + grid.ijkFromCellIndex( cellIdx, &i, &j, &k ); + + size_t ny = grid.cellCountJ(); + size_t nz = grid.cellCountK(); + + size_t cOffset = ( ( i + iOffset ) * ( ny + 1 ) + ( j + jOffset ) ) * 6; + + cvf::Vec3d top( cornerLines[cOffset], cornerLines[cOffset + 1], cornerLines[cOffset + 2] ); + cvf::Vec3d bottom( cornerLines[cOffset + 3], cornerLines[cOffset + 4], cornerLines[cOffset + 5] ); + + int adjustedCornerIdx = cornerIdx; + if ( cornerIdx == 4 ) adjustedCornerIdx = 0; + if ( cornerIdx == 5 ) adjustedCornerIdx = 1; + if ( cornerIdx == 6 ) adjustedCornerIdx = 2; + if ( cornerIdx == 7 ) adjustedCornerIdx = 3; + + // Find the correct offset k direction + size_t kOffset = 0; + if ( cornerIdx > 3 ) + { + kOffset = 1; + } + + size_t zOffset = ( ( i + iOffset ) * ( ny + 1 ) * ( nz + 1 ) + ( j + jOffset ) * ( nz + 1 ) + ( k + kOffset ) ) * 4 + + adjustedCornerIdx; + + double z = -zcorn[zOffset]; + double x = interpolate( top, bottom, z, 0 ) + offset.x(); + double y = interpolate( top, bottom, z, 1 ) + offset.y(); + + cvf::Vec3d result = cvf::Vec3d( x, y, z ); + return result; +} + +//-------------------------------------------------------------------------------------------------- +/// Adapted from xtgeo +//-------------------------------------------------------------------------------------------------- +double RifRoffFileTools::interpolate( const cvf::Vec3d& top, const cvf::Vec3d& bottom, double z, int idx ) +{ + if ( fabs( bottom[idx] - top[idx] ) > 0.01 ) + { + return top[idx] - ( z - top.z() ) * ( top[idx] - bottom[idx] ) / ( bottom.z() - top.z() ); + } + else + { + return top[idx]; + } +} + +//-------------------------------------------------------------------------------------------------- +/// Adapted from xtgeo: https://github.com/equinor/xtgeo/blob/master/src/clib/xtg/grd3d_roff2xtgeo_splitenz.c +//-------------------------------------------------------------------------------------------------- +void RifRoffFileTools::interpretSplitenzData( int nz, + float zoffset, + float zscale, + const std::vector& splitenz, + const std::vector& zdata, + std::vector& zcornsv ) + +{ + // We Read one corner line (pillar) from zdata at a time (one for each + // i,j), transform it according to zoffset and zscale, and put it in to + // zcornsv in reverse order. + + // As i and j order and size is the same for both zcornsv and zdata, we can + // ignore it here and place one pillar at the time regardless of how many + // pillars there are. + + size_t nzcorn = zcornsv.size(); + size_t nsplitenz = splitenz.size(); + size_t nzdata = zdata.size(); + + size_t num_row = 4 * static_cast( nz ); + if ( nzcorn % num_row != 0 ) throw std::runtime_error( "Incorrect size of zcorn." ); + if ( nsplitenz != nzcorn / 4 ) throw std::runtime_error( "Incorrect size of splitenz." ); + + std::vector pillar( num_row, 0.0 ); + size_t it_zdata = 0, it_splitenz = 0, it_zcorn = 0; + while ( it_zcorn < nzcorn ) + { + for ( size_t it_pillar = 0; it_pillar < num_row; ) + { + char split = splitenz[it_splitenz++]; + if ( split == 1 ) + { + // There is one value for this corner which + // we must duplicate 4 times in zcornsv + if ( it_zdata >= nzdata ) throw std::runtime_error( "Incorrect size of zdata" ); + float val = ( zdata[it_zdata++] + zoffset ) * zscale; + for ( int n = 0; n < 4; n++ ) + { + pillar[it_pillar++] = val; + } + } + else if ( split == 4 ) + { + // There are four value for this corner which + // we must duplicate 4 times in zcornsv + if ( it_zdata + 3 >= nzdata ) throw std::runtime_error( "Incorrect size of zdata" ); + // As we place the pillar in reverse order into zcornsv, + // we must put zdata in reverse order into pillar to + // preserve n,s,w,e directions. + pillar[it_pillar + 3] = ( zdata[it_zdata++] + zoffset ) * zscale; + pillar[it_pillar + 2] = ( zdata[it_zdata++] + zoffset ) * zscale; + pillar[it_pillar + 1] = ( zdata[it_zdata++] + zoffset ) * zscale; + pillar[it_pillar] = ( zdata[it_zdata++] + zoffset ) * zscale; + it_pillar += 4; + } + else + { + throw std::runtime_error( "Unsupported split type" ); + } + } + // Put the pillar into zcornsv in reverse order + for ( size_t it_pillar = num_row; it_pillar >= 1; ) + { + zcornsv[it_zcorn++] = pillar[--it_pillar]; + } + } + + if ( it_splitenz != nsplitenz ) throw std::runtime_error( "Incorrect size of splitenz." ); + if ( it_zdata != nzdata ) throw std::runtime_error( "Incorrect size of zdata" ); + if ( it_zcorn != nzcorn ) throw std::runtime_error( "Incorrect size of zcorn." ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +size_t RifRoffFileTools::computeActiveCellMatrixIndex( std::vector& activeCells ) +{ + int activeMatrixIndex = 0; + int cellCount = static_cast( activeCells.size() ); + for ( int gridLocalCellIndex = 0; gridLocalCellIndex < cellCount; gridLocalCellIndex++ ) + { + if ( activeCells[gridLocalCellIndex] != 0 ) + { + activeCells[gridLocalCellIndex] = activeMatrixIndex; + activeMatrixIndex++; + } + else + { + activeCells[gridLocalCellIndex] = -1; + } + } + + return activeMatrixIndex; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair> + RifRoffFileTools::createInputProperties( const QString& fileName, RigEclipseCaseData* eclipseCaseData ) +{ + RiaLogging::info( QString( "Reading properties from roff file: %1" ).arg( fileName ) ); + + std::string filename = fileName.toStdString(); + + std::map keywordMapping; + + std::ifstream stream( filename, std::ios::binary ); + if ( !stream.good() ) + { + RiaLogging::error( "Unable to open roff file" ); + return std::make_pair( false, keywordMapping ); + } + + try + { + roff::Reader reader( stream ); + reader.parse(); + + std::vector> arrayTypes = reader.getNamedArrayTypes(); + + for ( auto [keyword, kind] : arrayTypes ) + { + size_t keywordLength = reader.getArrayLength( keyword ); + if ( RiaApplication::enableDevelopmentFeatures() ) + { + RiaLogging::info( QString( "Array found: '%1'. Type: %2 with size: %3." ) + .arg( QString::fromStdString( keyword ) ) + .arg( QString::fromStdString( roff::Token::kindToString( kind ) ) ) + .arg( keywordLength ) ); + } + if ( eclipseCaseData->mainGrid()->cellCount() == keywordLength ) + { + QString newResultName = eclipseCaseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL ) + ->makeResultNameUnique( QString::fromStdString( keyword ) ); + // Special handling for active.data ==> ACTNUM + if ( newResultName == "active.data" ) + { + newResultName = "ACTNUM"; + } + + if ( !appendNewInputPropertyResult( eclipseCaseData, newResultName, keyword, kind, reader ) ) + { + RiaLogging::error( QString( "Unable to import result '%1' from %2" ) + .arg( QString::fromStdString( keyword ) ) + .arg( fileName ) ); + return std::make_pair( false, keywordMapping ); + } + + keywordMapping[QString::fromStdString( keyword )] = newResultName; + } + } + } + catch ( std::runtime_error& err ) + { + RiaLogging::error( QString( "Roff property file import failed: %1" ).arg( err.what() ) ); + return std::make_pair( false, keywordMapping ); + } + + return std::make_pair( true, keywordMapping ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RifRoffFileTools::readAndConvertToDouble( int nx, + int ny, + int nz, + const std::string& keyword, + roff::Token::Kind kind, + roff::Reader& reader ) +{ + std::vector doubleVals; + + if ( kind == roff::Token::Kind::FLOAT ) + { + std::vector values = reader.getFloatArray( keyword ); + convertToReservoirIndexOrder( nx, ny, nz, values, doubleVals ); + } + else if ( kind == roff::Token::Kind::BOOL ) + { + std::vector values = reader.getByteArray( keyword ); + convertToReservoirIndexOrder( nx, ny, nz, values, doubleVals ); + } + else if ( kind == roff::Token::Kind::INT ) + { + std::vector values = reader.getIntArray( keyword ); + convertToReservoirIndexOrder( nx, ny, nz, values, doubleVals ); + } + else + { + RiaLogging::error( QString( "Unsupported property type '%1' for keyword '%2'." ) + .arg( QString::fromStdString( roff::Token::kindToString( kind ) ) ) + .arg( QString::fromStdString( keyword ) ) ); + } + + return doubleVals; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifRoffFileTools::appendNewInputPropertyResult( RigEclipseCaseData* caseData, + const QString& resultName, + const std::string& keyword, + roff::Token::Kind kind, + roff::Reader& reader ) +{ + CVF_ASSERT( caseData ); + + int nx = static_cast( caseData->mainGrid()->cellCountI() ); + int ny = static_cast( caseData->mainGrid()->cellCountJ() ); + int nz = static_cast( caseData->mainGrid()->cellCountK() ); + std::vector values = readAndConvertToDouble( nx, ny, nz, keyword, kind, reader ); + + auto mainGrid = caseData->mainGrid(); + if ( values.size() != mainGrid->cellCount() ) return false; + + // Set better invalid value for inactive cells: roff file has -999 + auto activeCellInfo = caseData->activeCellInfo( RiaDefines::PorosityModelType::MATRIX_MODEL ); + size_t cellCount = mainGrid->cellCount(); + for ( size_t i = 0; i < cellCount; i++ ) + { + if ( !activeCellInfo->isActive( mainGrid->reservoirCellIndex( i ) ) ) + { + values[i] = HUGE_VAL; + } + } + + RigEclipseResultAddress resAddr( RiaDefines::ResultCatType::INPUT_PROPERTY, resultName ); + caseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL )->createResultEntry( resAddr, false ); + + auto newPropertyData = + caseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL )->modifiableCellScalarResultTimesteps( resAddr ); + + newPropertyData->push_back( values ); + + return true; +} diff --git a/ApplicationLibCode/FileInterface/RifRoffFileTools.h b/ApplicationLibCode/FileInterface/RifRoffFileTools.h new file mode 100644 index 0000000000..066abdbf36 --- /dev/null +++ b/ApplicationLibCode/FileInterface/RifRoffFileTools.h @@ -0,0 +1,107 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022- Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cvfObject.h" +#include "cvfVector3.h" + +#include "cafAssert.h" + +#include + +#include +#include + +#include "Token.hpp" + +class RigEclipseCaseData; +class RigMainGrid; + +namespace roff +{ +class Reader; +} + +//================================================================================================== +// +// Class for access to Roff grids. +// +//================================================================================================== +class RifRoffFileTools : public cvf::Object +{ +public: + RifRoffFileTools(); + ~RifRoffFileTools() override; + + static bool openGridFile( const QString& fileName, RigEclipseCaseData* eclipseCase, QString* errorMessages ); + + static std::pair> createInputProperties( const QString& fileName, + RigEclipseCaseData* eclipseCase ); + +private: + static void interpretSplitenzData( int nz, + float zoffset, + float zscale, + const std::vector& splitenz, + const std::vector& zdata, + std::vector& zcornsv ); + + static size_t computeActiveCellMatrixIndex( std::vector& activeCells ); + + static cvf::Vec3d getCorner( const RigMainGrid& grid, + const std::vector& cornerLines, + const std::vector& zcorn, + size_t cellIdx, + int cornerIdx, + const cvf::Vec3d& offset, + const cvf::Vec3d& scale ); + + static double interpolate( const cvf::Vec3d& top, const cvf::Vec3d& bottom, double z, int idx ); + + static std::vector + readAndConvertToDouble( int nx, int ny, int nz, const std::string& keyword, roff::Token::Kind kind, roff::Reader& reader ); + + static bool appendNewInputPropertyResult( RigEclipseCaseData* caseData, + const QString& resultName, + const std::string& keyword, + roff::Token::Kind token, + roff::Reader& reader ); + + template + static void convertToReservoirIndexOrder( int nx, int ny, int nz, const std::vector& in, std::vector& out ) + { + CAF_ASSERT( static_cast( nx ) * ny * nz == in.size() ); + + out.resize( in.size(), -1 ); + + int outIdx = 0; + for ( int k = 0; k < nz; k++ ) + { + for ( int j = 0; j < ny; j++ ) + { + for ( int i = 0; i < nx; i++ ) + { + int inIdx = i * ny * nz + j * nz + ( nz - k - 1 ); + out[outIdx] = static_cast( in[inIdx] ); + outIdx++; + } + } + } + } +}; diff --git a/ApplicationLibCode/FileInterface/RifThermalFractureReader.cpp b/ApplicationLibCode/FileInterface/RifThermalFractureReader.cpp index 46a0f60f4b..1299fccacb 100644 --- a/ApplicationLibCode/FileInterface/RifThermalFractureReader.cpp +++ b/ApplicationLibCode/FileInterface/RifThermalFractureReader.cpp @@ -19,7 +19,9 @@ #include "RifThermalFractureReader.h" #include "RiaDefines.h" +#include "RiaFractureDefines.h" #include "RiaTextStringTools.h" +#include "RiaThermalFractureDefines.h" #include "RigThermalFractureDefinition.h" @@ -48,24 +50,37 @@ std::pair, QString> QString separator = ","; - auto appendPropertyValues = [definition]( int nodeIndex, int valueOffset, const QStringList& values ) { - CAF_ASSERT( valueOffset <= values.size() ); - for ( int i = valueOffset; i < values.size() - 1; i++ ) - { - double value = values[i].toDouble(); - int propertyIndex = i - valueOffset; - definition->appendPropertyValue( propertyIndex, nodeIndex, value ); - } - }; + auto appendPropertyValues = + [definition]( int nodeIndex, int valueOffset, const QStringList& values, double conductivityFactor ) { + CAF_ASSERT( valueOffset <= values.size() ); + for ( int i = valueOffset; i < values.size(); i++ ) + { + bool isOk = false; + double value = values[i].toDouble( &isOk ); + if ( isOk ) + { + int propertyIndex = i - valueOffset; + + // Convert conductivity from Darcy to milliDarcy + if ( definition->getPropertyIndex( "Conductivity" ) == propertyIndex ) + { + value *= conductivityFactor; + } + + definition->appendPropertyValue( propertyIndex, nodeIndex, value ); + } + } + }; QTextStream in( &file ); int lineNumber = 1; // The two items in the csv is name and timestep - const int valueOffset = 2; - int nodeIndex = 0; - bool isFirstHeader = true; - bool isValidNode = false; + const int valueOffset = 2; + int nodeIndex = 0; + bool isFirstHeader = true; + bool isValidNode = false; + double conductivityFactor = 1.0; while ( !in.atEnd() ) { QString line = in.readLine(); @@ -80,10 +95,26 @@ std::pair, QString> if ( isFirstHeader ) { // Create the result vector when encountering the first header - for ( int i = valueOffset; i < headerValues.size() - 1; i++ ) + for ( int i = valueOffset; i < headerValues.size(); i++ ) { auto [name, unit] = parseNameAndUnit( headerValues[i] ); - if ( !name.isEmpty() && !unit.isEmpty() ) definition->addProperty( name, unit ); + if ( !name.isEmpty() && !unit.isEmpty() ) + { + // Special handling for Conductivity: change unit from Darcy to Milli + if ( name.contains( RiaDefines::conductivityResultName(), Qt::CaseInsensitive ) ) + { + // Check if the conductivity unit needs conversion to milliDarcy + if ( !unit.contains( "mD" ) ) + { + conductivityFactor = 1.0e3; + } + + // Use the preferred internal unit for conductivity + unit = RiaDefines::unitStringConductivity( detectUnitSystem( definition ) ); + } + + definition->addProperty( name, unit ); + } } // Detect unit system @@ -119,13 +150,13 @@ std::pair, QString> definition->addTimeStep( dateTime.toSecsSinceEpoch() ); // - appendPropertyValues( nodeIndex, valueOffset, values ); + appendPropertyValues( nodeIndex, valueOffset, values, conductivityFactor ); isValidNode = true; } else if ( isInternalNodeLine( line ) || isPerimeterNodeLine( line ) ) { auto values = RifFileParseTools::splitLineAndTrim( line, separator ); - appendPropertyValues( nodeIndex, valueOffset, values ); + appendPropertyValues( nodeIndex, valueOffset, values, conductivityFactor ); isValidNode = true; } else @@ -146,6 +177,7 @@ QDateTime RifThermalFractureReader::parseDateTime( const QString& dateString ) { QString dateFormat = "dd.MM.yyyy hh:mm:ss"; QDateTime dateTime = QDateTime::fromString( dateString, dateFormat ); + // Sometimes the datetime field is missing time if ( !dateTime.isValid() ) { @@ -209,10 +241,8 @@ std::pair RifThermalFractureReader::parseNameAndUnit( const QS QString unit = match.captured( 2 ); return std::make_pair( name, unit ); } - else - { - return std::make_pair( "", "" ); - } + + return std::make_pair( "", "" ); } //-------------------------------------------------------------------------------------------------- @@ -231,9 +261,10 @@ RiaDefines::EclipseUnitSystem if ( res != namesAndUnits.end() ) { QString unit = res->second; - if ( unit == getExpectedUnit( targetName, RiaDefines::EclipseUnitSystem::UNITS_METRIC ) ) + if ( unit == RiaDefines::getExpectedThermalFractureUnit( targetName, RiaDefines::EclipseUnitSystem::UNITS_METRIC ) ) return RiaDefines::EclipseUnitSystem::UNITS_METRIC; - else if ( unit == getExpectedUnit( targetName, RiaDefines::EclipseUnitSystem::UNITS_FIELD ) ) + + if ( unit == RiaDefines::getExpectedThermalFractureUnit( targetName, RiaDefines::EclipseUnitSystem::UNITS_FIELD ) ) return RiaDefines::EclipseUnitSystem::UNITS_FIELD; } @@ -249,51 +280,9 @@ bool RifThermalFractureReader::checkUnits( std::shared_ptrgetPropertyNamesUnits(); for ( auto [name, unit] : namesAndUnits ) { - auto expectedUnit = getExpectedUnit( name, unitSystem ); + auto expectedUnit = RiaDefines::getExpectedThermalFractureUnit( name, unitSystem ); if ( expectedUnit != unit ) return false; } return true; } - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RifThermalFractureReader::getExpectedUnit( const QString& name, RiaDefines::EclipseUnitSystem unitSystem ) -{ - CAF_ASSERT( unitSystem == RiaDefines::EclipseUnitSystem::UNITS_METRIC || - unitSystem == RiaDefines::EclipseUnitSystem::UNITS_FIELD ); - - // parameter name --> { metric unit, field unit } - std::map> mapping = { { "XCoord", { "m", "feet" } }, - { "YCoord", { "m", "feet" } }, - { "ZCoord", { "m", "feet" } }, - { "Width", { "cm", "inches" } }, - { "Pressure", { "BARa", "psia" } }, - { "Temperature", { "deg C", "deg F" } }, - { "Stress", { "BARa", "psia" } }, - { "Density", { "Kg/m3", "lb/ft3" } }, - { "Viscosity", { "mPa.s", "centipoise" } }, - { "LeakoffMobility", { "m/day/bar", "ft/day/psi" } }, - { "Conductivity", { "D.m", "D.ft" } }, - { "Velocity", { "m/sec", "ft/sec" } }, - { "ResPressure", { "BARa", "psia" } }, - { "ResTemperature", { "deg C", "deg F" } }, - { "FiltrateThickness", { "cm", "inches" } }, - { "FiltratePressureDrop", { "bar", "psi" } }, - { "EffectiveResStress", { "bar", "psi" } }, - { "EffectiveFracStress", { "bar", "psi" } }, - { "LeakoffPressureDrop", { "bar", "psi" } } }; - - auto res = std::find_if( mapping.begin(), mapping.end(), [&]( const auto& val ) { return val.first == name; } ); - - if ( res != mapping.end() ) - { - if ( unitSystem == RiaDefines::EclipseUnitSystem::UNITS_METRIC ) - return res->second.first; - else - return res->second.second; - } - - return ""; -} diff --git a/ApplicationLibCode/FileInterface/RifThermalFractureTemplateSurfaceExporter.cpp b/ApplicationLibCode/FileInterface/RifThermalFractureTemplateSurfaceExporter.cpp new file mode 100644 index 0000000000..654de8ae59 --- /dev/null +++ b/ApplicationLibCode/FileInterface/RifThermalFractureTemplateSurfaceExporter.cpp @@ -0,0 +1,75 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022- Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RifThermalFractureTemplateSurfaceExporter.h" + +#include "RigThermalFractureDefinition.h" +#include "RimThermalFractureTemplate.h" + +#include +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifThermalFractureTemplateSurfaceExporter::writeToFile( gsl::not_null thermalFractureTemplate, + int timeStepIndex, + const QString& filePath ) +{ + auto fractureData = thermalFractureTemplate->fractureDefinition(); + CAF_ASSERT( fractureData ); + + auto numNodes = fractureData->numNodes(); + auto numTimeSteps = fractureData->numTimeSteps(); + auto properties = fractureData->getPropertyNamesUnits(); + + if ( timeStepIndex < 0 || timeStepIndex >= static_cast( numTimeSteps ) ) return false; + + QFile file( filePath ); + if ( file.open( QIODevice::WriteOnly | QIODevice::Text ) ) + { + QTextStream out( &file ); + + out.setRealNumberPrecision( 16 ); + + auto nameAndUnits = fractureData->getPropertyNamesUnits(); + int numProperties = static_cast( nameAndUnits.size() ); + + for ( auto [name, unit] : nameAndUnits ) + { + out << name << " "; + } + + out << "\n"; + + for ( int nodeIndex = 0; nodeIndex < static_cast( numNodes ); nodeIndex++ ) + { + for ( int propertyIndex = 0; propertyIndex < numProperties; propertyIndex++ ) + { + double value = fractureData->getPropertyValue( propertyIndex, nodeIndex, timeStepIndex ); + out << value; + if ( propertyIndex < numProperties - 1 ) out << " "; + } + + out << "\n"; + } + } + file.close(); + + return true; +} diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessment3dFeature.h b/ApplicationLibCode/FileInterface/RifThermalFractureTemplateSurfaceExporter.h similarity index 68% rename from ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessment3dFeature.h rename to ApplicationLibCode/FileInterface/RifThermalFractureTemplateSurfaceExporter.h index 3fe062ec99..6dbccfa714 100644 --- a/ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessment3dFeature.h +++ b/ApplicationLibCode/FileInterface/RifThermalFractureTemplateSurfaceExporter.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////////// // -// Copyright (C) 2021 Equinor ASA +// Copyright (C) 2022- Equinor ASA // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -18,19 +18,18 @@ #pragma once -#include "RicRunFaultReactAssessmentFeature.h" +#include + +class RimThermalFractureTemplate; +class QString; //================================================================================================== -/// +// //================================================================================================== -class RicRunBasicFaultReactAssessment3dFeature : public RicRunFaultReactAssessmentFeature +class RifThermalFractureTemplateSurfaceExporter { - CAF_CMD_HEADER_INIT; - -protected: - RimFaultInViewCollection* faultCollection() override; - - bool isCommandEnabled() override; - void onActionTriggered( bool isChecked ) override; - void setupActionLook( QAction* actionToSetup ) override; +public: + static bool writeToFile( gsl::not_null thermalFractureTemplate, + int timeStep, + const QString& filePath ); }; diff --git a/ApplicationLibCode/FileInterface/RifWellPathImporter.cpp b/ApplicationLibCode/FileInterface/RifWellPathImporter.cpp index 6dc70e30b5..ba6c124891 100644 --- a/ApplicationLibCode/FileInterface/RifWellPathImporter.cpp +++ b/ApplicationLibCode/FileInterface/RifWellPathImporter.cpp @@ -22,14 +22,13 @@ #include "RifJsonEncodeDecode.h" -#include - #include "cafUtils.h" #include #include #include +#include #define ASCII_FILE_DEFAULT_START_INDEX 0 @@ -109,7 +108,6 @@ size_t RifWellPathImporter::wellDataCount( const QString& filePath ) CVF_ASSERT( it != m_fileNameToWellDataGroupMap.end() ); return it->second.size(); - ; } } @@ -119,15 +117,7 @@ size_t RifWellPathImporter::wellDataCount( const QString& filePath ) bool RifWellPathImporter::isJsonFile( const QString& filePath ) { QFileInfo fileInfo( filePath ); - - if ( fileInfo.suffix().compare( "json" ) == 0 ) - { - return true; - } - else - { - return false; - } + return ( fileInfo.suffix().compare( "json" ) == 0 ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/FileInterface/RifWellPathImporter.h b/ApplicationLibCode/FileInterface/RifWellPathImporter.h index aeaa43094d..9ecba0f384 100644 --- a/ApplicationLibCode/FileInterface/RifWellPathImporter.h +++ b/ApplicationLibCode/FileInterface/RifWellPathImporter.h @@ -53,23 +53,25 @@ class RifWellPathImporter QDateTime m_updateDate; }; - WellData readWellData( const QString& filePath, size_t indexInFile ); - WellData readWellData( const QString& filePath ); - WellMetaData readWellMetaData( const QString& filePath, size_t indexInFile ); - WellMetaData readWellMetaData( const QString& filePath ); - size_t wellDataCount( const QString& filePath ); + WellData readWellData( const QString& filePath, size_t indexInFile ); + WellData readWellData( const QString& filePath ); + size_t wellDataCount( const QString& filePath ); void clear(); void removeFilePath( const QString& filePath ); + static WellMetaData readWellMetaData( const QString& filePath, size_t indexInFile ); + static WellMetaData readWellMetaData( const QString& filePath ); + private: - WellData readJsonWellData( const QString& filePath ); - WellMetaData readJsonWellMetaData( const QString& filePath ); - WellData readAsciiWellData( const QString& filePath, size_t indexInFile ); - WellMetaData readAsciiWellMetaData( const QString& filePath, size_t indexInFile ); - void readAllAsciiWellData( const QString& filePath ); + WellData readAsciiWellData( const QString& filePath, size_t indexInFile ); + void readAllAsciiWellData( const QString& filePath ); - inline bool isJsonFile( const QString& filePath ); + static WellData readJsonWellData( const QString& filePath ); + static WellMetaData readJsonWellMetaData( const QString& filePath ); + static WellMetaData readAsciiWellMetaData( const QString& filePath, size_t indexInFile ); + static bool isJsonFile( const QString& filePath ); +private: std::map> m_fileNameToWellDataGroupMap; }; diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/CMakeLists.txt b/ApplicationLibCode/GeoMech/GeoMechDataModel/CMakeLists.txt index 4619c4a8d7..db22d5201a 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/CMakeLists.txt +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/CMakeLists.txt @@ -102,6 +102,8 @@ add_library( RigFemPartResultCalculatorMudWeightWindow.cpp RigFemPartResultCalculatorShearSlipIndicator.h RigFemPartResultCalculatorShearSlipIndicator.cpp + RigFemPartResultCalculatorKIndices.h + RigFemPartResultCalculatorKIndices.cpp RimGeoMechGeometrySelectionItem.h RimGeoMechGeometrySelectionItem.cpp ) diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorKIndices.cpp b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorKIndices.cpp new file mode 100644 index 0000000000..25c00127f9 --- /dev/null +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorKIndices.cpp @@ -0,0 +1,109 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022- Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RigFemPartResultCalculatorKIndices.h" + +#include "RigFemPart.h" +#include "RigFemPartCollection.h" +#include "RigFemPartGrid.h" +#include "RigFemPartResultsCollection.h" +#include "RigFemResultAddress.h" +#include "RigFemScalarResultFrames.h" +#include "RigFormationNames.h" + +#include "cafProgressInfo.h" + +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RigFemPartResultCalculatorKIndices::RigFemPartResultCalculatorKIndices( RigFemPartResultsCollection& collection ) + : RigFemPartResultCalculator( collection ) +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RigFemPartResultCalculatorKIndices::~RigFemPartResultCalculatorKIndices() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RigFemPartResultCalculatorKIndices::isMatching( const RigFemResultAddress& resVarAddr ) const +{ + return ( resVarAddr.fieldName == "INDEX" && resVarAddr.componentName == "INDEX_K" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RigFemScalarResultFrames* RigFemPartResultCalculatorKIndices::calculate( int partIndex, + const RigFemResultAddress& resVarAddr ) +{ + caf::ProgressInfo frameCountProgress( 2, "" ); + frameCountProgress.setProgressDescription( + "Calculating " + QString::fromStdString( resVarAddr.fieldName + ": " + resVarAddr.componentName ) ); + + RigFemScalarResultFrames* resFrames = m_resultCollection->createScalarResult( partIndex, resVarAddr ); + resFrames->enableAsSingleFrameResult(); + + const RigFemPart* femPart = m_resultCollection->parts()->part( partIndex ); + std::vector& dstFrameData = resFrames->frameData( 0 ); + + const size_t valCount = femPart->elementNodeResultCount(); + dstFrameData.resize( valCount, std::numeric_limits::infinity() ); + + const RigFormationNames* activeFormNames = m_resultCollection->activeFormationNames(); + + frameCountProgress.incrementProgress(); + + if ( activeFormNames ) + { + // Has to be done before the parallel loop because the first call allocates. + const RigFemPartGrid* structGrid = femPart->getOrCreateStructGrid(); + + const int elementCount = femPart->elementCount(); + + // Using max() as std::numeric_limits::infinity() returns 0 + constexpr size_t maxValue = std::numeric_limits::max(); + +#pragma omp parallel for + for ( int elmIdx = 0; elmIdx < elementCount; ++elmIdx ) + { + RigElementType elmType = femPart->elementType( elmIdx ); + int elmNodeCount = RigFemTypes::elementNodeCount( elmType ); + + size_t i, j, k = maxValue; + bool validIndex = structGrid->ijkFromCellIndex( elmIdx, &i, &j, &k ); + if ( validIndex ) + { + for ( int elmNodIdx = 0; elmNodIdx < elmNodeCount; ++elmNodIdx ) + { + size_t elmNodResIdx = femPart->elementNodeResultIdx( elmIdx, elmNodIdx ); + dstFrameData[elmNodResIdx] = k != maxValue ? static_cast( k ) : HUGE_VALF; + } + } + } + } + + return resFrames; +} diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorKIndices.h b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorKIndices.h new file mode 100644 index 0000000000..a73397d97f --- /dev/null +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorKIndices.h @@ -0,0 +1,37 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022- Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RigFemPartResultCalculator.h" + +class RigFemPartResultsCollection; +class RigFemScalarResultFrames; +class RigFemResultAddress; + +//================================================================================================== +/// +//================================================================================================== +class RigFemPartResultCalculatorKIndices : public RigFemPartResultCalculator +{ +public: + explicit RigFemPartResultCalculatorKIndices( RigFemPartResultsCollection& collection ); + ~RigFemPartResultCalculatorKIndices() override; + bool isMatching( const RigFemResultAddress& resVarAddr ) const override; + RigFemScalarResultFrames* calculate( int partIndex, const RigFemResultAddress& resVarAddr ) override; +}; diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.cpp b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.cpp index 2a155229ef..4bfc28c6ca 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.cpp +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.cpp @@ -37,6 +37,7 @@ #include "RigFemPartResultCalculatorFormationIndices.h" #include "RigFemPartResultCalculatorGamma.h" #include "RigFemPartResultCalculatorInitialPorosity.h" +#include "RigFemPartResultCalculatorKIndices.h" #include "RigFemPartResultCalculatorMudWeightWindow.h" #include "RigFemPartResultCalculatorNE.h" #include "RigFemPartResultCalculatorNodalGradients.h" @@ -199,6 +200,8 @@ RigFemPartResultsCollection::RigFemPartResultsCollection( RifGeoMechReaderInterf std::unique_ptr( new RigFemPartResultCalculatorShearSlipIndicator( *this ) ) ); m_resultCalculators.push_back( std::unique_ptr( new RigFemPartResultCalculatorFormationIndices( *this ) ) ); + m_resultCalculators.push_back( + std::unique_ptr( new RigFemPartResultCalculatorKIndices( *this ) ) ); } //-------------------------------------------------------------------------------------------------- @@ -684,6 +687,8 @@ std::map> fieldCompNames["PE"].push_back( "PE2" ); fieldCompNames["PE"].push_back( "PE3" ); } + + fieldCompNames["INDEX"].push_back( "INDEX_K" ); } else if ( resPos == RIG_INTEGRATION_POINT ) { diff --git a/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemElmVisibilityCalculator.cpp b/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemElmVisibilityCalculator.cpp index 13ad859b75..691413e3f5 100644 --- a/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemElmVisibilityCalculator.cpp +++ b/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemElmVisibilityCalculator.cpp @@ -257,7 +257,9 @@ void RivFemElmVisibilityCalculator::computeOverriddenCellVisibility( cvf::UByteA CVF_ASSERT( elmVisibilities != nullptr ); CVF_ASSERT( femPart != nullptr ); - RimGridView* masterView = masterViewLink->ownerViewLinker()->masterView(); + RimGridView* masterView = dynamic_cast( masterViewLink->ownerViewLinker()->masterView() ); + if ( !masterView ) return; + cvf::ref totCellVisibility = masterView->currentTotalCellVisibility(); int elmCount = femPart->elementCount(); diff --git a/ApplicationLibCode/GeoMech/OdbReader/RifOdbReader.cpp b/ApplicationLibCode/GeoMech/OdbReader/RifOdbReader.cpp index 11d325f85c..8e37883ba1 100644 --- a/ApplicationLibCode/GeoMech/OdbReader/RifOdbReader.cpp +++ b/ApplicationLibCode/GeoMech/OdbReader/RifOdbReader.cpp @@ -107,7 +107,7 @@ std::map initFemTypeMap() typeMap["CAX4"] = CAX4; typeMap["C3D20RT"] = HEX8; typeMap["C3D8RT"] = HEX8; - typeMap["C3D8R"] = HEX8; + typeMap["C3D8T"] = HEX8; return typeMap; } diff --git a/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp b/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp index 33fa5efd27..9897c4fced 100644 --- a/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp @@ -479,6 +479,9 @@ std::vector> { for ( const cvf::BoundingBox& existingBBox : boxVector ) { + // Assert on invalid bounding box seen on Linux + if ( !displayBBox.isValid() || !existingBBox.isValid() ) continue; + double dist = ( displayBBox.center() - existingBBox.center() ).length(); if ( dist < segment.length() || existingBBox.intersects( displayBBox ) ) { diff --git a/ApplicationLibCode/ModelVisualization/RivFaultGeometryGenerator.cpp b/ApplicationLibCode/ModelVisualization/RivFaultGeometryGenerator.cpp index ef31cab7d4..e07a351379 100644 --- a/ApplicationLibCode/ModelVisualization/RivFaultGeometryGenerator.cpp +++ b/ApplicationLibCode/ModelVisualization/RivFaultGeometryGenerator.cpp @@ -19,7 +19,11 @@ #include "RivFaultGeometryGenerator.h" -#include +#include "RiaOpenMPTools.h" + +#include "RigFault.h" +#include "RigNNCData.h" +#include "RigNncConnection.h" #include "cvfDrawableGeo.h" #include "cvfOutlineEdgeExtractor.h" @@ -28,9 +32,7 @@ #include "cvfScalarMapper.h" -#include "RigFault.h" -#include "RigNNCData.h" -#include "RigNncConnection.h" +#include //-------------------------------------------------------------------------------------------------- /// @@ -166,46 +168,66 @@ void RivFaultGeometryGenerator::computeArrays( bool onlyShowFacesWithDefinedNeig const std::vector& faultFaces = m_fault->faultFaces(); -#pragma omp parallel for - for ( int fIdx = 0; fIdx < static_cast( faultFaces.size() ); fIdx++ ) + int numberOfThreads = RiaOpenMPTools::availableThreadCount(); + + std::vector> threadVertices( numberOfThreads ); + std::vector> threadCellIndices( numberOfThreads ); + std::vector> threadFaceTypes( numberOfThreads ); + +#pragma omp parallel { - size_t cellIndex = faultFaces[fIdx].m_nativeReservoirCellIndex; - cvf::StructGridInterface::FaceType face = faultFaces[fIdx].m_nativeFace; + int myThread = RiaOpenMPTools::currentThreadIndex(); - if ( !m_computeNativeFaultFaces ) + cvf::Vec3d cornerVerts[8]; + cvf::ubyte faceConn[4]; + + // NB! We are inside a parallel section, do not use "parallel for" here +#pragma omp for + for ( int fIdx = 0; fIdx < static_cast( faultFaces.size() ); fIdx++ ) { - cellIndex = faultFaces[fIdx].m_oppositeReservoirCellIndex; - face = cvf::StructGridInterface::oppositeFace( face ); - } + size_t cellIndex = faultFaces[fIdx].m_nativeReservoirCellIndex; + cvf::StructGridInterface::FaceType face = faultFaces[fIdx].m_nativeFace; - if ( cellIndex >= m_cellVisibility->size() ) continue; + if ( !m_computeNativeFaultFaces ) + { + cellIndex = faultFaces[fIdx].m_oppositeReservoirCellIndex; + face = cvf::StructGridInterface::oppositeFace( face ); + } - if ( !( *m_cellVisibility )[cellIndex] ) continue; + if ( cellIndex >= m_cellVisibility->size() ) continue; - if ( onlyShowFacesWithDefinedNeighbors && !hasConnection( cellIndex, face, connections, connIndices ) ) - continue; + if ( !( *m_cellVisibility )[cellIndex] ) continue; - cvf::Vec3d cornerVerts[8]; - m_grid->cellCornerVertices( cellIndex, cornerVerts ); + if ( onlyShowFacesWithDefinedNeighbors && !hasConnection( cellIndex, face, connections, connIndices ) ) + continue; - cvf::ubyte faceConn[4]; - m_grid->cellFaceVertexIndices( face, faceConn ); + m_grid->cellCornerVertices( cellIndex, cornerVerts ); + m_grid->cellFaceVertexIndices( face, faceConn ); -// Critical section to avoid two threads accessing the arrays at the same time. -#pragma omp critical( critical_section_RivFaultGeometryGenerator_computeArrays ) - { - int n; - for ( n = 0; n < 4; n++ ) + for ( int n = 0; n < 4; n++ ) { - vertices.push_back( cvf::Vec3f( cornerVerts[faceConn[n]] - offset ) ); + threadVertices[myThread].emplace_back( cvf::Vec3f( cornerVerts[faceConn[n]] - offset ) ); } // Keep track of the source cell index per quad - m_quadMapper->quadToCellIndexMap().push_back( cellIndex ); - m_quadMapper->quadToCellFaceMap().push_back( face ); + threadCellIndices[myThread].emplace_back( cellIndex ); + threadFaceTypes[myThread].emplace_back( face ); } } + for ( int threadIndex = 0; threadIndex < numberOfThreads; threadIndex++ ) + { + vertices.insert( vertices.end(), threadVertices[threadIndex].begin(), threadVertices[threadIndex].end() ); + + m_quadMapper->quadToCellIndexMap().insert( m_quadMapper->quadToCellIndexMap().end(), + threadCellIndices[threadIndex].begin(), + threadCellIndices[threadIndex].end() ); + + m_quadMapper->quadToCellFaceMap().insert( m_quadMapper->quadToCellFaceMap().end(), + threadFaceTypes[threadIndex].begin(), + threadFaceTypes[threadIndex].end() ); + } + m_vertices = new cvf::Vec3fArray; m_vertices->assign( vertices ); } diff --git a/ApplicationLibCode/ModelVisualization/RivReservoirViewPartMgr.cpp b/ApplicationLibCode/ModelVisualization/RivReservoirViewPartMgr.cpp index 0c17667f84..cfc91d1164 100644 --- a/ApplicationLibCode/ModelVisualization/RivReservoirViewPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/RivReservoirViewPartMgr.cpp @@ -663,7 +663,8 @@ void RivReservoirViewPartMgr::computeOverriddenCellVisibility( cvf::UByteArray* CVF_ASSERT( masterViewLink ); - RimGridView* masterView = masterViewLink->ownerViewLinker()->masterView(); + RimGridView* masterView = dynamic_cast( masterViewLink->ownerViewLinker()->masterView() ); + if ( !masterView ) return; // get cell visibility #if 1 @@ -852,6 +853,8 @@ void RivReservoirViewPartMgr::computePropertyVisibility( cvf::UByteArray* if ( propertyFilter->isActive() && propertyFilter->resultDefinition()->hasResult() ) { + propertyFilter->resultDefinition()->loadResult(); + const RimCellFilter::FilterModeType filterType = propertyFilter->filterMode(); RigEclipseCaseData* eclipseCase = propFilterColl->reservoirView()->eclipseCase()->eclipseCaseData(); diff --git a/ApplicationLibCode/ModelVisualization/RivWellConnectionFactorGeometryGenerator.cpp b/ApplicationLibCode/ModelVisualization/RivWellConnectionFactorGeometryGenerator.cpp index f9836b8796..6b565253ac 100644 --- a/ApplicationLibCode/ModelVisualization/RivWellConnectionFactorGeometryGenerator.cpp +++ b/ApplicationLibCode/ModelVisualization/RivWellConnectionFactorGeometryGenerator.cpp @@ -21,6 +21,7 @@ #include "cafEffectGenerator.h" #include "cvfArray.h" #include "cvfDrawableGeo.h" +#include "cvfGeometryTools.h" #include "cvfPart.h" #include "cvfPrimitiveSetIndexedUInt.h" #include "cvfScalarMapper.h" @@ -122,7 +123,8 @@ cvf::ref RivWellConnectionFactorGeometryGenerator::createSurfa for ( const auto& item : m_completionVizData ) { - auto rotMatrix = rotationMatrixBetweenVectors( cvf::Vec3d::Y_AXIS, item.m_direction ); + auto rotMatrix = + cvf::Mat4f( cvf::GeometryTools::rotationMatrixBetweenVectors( cvf::Vec3d::Y_AXIS, item.m_direction ) ); cvf::uint indexOffset = static_cast( vertices->size() ); @@ -180,28 +182,6 @@ size_t RivWellConnectionFactorGeometryGenerator::mapFromTriangleToConnectionInde return connectionIndex; } -//-------------------------------------------------------------------------------------------------- -/// Taken from OverlayNavigationCube::computeNewUpVector -/// Consider move to geometry util class -//-------------------------------------------------------------------------------------------------- -cvf::Mat4f RivWellConnectionFactorGeometryGenerator::rotationMatrixBetweenVectors( const cvf::Vec3d& v1, - const cvf::Vec3d& v2 ) -{ - using namespace cvf; - - Vec3d rotAxis = v1 ^ v2; - rotAxis.normalize(); - - // Guard acos against out-of-domain input - const double dotProduct = Math::clamp( v1 * v2, -1.0, 1.0 ); - const double angle = Math::acos( dotProduct ); - Mat4d rotMat = Mat4d::fromRotation( rotAxis, angle ); - - Mat4f myMat( rotMat ); - - return myMat; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ModelVisualization/RivWellConnectionFactorGeometryGenerator.h b/ApplicationLibCode/ModelVisualization/RivWellConnectionFactorGeometryGenerator.h index 4cf0ce0010..a0c4c3451f 100644 --- a/ApplicationLibCode/ModelVisualization/RivWellConnectionFactorGeometryGenerator.h +++ b/ApplicationLibCode/ModelVisualization/RivWellConnectionFactorGeometryGenerator.h @@ -68,11 +68,10 @@ class RivWellConnectionFactorGeometryGenerator : public cvf::Object size_t mapFromTriangleToConnectionIndex( cvf::uint triangleIndex ) const; cvf::ref createSurfaceGeometry(); - static cvf::Mat4f rotationMatrixBetweenVectors( const cvf::Vec3d& v1, const cvf::Vec3d& v2 ); - static void createStarGeometry( std::vector* vertices, - std::vector* indices, - float radius, - float thickness ); + static void createStarGeometry( std::vector* vertices, + std::vector* indices, + float radius, + float thickness ); static void createSimplifiedStarGeometry( std::vector* vertices, std::vector* indices, diff --git a/ApplicationLibCode/ModelVisualization/RivWellFracturePartMgr.cpp b/ApplicationLibCode/ModelVisualization/RivWellFracturePartMgr.cpp index d222405714..f966d40b09 100644 --- a/ApplicationLibCode/ModelVisualization/RivWellFracturePartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/RivWellFracturePartMgr.cpp @@ -463,7 +463,7 @@ cvf::ref RivWellFracturePartMgr::createStimPlanColorInterpolatedSurfa bool includeThisTrianglePair = false; for ( size_t j = 0; j < 6; j++ ) { - if ( perNodeResultValues[triangleIndices[i + j]] > 1e-7 ) + if ( stimPlanFracTemplate->isValidResult( perNodeResultValues[triangleIndices[i + j]] ) ) { includeThisTrianglePair = true; } @@ -578,7 +578,7 @@ cvf::ref RivWellFracturePartMgr::createStimPlanElementColorSurfacePar for ( size_t cIdx = 0; cIdx < stimPlanCells.size(); ++cIdx ) { - if ( prCellResults[cIdx] > 1e-7 ) + if ( stimPlanFracTemplate->isValidResult( prCellResults[cIdx] ) ) { const RigFractureCell& stimPlanCell = stimPlanCells[cIdx]; std::vector stimPlanCellPolygon = stimPlanCell.getPolygon(); @@ -1048,7 +1048,7 @@ void RivWellFracturePartMgr::createVisibleFracturePolygons( RimMeshFractureTempl m_visibleFracturePolygons.clear(); for ( size_t cIdx = 0; cIdx < stimPlanCells.size(); ++cIdx ) { - if ( prCellResults[cIdx] > 1e-7 ) + if ( stimPlanFracTemplate->isValidResult( prCellResults[cIdx] ) ) { const RigFractureCell& stimPlanCell = stimPlanCells[cIdx]; std::vector stimPlanCellPolygon = stimPlanCell.getPolygon(); @@ -1081,7 +1081,7 @@ cvf::ref RivWellFracturePartMgr::createStimPlanMeshDrawable( R for ( size_t cIdx = 0; cIdx < stimPlanCells.size(); ++cIdx ) { - if ( prCellResults[cIdx] > 1e-7 ) + if ( stimPlanFracTemplate->isValidResult( prCellResults[cIdx] ) ) { const RigFractureCell& stimPlanCell = stimPlanCells[cIdx]; std::vector stimPlanCellPolygon = stimPlanCell.getPolygon(); diff --git a/ApplicationLibCode/ModelVisualization/RivWellPathPartMgr.cpp b/ApplicationLibCode/ModelVisualization/RivWellPathPartMgr.cpp index 9361179d29..64088966d7 100644 --- a/ApplicationLibCode/ModelVisualization/RivWellPathPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/RivWellPathPartMgr.cpp @@ -889,6 +889,7 @@ void RivWellPathPartMgr::appendFlattenedStaticGeometryPartsToModel( cvf::ModelBa double characteristicCellSize, const cvf::BoundingBox& wellPathClipBoundingBox ) { + if ( !wellPathClipBoundingBox.isValid() ) return; if ( !isWellPathWithinBoundingBox( wellPathClipBoundingBox ) ) return; // The pipe geometry needs to be rebuilt on scale change to keep the pipes round diff --git a/ApplicationLibCode/ModelVisualization/Surfaces/RivSurfacePartMgr.cpp b/ApplicationLibCode/ModelVisualization/Surfaces/RivSurfacePartMgr.cpp index ffe5c3c56b..27b67a6fb5 100644 --- a/ApplicationLibCode/ModelVisualization/Surfaces/RivSurfacePartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/Surfaces/RivSurfacePartMgr.cpp @@ -380,8 +380,10 @@ void RivSurfacePartMgr::generateNativePartGeometry() m_usedSurfaceData = m_surfaceInView->surface()->surfaceData(); if ( m_usedSurfaceData.isNull() ) return; - const std::vector& vertices = m_usedSurfaceData->vertices(); - cvf::ref cvfVertices = new cvf::Vec3fArray( vertices.size() ); + const std::vector& vertices = m_usedSurfaceData->vertices(); + if ( vertices.empty() ) return; + + cvf::ref cvfVertices = new cvf::Vec3fArray( vertices.size() ); for ( size_t i = 0; i < vertices.size(); ++i ) { ( *cvfVertices )[i] = cvf::Vec3f( vertices[i] - displayModOffsett ); diff --git a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.h b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.h index e113fc0538..8ebc1f8135 100644 --- a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.h +++ b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.h @@ -20,7 +20,6 @@ #include "RimPlot.h" #include "RimPlotDataFilterItem.h" -#include "RimSummaryCaseCollection.h" #include "RimTimeStepFilter.h" #include "RigEnsembleParameter.h" @@ -38,6 +37,7 @@ class RimPlotAxisPropertiesInterface; class RimPlotAxisProperties; class RimPlotDataFilterCollection; class RiaSummaryCurveDefinition; +class RimSummaryCase; //================================================================================================== /// diff --git a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlotCollection.cpp b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlotCollection.cpp index d65e226c06..54b5b221f7 100644 --- a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlotCollection.cpp @@ -24,6 +24,7 @@ #include "RimPlotDataFilterCollection.h" #include "RimProject.h" #include "RimSummaryCase.h" +#include "RimSummaryCaseCollection.h" CAF_PDM_SOURCE_INIT( RimAnalysisPlotCollection, "AnalysisPlotCollection" ); diff --git a/ApplicationLibCode/ProjectDataModel/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/CMakeLists_files.cmake index 38e5957e57..2afec0e835 100644 --- a/ApplicationLibCode/ProjectDataModel/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/CMakeLists_files.cmake @@ -126,7 +126,9 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RimSurfaceIntersectionCollection.h ${CMAKE_CURRENT_LIST_DIR}/RimEclipseResultAddress.h ${CMAKE_CURRENT_LIST_DIR}/RimEclipseResultAddressCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimRoffCase.h ${CMAKE_CURRENT_LIST_DIR}/RimEclipseCaseTools.h + ${CMAKE_CURRENT_LIST_DIR}/RimMultipleEclipseResults.h ) set(SOURCE_GROUP_SOURCE_FILES @@ -252,7 +254,9 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RimSurfaceIntersectionCollection.cpp ${CMAKE_CURRENT_LIST_DIR}/RimEclipseResultAddress.cpp ${CMAKE_CURRENT_LIST_DIR}/RimEclipseResultAddressCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimRoffCase.cpp ${CMAKE_CURRENT_LIST_DIR}/RimEclipseCaseTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimMultipleEclipseResults.cpp ) if(RESINSIGHT_USE_QT_CHARTS) diff --git a/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilter.cpp b/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilter.cpp index 172d9e1949..d4f9999339 100644 --- a/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilter.cpp +++ b/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilter.cpp @@ -40,6 +40,7 @@ #include "RiuMainWindow.h" #include "cafPdmUiDoubleSliderEditor.h" +#include "cafPdmUiTreeAttributes.h" #include "cvfAssert.h" @@ -76,6 +77,9 @@ RimEclipsePropertyFilter::RimEclipsePropertyFilter() CAF_PDM_InitField( &m_useCategorySelection, "CategorySelection", false, "Category Selection" ); m_upperBound.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() ); + CAF_PDM_InitField( &m_isDuplicatedFromLinkedView, "IsDuplicatedFromLinkedView", false, "Duplicated" ); + m_isDuplicatedFromLinkedView.uiCapability()->setUiHidden( true ); + // HEADLESS HACK if ( RiaGuiApplication::isRunning() ) { @@ -124,6 +128,14 @@ bool RimEclipsePropertyFilter::isCategorySelectionActive() const return false; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEclipsePropertyFilter::setIsDuplicatedFromLinkedView( bool isDuplicated ) +{ + m_isDuplicatedFromLinkedView = isDuplicated; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -131,23 +143,20 @@ void RimEclipsePropertyFilter::fieldChangedByUi( const caf::PdmFieldHandle* chan const QVariant& oldValue, const QVariant& newValue ) { - // clang-format off - if ( &m_lowerBound == changedField - || &m_upperBound == changedField - || &m_isActive == changedField - || &m_filterMode == changedField - || &m_selectedCategoryValues == changedField - || &m_useCategorySelection == changedField) + if ( &m_lowerBound == changedField || &m_upperBound == changedField || &m_isActive == changedField || + &m_filterMode == changedField || &m_selectedCategoryValues == changedField || + &m_useCategorySelection == changedField ) { + m_isDuplicatedFromLinkedView = false; + this->m_resultDefinition->loadResult(); this->computeResultValueRange(); updateFilterName(); this->updateIconState(); this->uiCapability()->updateConnectedEditors(); - parentContainer()->updateDisplayModelNotifyManagedViews(this); + parentContainer()->updateDisplayModelNotifyManagedViews( this ); } - // clang-format on } //-------------------------------------------------------------------------------------------------- @@ -341,6 +350,31 @@ void RimEclipsePropertyFilter::defineEditorAttribute( const caf::PdmFieldHandle* } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEclipsePropertyFilter::defineObjectEditorAttribute( QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) +{ + if ( !m_isDuplicatedFromLinkedView ) return; + + Rim3dView* rimView = nullptr; + firstAncestorOrThisOfTypeAsserted( rimView ); + + RimViewController* vc = rimView->viewController(); + if ( vc && vc->isPropertyFilterDuplicationActive() ) + { + auto* treeItemAttribute = dynamic_cast( attribute ); + if ( treeItemAttribute ) + { + treeItemAttribute->tags.clear(); + auto tag = caf::PdmUiTreeViewItemAttribute::Tag::create(); + tag->icon = caf::IconProvider( ":/chain.png" ); + + treeItemAttribute->tags.push_back( std::move( tag ) ); + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilter.h b/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilter.h index 874ea880d9..8a535ae728 100644 --- a/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilter.h +++ b/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilter.h @@ -44,6 +44,8 @@ class RimEclipsePropertyFilter : public RimPropertyFilter void rangeValues( double* lower, double* upper ) const; bool isCategorySelectionActive() const; + void setIsDuplicatedFromLinkedView( bool isControlled ); + void setToDefaultValues(); void updateFilterName(); void computeResultValueRange(); @@ -62,6 +64,9 @@ class RimEclipsePropertyFilter : public RimPropertyFilter QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override; +private: + void defineObjectEditorAttribute( QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override; + private: friend class RimEclipsePropertyFilterCollection; friend class RicEclipsePropertyFilterFeatureImpl; @@ -79,6 +84,7 @@ class RimEclipsePropertyFilter : public RimPropertyFilter caf::PdmField m_rangeLabelText; caf::PdmField m_lowerBound; caf::PdmField m_upperBound; + caf::PdmField m_isDuplicatedFromLinkedView; caf::PdmField m_useCategorySelection; diff --git a/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilterCollection.cpp b/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilterCollection.cpp index 857c378294..7eff5932f8 100644 --- a/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilterCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilterCollection.cpp @@ -38,8 +38,8 @@ RimEclipsePropertyFilterCollection::RimEclipsePropertyFilterCollection() { CAF_PDM_InitObject( "Property Filters", ":/CellFilter_Values.png" ); - CAF_PDM_InitFieldNoDefault( &propertyFilters, "PropertyFilters", "Property Filters" ); - propertyFilters.uiCapability()->setUiTreeHidden( true ); + CAF_PDM_InitFieldNoDefault( &m_propertyFilters, "PropertyFilters", "Property Filters" ); + m_propertyFilters.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- @@ -47,7 +47,7 @@ RimEclipsePropertyFilterCollection::RimEclipsePropertyFilterCollection() //-------------------------------------------------------------------------------------------------- RimEclipsePropertyFilterCollection::~RimEclipsePropertyFilterCollection() { - propertyFilters.deleteChildren(); + m_propertyFilters.deleteChildren(); } //-------------------------------------------------------------------------------------------------- @@ -61,12 +61,39 @@ RimEclipseView* RimEclipsePropertyFilterCollection::reservoirView() return eclipseView; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEclipsePropertyFilterCollection::setIsDuplicatedFromLinkedView() +{ + for ( RimEclipsePropertyFilter* propertyFilter : m_propertyFilters ) + { + propertyFilter->setIsDuplicatedFromLinkedView( true ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimEclipsePropertyFilterCollection::propertyFilters() const +{ + return m_propertyFilters.children(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmChildArrayField& RimEclipsePropertyFilterCollection::propertyFiltersField() +{ + return m_propertyFilters; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimEclipsePropertyFilterCollection::loadAndInitializePropertyFilters() { - for ( RimEclipsePropertyFilter* propertyFilter : propertyFilters ) + for ( RimEclipsePropertyFilter* propertyFilter : m_propertyFilters ) { propertyFilter->resultDefinition()->setEclipseCase( reservoirView()->eclipseCase() ); propertyFilter->initAfterRead(); @@ -93,7 +120,7 @@ bool RimEclipsePropertyFilterCollection::hasActiveFilters() const { if ( !isActive ) return false; - for ( RimEclipsePropertyFilter* propertyFilter : propertyFilters ) + for ( RimEclipsePropertyFilter* propertyFilter : m_propertyFilters ) { if ( propertyFilter->isActive() && propertyFilter->resultDefinition()->hasResult() ) return true; } @@ -108,7 +135,7 @@ bool RimEclipsePropertyFilterCollection::hasActiveDynamicFilters() const { if ( !isActive ) return false; - for ( RimEclipsePropertyFilter* propertyFilter : propertyFilters ) + for ( RimEclipsePropertyFilter* propertyFilter : m_propertyFilters ) { if ( propertyFilter->isActive() && propertyFilter->resultDefinition()->hasDynamicResult() ) return true; } @@ -123,7 +150,7 @@ bool RimEclipsePropertyFilterCollection::isUsingFormationNames() const { if ( !isActive ) return false; - for ( RimEclipsePropertyFilter* propertyFilter : propertyFilters ) + for ( RimEclipsePropertyFilter* propertyFilter : m_propertyFilters ) { if ( propertyFilter->isActive() && propertyFilter->resultDefinition()->resultType() == RiaDefines::ResultCatType::FORMATION_NAMES && @@ -159,7 +186,7 @@ void RimEclipsePropertyFilterCollection::updateIconState() updateUiIconFromState( activeIcon ); - for ( RimEclipsePropertyFilter* cellFilter : propertyFilters ) + for ( RimEclipsePropertyFilter* cellFilter : m_propertyFilters ) { cellFilter->updateActiveState(); cellFilter->updateIconState(); @@ -171,7 +198,7 @@ void RimEclipsePropertyFilterCollection::updateIconState() //-------------------------------------------------------------------------------------------------- void RimEclipsePropertyFilterCollection::updateFromCurrentTimeStep() { - for ( RimEclipsePropertyFilter* cellFilter : propertyFilters() ) + for ( RimEclipsePropertyFilter* cellFilter : m_propertyFilters() ) { cellFilter->updateFromCurrentTimeStep(); } diff --git a/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilterCollection.h b/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilterCollection.h index ae1b445007..00035095b8 100644 --- a/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilterCollection.h +++ b/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilterCollection.h @@ -40,11 +40,11 @@ class RimEclipsePropertyFilterCollection : public RimPropertyFilterCollection ~RimEclipsePropertyFilterCollection() override; RimEclipseView* reservoirView(); + void setIsDuplicatedFromLinkedView(); - // Fields: - caf::PdmChildArrayField propertyFilters; + std::vector propertyFilters() const; + caf::PdmChildArrayField& propertyFiltersField(); - // Methods bool hasActiveFilters() const override; bool hasActiveDynamicFilters() const override; bool isUsingFormationNames() const; @@ -55,6 +55,8 @@ class RimEclipsePropertyFilterCollection : public RimPropertyFilterCollection void updateFromCurrentTimeStep(); protected: - // Overridden methods void initAfterRead() override; + +private: + caf::PdmChildArrayField m_propertyFilters; }; diff --git a/ApplicationLibCode/ProjectDataModel/CellFilters/RimPropertyFilterCollection.cpp b/ApplicationLibCode/ProjectDataModel/CellFilters/RimPropertyFilterCollection.cpp index 4dd78b44c4..5417e122f2 100644 --- a/ApplicationLibCode/ProjectDataModel/CellFilters/RimPropertyFilterCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/CellFilters/RimPropertyFilterCollection.cpp @@ -66,16 +66,21 @@ void RimPropertyFilterCollection::updateDisplayModelNotifyManagedViews( RimPrope view->scheduleCreateDisplayModelAndRedraw(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- void RimPropertyFilterCollection::onChildDeleted( caf::PdmChildArrayFieldHandle* childArray, std::vector& referringObjects ) { - Rim3dView* view = nullptr; - this->firstAncestorOrThisOfType( view ); - CVF_ASSERT( view ); - if ( !view ) return; + updateDisplayModelNotifyManagedViews( nullptr ); +} - view->scheduleGeometryRegen( PROPERTY_FILTERED ); - view->scheduleCreateDisplayModelAndRedraw(); +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPropertyFilterCollection::onChildAdded( caf::PdmFieldHandle* containerForNewObject ) +{ + updateDisplayModelNotifyManagedViews( nullptr ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/CellFilters/RimPropertyFilterCollection.h b/ApplicationLibCode/ProjectDataModel/CellFilters/RimPropertyFilterCollection.h index 849f6121d2..6984d6e079 100644 --- a/ApplicationLibCode/ProjectDataModel/CellFilters/RimPropertyFilterCollection.h +++ b/ApplicationLibCode/ProjectDataModel/CellFilters/RimPropertyFilterCollection.h @@ -48,6 +48,7 @@ class RimPropertyFilterCollection : public caf::PdmObject virtual void updateIconState() = 0; void onChildDeleted( caf::PdmChildArrayFieldHandle* childArray, std::vector& referringObjects ) override; + void onChildAdded( caf::PdmFieldHandle* containerForNewObject ) override; protected: // Overridden methods diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimEllipseFractureTemplate.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimEllipseFractureTemplate.cpp index 1a27996b75..adc4109f46 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimEllipseFractureTemplate.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimEllipseFractureTemplate.cpp @@ -92,7 +92,8 @@ void RimEllipseFractureTemplate::fieldChangedByUi( const caf::PdmFieldHandle* ch RimFractureTemplate::fieldChangedByUi( changedField, oldValue, newValue ); if ( changedField == &m_halfLength || changedField == &m_height || changedField == &m_width || - changedField == &m_permeability || changedField == &m_scaleApplyButton ) + changedField == &m_permeability || changedField == &m_scaleApplyButton || + changedField == &m_wellPathDepthAtFracture ) { m_scaleApplyButton = false; @@ -173,8 +174,8 @@ cvf::cref RimEllipseFractureTemplate::createFractureGrid( doubl double height = m_height * m_heightScaleFactor; double halfLength = m_halfLength * m_halfLengthScaleFactor; - double cellSizeX = ( halfLength * 2 ) / numberOfCellsI * m_halfLengthScaleFactor; - double cellSizeZ = height / numberOfCellsJ * m_heightScaleFactor; + double cellSizeX = ( halfLength * 2 ) / numberOfCellsI; + double cellSizeZ = height / numberOfCellsJ; double cellArea = cellSizeX * cellSizeZ; double areaTresholdForIncludingCell = 0.5 * cellArea; @@ -396,7 +397,8 @@ void RimEllipseFractureTemplate::onLoadDataAndUpdateGeometryHasChanged() this->firstAncestorOrThisOfType( eclipseCase ); if ( eclipseCase ) { - RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews( eclipseCase ); + RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews( + { eclipseCase } ); } else { @@ -487,6 +489,7 @@ void RimEllipseFractureTemplate::defineUiOrdering( QString uiConfigName, caf::Pd group->add( &m_permeability ); group->add( &m_width ); group->add( &m_skinFactor ); + group->add( &m_userDefinedPerforationLength ); group->add( &m_perforationLength ); group->add( &m_perforationEfficiency ); group->add( &m_wellDiameter ); diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimFishbones.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimFishbones.cpp index ae5625a01f..80f2c24ab0 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimFishbones.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimFishbones.cpp @@ -718,12 +718,7 @@ void RimFishbones::computeSubLateralIndices() } } - std::mt19937 randomEngine( m_randomSeed() ); - std::shuffle( subLateralCandidates.begin(), subLateralCandidates.end(), randomEngine ); - - double numLaterals = static_cast( m_valveLocations->valveLocations().size() * m_lateralCountPerSub ); - m_subLateralIndices = - std::vector( subLateralCandidates.begin(), subLateralCandidates.begin() + numLaterals ); + m_subLateralIndices = subLateralCandidates; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimFracture.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimFracture.cpp index a838824055..115b34f120 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimFracture.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimFracture.cpp @@ -197,6 +197,10 @@ double RimFracture::perforationEfficiency() const void RimFracture::setStimPlanTimeIndexToPlot( int timeIndex ) { m_stimPlanTimeIndexToPlot = timeIndex; + if ( m_autoUpdateWellPathDepthAtFractureFromTemplate ) + { + placeUsingTemplateData(); + } } //-------------------------------------------------------------------------------------------------- @@ -263,6 +267,7 @@ void RimFracture::fieldChangedByUi( const caf::PdmFieldHandle* changedField, con if ( m_autoUpdateWellPathDepthAtFractureFromTemplate && m_fractureTemplate() ) { m_wellPathDepthAtFracture = m_fractureTemplate->wellPathDepthAtFracture(); + placeUsingTemplateData(); } updateFractureGrid(); RimProject::current()->scheduleCreateDisplayModelAndRedrawAllViews(); @@ -274,6 +279,11 @@ void RimFracture::fieldChangedByUi( const caf::PdmFieldHandle* changedField, con RimProject::current()->scheduleCreateDisplayModelAndRedrawAllViews(); } + if ( changedField == &m_stimPlanTimeIndexToPlot ) + { + if ( m_autoUpdateWellPathDepthAtFractureFromTemplate() ) placeUsingTemplateData(); + } + if ( changedField == &m_azimuth || changedField == &m_fractureTemplate || changedField == &m_stimPlanTimeIndexToPlot || changedField == this->objectToggleField() || changedField == &m_dip || changedField == &m_tilt || changedField == &m_perforationLength ) @@ -285,7 +295,7 @@ void RimFracture::fieldChangedByUi( const caf::PdmFieldHandle* changedField, con if ( eclipseCase ) { RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews( - eclipseCase ); + { eclipseCase } ); } else { @@ -1004,3 +1014,10 @@ void RimFracture::onWellPathDepthAtFractureInTemplateChanged( const caf::SignalE RimProject::current()->scheduleCreateDisplayModelAndRedrawAllViews(); } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimFracture::placeUsingTemplateData() +{ +} diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimFracture.h b/ApplicationLibCode/ProjectDataModel/Completions/RimFracture.h index 7a1b10eff1..8b508a9ca9 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimFracture.h +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimFracture.h @@ -121,6 +121,8 @@ class RimFracture : public RimCheckableNamedObject, public Rim3dPropertiesInterf virtual void loadDataAndUpdate() = 0; virtual std::vector perforationLengthCenterLineCoords() const = 0; + virtual void placeUsingTemplateData(); + // Fracture properties const NonDarcyData& nonDarcyProperties() const; void ensureValidNonDarcyProperties(); diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimFractureTemplate.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimFractureTemplate.cpp index 6d64181f6a..6b6d00f95c 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimFractureTemplate.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimFractureTemplate.cpp @@ -115,7 +115,7 @@ RimFractureTemplate::RimFractureTemplate() CAF_PDM_InitField( &m_id, "Id", -1, "ID" ); m_id.uiCapability()->setUiReadOnly( true ); - CAF_PDM_InitField( &m_name, "UserDescription", QString( "Fracture Template" ), "Name" ); + CAF_PDM_InitScriptableField( &m_name, "UserDescription", QString( "Fracture Template" ), "Name" ); CAF_PDM_InitFieldNoDefault( &m_nameAndUnit, "NameAndUnit", "NameAndUnit" ); m_nameAndUnit.registerGetMethod( this, &RimFractureTemplate::nameAndUnit ); @@ -133,20 +133,24 @@ RimFractureTemplate::RimFractureTemplate() caf::AppEnum( TRANSVERSE_WELL_PATH ), "Fracture Orientation" ); + CAF_PDM_InitScriptableField( &m_userDefinedPerforationLength, + "UserDefinedPerforationLength", + false, + "User-defined Perforation Length" ); CAF_PDM_InitScriptableField( &m_azimuthAngle, "AzimuthAngle", 0.0f, "Azimuth Angle" ); CAF_PDM_InitField( &m_skinFactor, "SkinFactor", 0.0f, "Skin Factor" ); - CAF_PDM_InitField( &m_perforationLength, "PerforationLength", 1.0, "Perforation Length" ); + CAF_PDM_InitScriptableField( &m_perforationLength, "PerforationLength", 1.0, "Perforation Length" ); CAF_PDM_InitField( &m_perforationEfficiency, "PerforationEfficiency", 1.0, "Perforation Efficiency" ); m_perforationEfficiency.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() ); CAF_PDM_InitField( &m_wellDiameter, "WellDiameter", 0.216, "Well Diameter at Fracture" ); - CAF_PDM_InitField( &m_conductivityType, - "ConductivityType", - caf::AppEnum( FINITE_CONDUCTIVITY ), - "Conductivity in Fracture" ); + CAF_PDM_InitScriptableField( &m_conductivityType, + "ConductivityType", + caf::AppEnum( FINITE_CONDUCTIVITY ), + "Conductivity in Fracture" ); CAF_PDM_InitField( &m_wellPathDepthAtFracture, "WellPathDepthAtFracture", 0.0, "Well/Fracture Intersection Depth" ); m_wellPathDepthAtFracture.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() ); @@ -202,16 +206,16 @@ RimFractureTemplate::RimFractureTemplate() m_dFactorSummaryText.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::LabelPosType::TOP ); m_dFactorSummaryText.xmlCapability()->disableIO(); - CAF_PDM_InitField( &m_heightScaleFactor, "HeightScaleFactor", 1.0, "Height" ); - CAF_PDM_InitField( &m_halfLengthScaleFactor, "WidthScaleFactor", 1.0, "Half Length" ); - CAF_PDM_InitField( &m_dFactorScaleFactor, "DFactorScaleFactor", 1.0, "D-factor" ); - CAF_PDM_InitField( &m_conductivityScaleFactor, - "ConductivityFactor", - 1.0, - "Conductivity", - "", - "The conductivity values read from file will be scaled with this parameters", - "" ); + CAF_PDM_InitScriptableField( &m_heightScaleFactor, "HeightScaleFactor", 1.0, "Height" ); + CAF_PDM_InitScriptableField( &m_halfLengthScaleFactor, "WidthScaleFactor", 1.0, "Half Length" ); + CAF_PDM_InitScriptableField( &m_dFactorScaleFactor, "DFactorScaleFactor", 1.0, "D-factor" ); + CAF_PDM_InitScriptableField( &m_conductivityScaleFactor, + "ConductivityFactor", + 1.0, + "Conductivity", + "", + "The conductivity values read from file will be scaled with this parameters", + "" ); CAF_PDM_InitField( &m_scaleApplyButton, "ScaleApplyButton", false, "Apply" ); m_scaleApplyButton.xmlCapability()->disableIO(); @@ -496,10 +500,12 @@ void RimFractureTemplate::prepareFieldsForUiDisplay() m_orientationType == RimFractureTemplate::TRANSVERSE_WELL_PATH ) { m_azimuthAngle.uiCapability()->setUiHidden( true ); + m_userDefinedPerforationLength.uiCapability()->setUiHidden( true ); } else if ( m_orientationType == RimFractureTemplate::AZIMUTH ) { m_azimuthAngle.uiCapability()->setUiHidden( false ); + m_userDefinedPerforationLength.uiCapability()->setUiHidden( false ); } if ( m_orientationType == RimFractureTemplate::ALONG_WELL_PATH ) @@ -510,7 +516,10 @@ void RimFractureTemplate::prepareFieldsForUiDisplay() else { m_perforationEfficiency.uiCapability()->setUiHidden( true ); - m_perforationLength.uiCapability()->setUiHidden( true ); + + bool hidePerforationLength = + !( m_orientationType == RimFractureTemplate::AZIMUTH && m_userDefinedPerforationLength() ); + m_perforationLength.uiCapability()->setUiHidden( hidePerforationLength ); } if ( m_conductivityType == FINITE_CONDUCTIVITY ) @@ -939,6 +948,14 @@ double RimFractureTemplate::perforationLength() const return m_perforationLength; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimFractureTemplate::useUserDefinedPerforationLength() const +{ + return m_userDefinedPerforationLength; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1001,3 +1018,11 @@ double RimFractureTemplate::wellPathDepthAtFracture() const { return m_wellPathDepthAtFracture; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimFractureTemplate::placeFractureUsingTemplateData( RimFracture* fracture ) +{ + return true; +} diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimFractureTemplate.h b/ApplicationLibCode/ProjectDataModel/Completions/RimFractureTemplate.h index 3cd0577fe9..61d833d863 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimFractureTemplate.h +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimFractureTemplate.h @@ -138,6 +138,7 @@ class RimFractureTemplate : public caf::PdmObject double wellDiameter() const; FracConductivityEnum conductivityType() const; double perforationLength() const; + bool useUserDefinedPerforationLength() const; double wellPathDepthAtFracture() const; virtual std::pair wellPathDepthAtFractureRange() const = 0; @@ -147,6 +148,8 @@ class RimFractureTemplate : public caf::PdmObject std::vector* triangleIndices, double wellPathDepthAtFracture ) const = 0; + virtual bool placeFractureUsingTemplateData( RimFracture* fracture ); + virtual cvf::cref createFractureGrid( double wellPathDepthAtFracture ) const = 0; const RimFractureContainment* fractureContainment() const; @@ -213,6 +216,7 @@ class RimFractureTemplate : public caf::PdmObject caf::PdmField> m_orientationType; caf::PdmField m_azimuthAngle; caf::PdmField m_skinFactor; + caf::PdmField m_userDefinedPerforationLength; caf::PdmField m_perforationLength; caf::PdmField m_perforationEfficiency; caf::PdmField m_wellDiameter; diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimMeshFractureTemplate.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimMeshFractureTemplate.cpp index 60e65fac7e..7b28f5eadf 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimMeshFractureTemplate.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimMeshFractureTemplate.cpp @@ -28,6 +28,7 @@ #include "RigFractureCell.h" #include "RigFractureGrid.h" #include "RigTransmissibilityEquations.h" +#include "RigWellPath.h" #include "RigWellPathStimplanIntersector.h" #include "RimEclipseView.h" @@ -66,11 +67,11 @@ RimMeshFractureTemplate::RimMeshFractureTemplate() CAF_PDM_InitField( &m_borderPolygonResultName, "BorderPolygonResultName", QString( "" ), "Parameter" ); m_borderPolygonResultName.uiCapability()->setUiHidden( true ); - CAF_PDM_InitField( &m_activeTimeStepIndex, "ActiveTimeStepIndex", 0, "Active TimeStep Index" ); - CAF_PDM_InitField( &m_conductivityResultNameOnFile, - "ConductivityResultName", - QString( "" ), - "Active Conductivity Result Name" ); + CAF_PDM_InitScriptableField( &m_activeTimeStepIndex, "ActiveTimeStepIndex", 0, "Active TimeStep Index" ); + CAF_PDM_InitScriptableField( &m_conductivityResultNameOnFile, + "ConductivityResultName", + QString( "" ), + "Active Conductivity Result Name" ); m_readError = false; @@ -275,7 +276,10 @@ WellFractureIntersectionData RimMeshFractureTemplate::wellFractureIntersectionDa RiaWeightedMeanCalculator conductivityCalc; RiaWeightedGeometricMeanCalculator betaFactorCalc; - RigWellPathStimplanIntersector intersector( rimWellPath->wellPathGeometry(), fractureInstance ); + std::vector wellPathPoints = + rimWellPath->wellPathGeometry()->wellPathPointsIncludingInterpolatedIntersectionPoint( + fractureInstance->fractureMD() ); + RigWellPathStimplanIntersector intersector( wellPathPoints, fractureInstance ); for ( const auto& v : intersector.intersections() ) { size_t fractureGlobalCellIndex = v.first; @@ -498,6 +502,7 @@ void RimMeshFractureTemplate::defineUiOrdering( QString uiConfigName, caf::PdmUi group->add( &m_conductivityResultNameOnFile ); group->add( &m_conductivityType ); group->add( &m_skinFactor ); + group->add( &m_userDefinedPerforationLength ); group->add( &m_perforationLength ); group->add( &m_perforationEfficiency ); group->add( &m_wellDiameter ); diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimMeshFractureTemplate.h b/ApplicationLibCode/ProjectDataModel/Completions/RimMeshFractureTemplate.h index c6bbc5566c..f15311c6b7 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimMeshFractureTemplate.h +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimMeshFractureTemplate.h @@ -68,6 +68,8 @@ class RimMeshFractureTemplate : public RimFractureTemplate size_t i, size_t j ) = 0; + virtual bool isValidResult( double value ) const = 0; + virtual QString getFileSelectionFilter() const = 0; virtual std::vector widthResultValues() const; diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimPerforationCollection.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimPerforationCollection.cpp index f35aa426a6..d4572296f8 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimPerforationCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimPerforationCollection.cpp @@ -114,8 +114,6 @@ void RimPerforationCollection::appendPerforation( RimPerforationInterval* perfor m_perforations.push_back( perforation ); - perforation->setUnitSystemSpecificDefaults(); - updateConnectedEditors(); Riu3DMainWindowTools::selectAsCurrentItem( perforation ); diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.cpp index 888884f0ef..96e298cdd9 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.cpp @@ -227,6 +227,8 @@ void RimStimPlanFractureTemplate::loadDataAndUpdate() //-------------------------------------------------------------------------------------------------- QStringList RimStimPlanFractureTemplate::conductivityResultNames() const { + if ( m_stimPlanFractureDefinitionData.isNull() ) return QStringList(); + return m_stimPlanFractureDefinitionData->conductivityResultNames(); } @@ -838,3 +840,11 @@ void RimStimPlanFractureTemplate::appendTextIfValidValue( QString& body += QString( "%1: %2
" ).arg( name ).arg( RiaNumberFormat::valueToText( value, numberFormat, precision ) ); } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimStimPlanFractureTemplate::isValidResult( double value ) const +{ + return value > 1e-7; +} diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.h b/ApplicationLibCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.h index bc358163d5..2c10580918 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.h +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.h @@ -118,6 +118,8 @@ class RimStimPlanFractureTemplate : public RimMeshFractureTemplate static std::pair widthParameterNameAndUnit( cvf::ref def ); + bool isValidResult( double value ) const override; + protected: void initAfterRead() override; diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimThermalFractureTemplate.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimThermalFractureTemplate.cpp index dca38fe560..1e64250d38 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimThermalFractureTemplate.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimThermalFractureTemplate.cpp @@ -23,6 +23,7 @@ #include "RiaEclipseUnitTools.h" #include "RiaFractureDefines.h" #include "RiaLogging.h" +#include "RiaThermalFractureDefines.h" #include "RifThermalFractureReader.h" @@ -30,13 +31,13 @@ #include "RigFractureGrid.h" #include "RigThermalFractureDefinition.h" #include "RigThermalFractureResultUtil.h" +#include "RigWellPath.h" #include "RimEclipseView.h" #include "RimFracture.h" -#include "RimFractureContainment.h" -#include "RimProject.h" #include "RimStimPlanColors.h" #include "RimWellPath.h" +#include "RimWellPathFracture.h" #include "cafPdmFieldScriptingCapability.h" #include "cafPdmObject.h" @@ -54,6 +55,19 @@ #include #include +namespace caf +{ +template <> +void caf::AppEnum::setUp() +{ + addItem( RimThermalFractureTemplate::FilterCakePressureDrop::NONE, "None", "None" ); + addItem( RimThermalFractureTemplate::FilterCakePressureDrop::RELATIVE, "Relative", "Relative" ); + addItem( RimThermalFractureTemplate::FilterCakePressureDrop::ABSOLUTE, "Absolute", "Absolute" ); + + setDefault( RimThermalFractureTemplate::FilterCakePressureDrop::RELATIVE ); +} +}; // namespace caf + CAF_PDM_SOURCE_INIT( RimThermalFractureTemplate, "ThermalFractureTemplate", "RimThermalFractureTemplate" ); //-------------------------------------------------------------------------------------------------- @@ -63,6 +77,10 @@ RimThermalFractureTemplate::RimThermalFractureTemplate() { CAF_PDM_InitScriptableObject( "Fracture Template", ":/FractureTemplate16x16.png" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_filterCakePressureDropType, + "FilterCakePressureDrop", + "Filter Cake Pressure Drop" ); + m_readError = false; setDeletable( true ); @@ -112,7 +130,7 @@ bool RimThermalFractureTemplate::setBorderPolygonResultNameToDefault() // first option: Width for ( std::pair property : uiResultNamesWithUnit() ) { - if ( property.first == "WIDTH" ) + if ( property.first.contains( "width", Qt::CaseInsensitive ) ) { m_borderPolygonResultName = property.first; return true; @@ -149,6 +167,59 @@ void RimThermalFractureTemplate::loadDataAndUpdate() m_fractureDefinitionData = fractureDefinitionData; if ( m_fractureDefinitionData ) { + auto addInjectivityFactor = []( std::shared_ptr def ) { + int leakoffPressureDropIndex = def->getPropertyIndex( RiaDefines::leakoffPressureDropResultName() ); + int filtratePressureDropIndex = def->getPropertyIndex( RiaDefines::filtratePressureDropResultName() ); + QString injectivityValueTag = RiaDefines::injectivityFactorResultName(); + def->addProperty( injectivityValueTag, + RiaDefines::getExpectedThermalFractureUnit( injectivityValueTag, def->unitSystem() ) ); + + int injectivityFactorIndex = def->getPropertyIndex( injectivityValueTag ); + + for ( int nodeIndex = 0; nodeIndex < static_cast( def->numNodes() ); nodeIndex++ ) + { + for ( int timeStepIndex = 0; timeStepIndex < static_cast( def->numTimeSteps() ); timeStepIndex++ ) + { + double leakoffPressureDrop = + def->getPropertyValue( leakoffPressureDropIndex, nodeIndex, timeStepIndex ); + double filtratePressureDrop = + def->getPropertyValue( filtratePressureDropIndex, nodeIndex, timeStepIndex ); + + double injectivityValue = ( leakoffPressureDrop - filtratePressureDrop ) / leakoffPressureDrop; + def->appendPropertyValue( injectivityFactorIndex, nodeIndex, injectivityValue ); + } + } + }; + + auto addFilterCakeMobility = []( std::shared_ptr def ) { + int leakoffPressureDropIndex = def->getPropertyIndex( RiaDefines::leakoffPressureDropResultName() ); + int filtratePressureDropIndex = def->getPropertyIndex( RiaDefines::filtratePressureDropResultName() ); + int leakoffMobilityIndex = def->getPropertyIndex( RiaDefines::leakoffMobilityResultName() ); + QString filterCakeMobilityValueTag = RiaDefines::filterCakeMobilityResultName(); + def->addProperty( filterCakeMobilityValueTag, + RiaDefines::getExpectedThermalFractureUnit( filterCakeMobilityValueTag, def->unitSystem() ) ); + + int filterCakeMobilityIndex = def->getPropertyIndex( filterCakeMobilityValueTag ); + + for ( int nodeIndex = 0; nodeIndex < static_cast( def->numNodes() ); nodeIndex++ ) + { + for ( int timeStepIndex = 0; timeStepIndex < static_cast( def->numTimeSteps() ); timeStepIndex++ ) + { + double leakoffPressureDrop = + def->getPropertyValue( leakoffPressureDropIndex, nodeIndex, timeStepIndex ); + double filtratePressureDrop = + def->getPropertyValue( filtratePressureDropIndex, nodeIndex, timeStepIndex ); + double leakoffMobility = def->getPropertyValue( leakoffMobilityIndex, nodeIndex, timeStepIndex ); + + double filterCakeMobilityValue = leakoffMobility * ( leakoffPressureDrop / filtratePressureDrop ); + def->appendPropertyValue( filterCakeMobilityIndex, nodeIndex, filterCakeMobilityValue ); + } + } + }; + + addInjectivityFactor( m_fractureDefinitionData ); + addFilterCakeMobility( m_fractureDefinitionData ); + setDefaultConductivityResultIfEmpty(); if ( fractureTemplateUnit() == RiaDefines::EclipseUnitSystem::UNITS_UNKNOWN ) @@ -505,30 +576,7 @@ std::vector> RimThermalFractureTemplate::uiResultNam if ( m_fractureDefinitionData ) { - QString conductivityUnit = "mD/s"; - - std::vector> tmp; - - std::vector> propertyNamesUnitsOnFile = - m_fractureDefinitionData->getPropertyNamesUnits(); - for ( const auto& nameUnitPair : propertyNamesUnitsOnFile ) - { - if ( nameUnitPair.first.contains( RiaDefines::conductivityResultName(), Qt::CaseInsensitive ) ) - { - conductivityUnit = nameUnitPair.second; - } - else - { - tmp.push_back( nameUnitPair ); - } - } - - propertyNamesAndUnits.push_back( std::make_pair( RiaDefines::conductivityResultName(), conductivityUnit ) ); - - for ( const auto& nameUnitPair : tmp ) - { - propertyNamesAndUnits.push_back( nameUnitPair ); - } + return m_fractureDefinitionData->getPropertyNamesUnits(); } return propertyNamesAndUnits; @@ -599,7 +647,7 @@ double RimThermalFractureTemplate::resultValueAtIJ( const RigFractureGrid* fract size_t adjustedI = i + 1; size_t adjustedJ = j + 1; - if ( adjustedI >= fractureGrid->iCellCount() || adjustedJ >= fractureGrid->jCellCount() ) + if ( adjustedI >= fractureGrid->iCellCount() + 1 || adjustedJ >= fractureGrid->jCellCount() + 1 ) { return HUGE_VAL; } @@ -704,3 +752,72 @@ std::pair RimThermalFractureTemplate::computePositionAnd cvf::Vec3d rotation = cvf::Vec3d::UNDEFINED; return std::make_pair( centerPosition, rotation ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimThermalFractureTemplate::isValidResult( double value ) const +{ + return !std::isinf( value ) && !std::isnan( value ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const RigThermalFractureDefinition* RimThermalFractureTemplate::fractureDefinition() const +{ + return m_fractureDefinitionData.get(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimThermalFractureTemplate::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) +{ + RimMeshFractureTemplate::defineUiOrdering( uiConfigName, uiOrdering ); + + uiOrdering.add( &m_filterCakePressureDropType ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimThermalFractureTemplate::FilterCakePressureDrop RimThermalFractureTemplate::filterCakePressureDropType() const +{ + return m_filterCakePressureDropType.value(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimThermalFractureTemplate::placeFractureUsingTemplateData( RimFracture* fracture ) +{ + RimWellPath* wellPath = nullptr; + fracture->firstAncestorOrThisOfTypeAsserted( wellPath ); + + auto wellPathGeometry = wellPath->wellPathGeometry(); + if ( !wellPathGeometry ) return false; + + auto [centerPosition, rotation] = computePositionAndRotation(); + + // TODO: y conversion is workaround for strange test data + centerPosition.y() = std::fabs( centerPosition.y() ); + centerPosition.z() *= -1.0; + + double md = wellPathGeometry->closestMeasuredDepth( centerPosition ); + + RiaLogging::info( QString( "Placing thermal fracture. Posotion: [%1 %2 %3]" ) + .arg( centerPosition.x() ) + .arg( centerPosition.y() ) + .arg( centerPosition.z() ) ); + RiaLogging::info( QString( "Computed MD: %1" ).arg( md ) ); + + RimWellPathFracture* wellPathFracture = dynamic_cast( fracture ); + if ( wellPathFracture ) wellPathFracture->setMeasuredDepth( md ); + + m_orientationType = RimFractureTemplate::AZIMUTH; + fracture->setAzimuth( rotation.x() ); + fracture->setDip( rotation.y() ); + fracture->setTilt( rotation.z() ); + return true; +} diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimThermalFractureTemplate.h b/ApplicationLibCode/ProjectDataModel/Completions/RimThermalFractureTemplate.h index f3e1f77d56..c6736c661a 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimThermalFractureTemplate.h +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimThermalFractureTemplate.h @@ -39,6 +39,13 @@ class RimThermalFractureTemplate : public RimMeshFractureTemplate CAF_PDM_HEADER_INIT; public: + enum class FilterCakePressureDrop + { + NONE, + RELATIVE, + ABSOLUTE + }; + RimThermalFractureTemplate(); ~RimThermalFractureTemplate() override; @@ -55,6 +62,8 @@ class RimThermalFractureTemplate : public RimMeshFractureTemplate std::vector* triangleIndices, double wellPathDepthAtFracture ) const override; + bool placeFractureUsingTemplateData( RimFracture* fracture ) override; + // Result Access std::vector timeStepsStrings() override; std::vector timeSteps() override; @@ -75,6 +84,7 @@ class RimThermalFractureTemplate : public RimMeshFractureTemplate const QString& unit, MinMaxAccumulator& minMaxAccumulator, PosNegAccumulator& posNegAccumulator ) const override; + bool isValidResult( double value ) const override; void setDefaultConductivityResultIfEmpty(); bool setBorderPolygonResultNameToDefault(); @@ -102,10 +112,18 @@ class RimThermalFractureTemplate : public RimMeshFractureTemplate std::pair computePositionAndRotation() const; + const RigThermalFractureDefinition* fractureDefinition() const; + + FilterCakePressureDrop filterCakePressureDropType() const; + protected: + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + QString getFileSelectionFilter() const override; QStringList conductivityResultNames() const override; private: + caf::PdmField> m_filterCakePressureDropType; + std::shared_ptr m_fractureDefinitionData; }; diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathFracture.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathFracture.cpp index 48d4cf7945..ebef08e0a4 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathFracture.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathFracture.cpp @@ -355,3 +355,14 @@ void RimWellPathFracture::applyOffset( double offsetMD ) { m_measuredDepth = m_measuredDepth + offsetMD; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellPathFracture::placeUsingTemplateData() +{ + if ( m_fractureTemplate ) + { + m_fractureTemplate->placeFractureUsingTemplateData( this ); + } +} diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathFracture.h b/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathFracture.h index 30b95ea0fa..997e1cfd8e 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathFracture.h +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathFracture.h @@ -48,6 +48,8 @@ class RimWellPathFracture : public RimFracture double wellAzimuthAtFracturePosition() const override; + void placeUsingTemplateData() override; + void loadDataAndUpdate() override; std::vector perforationLengthCenterLineCoords() const override; diff --git a/ApplicationLibCode/ProjectDataModel/Faults/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/Faults/CMakeLists_files.cmake index ab8db4663f..4bf68e1964 100644 --- a/ApplicationLibCode/ProjectDataModel/Faults/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/Faults/CMakeLists_files.cmake @@ -1,17 +1,11 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RimFaultInView.h ${CMAKE_CURRENT_LIST_DIR}/RimFaultInViewCollection.h - ${CMAKE_CURRENT_LIST_DIR}/RimFaultRASettings.h - ${CMAKE_CURRENT_LIST_DIR}/RimFaultRAPreprocSettings.h - ${CMAKE_CURRENT_LIST_DIR}/RimFaultRAPostprocSettings.h ) set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RimFaultInView.cpp ${CMAKE_CURRENT_LIST_DIR}/RimFaultInViewCollection.cpp - ${CMAKE_CURRENT_LIST_DIR}/RimFaultRASettings.cpp - ${CMAKE_CURRENT_LIST_DIR}/RimFaultRAPreprocSettings.cpp - ${CMAKE_CURRENT_LIST_DIR}/RimFaultRAPostprocSettings.cpp ) list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) diff --git a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.cpp b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.cpp index bf0d3d5164..970a11163a 100644 --- a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.cpp @@ -31,7 +31,6 @@ #include "RimEclipseInputCase.h" #include "RimEclipseView.h" #include "RimFaultInView.h" -#include "RimFaultRASettings.h" #include "RimIntersectionCollection.h" #include "RiuMainWindow.h" @@ -101,15 +100,6 @@ RimFaultInViewCollection::RimFaultInViewCollection() CAF_PDM_InitFieldNoDefault( &faults, "Faults", "Faults" ); faults.uiCapability()->setUiTreeHidden( true ); - - CAF_PDM_InitField( &m_enableFaultRA, "EnableFaultRA", false, "Enable Fault RA" ); - m_enableFaultRA.uiCapability()->setUiReadOnly( true ); - m_enableFaultRA.uiCapability()->setUiHidden( true ); - - CAF_PDM_InitFieldNoDefault( &m_faultRASettings, "FaultRASettings", "Reactivation Assessment Settings" ); - m_faultRASettings = new RimFaultRASettings(); - m_faultRASettings.uiCapability()->setUiHidden( true ); - m_faultRASettings.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- @@ -328,13 +318,6 @@ void RimFaultInViewCollection::defineUiOrdering( QString uiConfigName, caf::PdmU //-------------------------------------------------------------------------------------------------- void RimFaultInViewCollection::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName ) { - RimEclipseInputCase* inputCase = nullptr; - this->firstAncestorOrThisOfType( inputCase ); - if ( ( inputCase != nullptr ) && m_enableFaultRA() ) - { - uiTreeOrdering.add( &m_faultRASettings ); - } - RimEclipseView* eclipseView = nullptr; this->firstAncestorOfType( eclipseView ); if ( eclipseView ) @@ -387,35 +370,3 @@ bool RimFaultInViewCollection::onlyShowFacesWithDefinedNeighbor() const { return m_onlyShowWithNeighbor; } - -//------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimFaultRASettings* RimFaultInViewCollection::faultRASettings() const -{ - return m_faultRASettings(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RimFaultInViewCollection::faultRAEnabled() const -{ - return m_enableFaultRA(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RimFaultInViewCollection::faultRAAdvancedEnabled() const -{ - return m_enableFaultRA() && ( m_faultRASettings->geomechCase() != nullptr ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimFaultInViewCollection::enableFaultRA( bool enable ) -{ - m_enableFaultRA = enable; -} diff --git a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.h b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.h index 89ce976140..45edf95360 100644 --- a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.h +++ b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.h @@ -33,7 +33,6 @@ class RimEclipseView; class RimFaultInView; -class RimFaultRASettings; //================================================================================================== /// @@ -64,11 +63,6 @@ class RimFaultInViewCollection : public caf::PdmObject bool onlyShowFacesWithDefinedNeighbor() const; - RimFaultRASettings* faultRASettings() const; - bool faultRAEnabled() const; - bool faultRAAdvancedEnabled() const; - void enableFaultRA( bool enable ); - caf::PdmField showFaultFaces; caf::PdmField showOppositeFaultFaces; @@ -98,7 +92,4 @@ class RimFaultInViewCollection : public caf::PdmObject private: caf::PdmField m_showFaultsOutsideFilters; caf::PdmField m_onlyShowWithNeighbor; - - caf::PdmChildField m_faultRASettings; - caf::PdmField m_enableFaultRA; }; diff --git a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRAPostprocSettings.cpp b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRAPostprocSettings.cpp deleted file mode 100644 index c2f1ff8d53..0000000000 --- a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRAPostprocSettings.cpp +++ /dev/null @@ -1,173 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2021 Equinor ASA -// -// ResInsight 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 3 of the License, or -// (at your option) any later version. -// -// ResInsight 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 at -// for more details. -// -///////////////////////////////////////////////////////////////////////////////// - -#include "RimFaultRAPostprocSettings.h" - -#include "RimDoubleParameter.h" -#include "RimFaultRASettings.h" -#include "RimParameterGroup.h" - -#define _USE_MATH_DEFINES -#include - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimFaultRAPostprocSettings::RimFaultRAPostprocSettings() -{ - CAF_PDM_InitObject( "Reactivation Assessment Postproc Settings", ":/fault_react_24x24.png" ); - - CAF_PDM_InitField( &m_baseDir, "BaseDir", QString( "" ), "Working Directory" ); - CAF_PDM_InitField( &m_startTimestepEclipse, "StartTimeStepEclipse", 0, "Start Time Step" ); - CAF_PDM_InitField( &m_endTimestepEclipse, "EndTimeStepEclipse", 0, "End Time Step" ); - CAF_PDM_InitField( &m_geomechEnabled, "GeomechEnabled", false, "GeoMechanical Input Available" ); - CAF_PDM_InitField( &m_basicMacrisDatabase, "BasicMacrisDatabase", QString( "" ), "Basic Macris Database" ); - CAF_PDM_InitField( &m_advancedMacrisDatabase, "AdvancedMacrisDatabase", QString( "" ), "Advanced Macris Database" ); - CAF_PDM_InitFieldNoDefault( &m_postprocParameters, "PostprocParameters", "Post-Processing Parameters" ); - m_postprocParameters = new RimParameterGroup(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimFaultRAPostprocSettings::~RimFaultRAPostprocSettings() -{ -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimFaultRAPostprocSettings::initFromSettings( RimFaultRASettings* settings ) -{ - m_geomechEnabled = settings->geomechCase() != nullptr; - - m_baseDir = settings->outputBaseDirectory(); - m_startTimestepEclipse = settings->startTimeStepEclipseIndex(); - m_endTimestepEclipse = settings->endTimeStepEclipseIndex(); - - m_basicMacrisDatabase = settings->basicMacrisDatabase(); - m_advancedMacrisDatabase = settings->advancedMacrisDatabase(); - - RimDoubleParameter* friction_angle = - dynamic_cast( settings->getInputParameter( "friction_angle" ) ); - if ( friction_angle != nullptr ) - { - m_postprocParameters->addParameter( "friction_coef", std::atan( friction_angle->value() / 180.0 * M_PI ) ); - } - - RimDoubleParameter* rho_rock = dynamic_cast( settings->getInputParameter( "rho_rock" ) ); - if ( rho_rock != nullptr ) - { - m_postprocParameters->addParameter( "rockdensity", rho_rock->value() ); - } - - RimDoubleParameter* k0_effective = - dynamic_cast( settings->getInputParameter( "k0_effective" ) ); - if ( k0_effective != nullptr ) - { - m_postprocParameters->addParameter( "k0", k0_effective->value() ); - } - - RimDoubleParameter* sh_ratio = dynamic_cast( settings->getInputParameter( "sh_ratio" ) ); - if ( sh_ratio != nullptr ) - { - m_postprocParameters->addParameter( "sh_ratio", sh_ratio->value() ); - } - - RimDoubleParameter* s_azimuth = dynamic_cast( settings->getInputParameter( "s_azimuth" ) ); - if ( s_azimuth != nullptr ) - { - m_postprocParameters->addParameter( "sh_azim", s_azimuth->value() ); - } -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QStringList RimFaultRAPostprocSettings::stepsToLoad() -{ - QStringList timesteps; - - for ( int i = m_startTimestepEclipse(); i <= m_endTimestepEclipse(); i++ ) - { - timesteps.push_back( QString::number( i ) ); - } - return timesteps; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRAPostprocSettings::postprocParameterFilename( int faultID ) const -{ - QString retval = m_baseDir; - retval += QString( "/tmp/postproc_%1.json" ).arg( faultID, 3, 10, QChar( '0' ) ); - return retval; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRAPostprocSettings::outputBaseDirectory() const -{ - return m_baseDir; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRAPostprocSettings::advancedMacrisDatabase() const -{ - return m_advancedMacrisDatabase; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRAPostprocSettings::basicMacrisDatabase() const -{ - return m_basicMacrisDatabase; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimParameterGroup* RimFaultRAPostprocSettings::parameters() const -{ - return m_postprocParameters; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RimFaultRAPostprocSettings::geomechEnabled() const -{ - return m_geomechEnabled; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QStringList RimFaultRAPostprocSettings::postprocCommandParameters( int faultID ) const -{ - QStringList retlist; - - retlist << postprocParameterFilename( faultID ); - - return retlist; -} diff --git a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRAPostprocSettings.h b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRAPostprocSettings.h deleted file mode 100644 index 5ea2033ea4..0000000000 --- a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRAPostprocSettings.h +++ /dev/null @@ -1,61 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2021 Equinor ASA -// -// ResInsight 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 3 of the License, or -// (at your option) any later version. -// -// ResInsight 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 at -// for more details. -// -///////////////////////////////////////////////////////////////////////////////// -#pragma once - -#include "cafPdmField.h" -#include "cafPdmObject.h" -#include "cafPdmPtrField.h" - -#include - -#include -#include - -class RimFaultRASettings; -class RimParameterGroup; - -class RimFaultRAPostprocSettings : public caf::PdmObject -{ -public: - RimFaultRAPostprocSettings(); - ~RimFaultRAPostprocSettings() override; - - void initFromSettings( RimFaultRASettings* settings ); - - QStringList stepsToLoad(); - - QString postprocParameterFilename( int faultID ) const; - QString outputBaseDirectory() const; - QString basicMacrisDatabase() const; - QString advancedMacrisDatabase() const; - - bool geomechEnabled() const; - - RimParameterGroup* parameters() const; - - QStringList postprocCommandParameters( int faultID ) const; - -protected: - caf::PdmField m_baseDir; - caf::PdmField m_startTimestepEclipse; - caf::PdmField m_endTimestepEclipse; - caf::PdmField m_geomechEnabled; - caf::PdmField m_basicMacrisDatabase; - caf::PdmField m_advancedMacrisDatabase; - caf::PdmPtrField m_postprocParameters; -}; diff --git a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRAPreprocSettings.cpp b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRAPreprocSettings.cpp deleted file mode 100644 index c3bc65f25a..0000000000 --- a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRAPreprocSettings.cpp +++ /dev/null @@ -1,451 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2021 Equinor ASA -// -// ResInsight 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 3 of the License, or -// (at your option) any later version. -// -// ResInsight 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 at -// for more details. -// -///////////////////////////////////////////////////////////////////////////////// - -#include "RimFaultRAPreprocSettings.h" - -#include "RiaApplication.h" -#include "RiaPreferences.h" -#include "RimEclipseResultCase.h" -#include "RimGeoMechCase.h" -#include "RimProject.h" -#include "RimTools.h" - -#include "cafPdmFieldScriptingCapability.h" -#include "cafPdmObjectScriptingCapability.h" -#include "cafPdmUiComboBoxEditor.h" -#include "cafPdmUiFilePathEditor.h" - -#include -#include - -CAF_PDM_SOURCE_INIT( RimFaultRAPreprocSettings, "RimFaultRAPreprocSettings" ); - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimFaultRAPreprocSettings::RimFaultRAPreprocSettings() -{ - CAF_PDM_InitObject( "Fault RA Preproc Settings", ":/fault_react_24x24.png" ); - - CAF_PDM_InitField( &m_startTimestepEclipse, "StartTimeStepEclipse", 0, "Start Time Step" ); - m_startTimestepEclipse.uiCapability()->setUiEditorTypeName( caf::PdmUiComboBoxEditor::uiEditorTypeName() ); - CAF_PDM_InitField( &m_endTimestepEclipse, "EndTimeStepEclipse", 0, "End Time Step" ); - m_endTimestepEclipse.uiCapability()->setUiEditorTypeName( caf::PdmUiComboBoxEditor::uiEditorTypeName() ); - - CAF_PDM_InitField( &m_startTimestepGeoMech, "StartTimeStepGeoMech", 0, "Start Time Step" ); - m_startTimestepGeoMech.uiCapability()->setUiEditorTypeName( caf::PdmUiComboBoxEditor::uiEditorTypeName() ); - CAF_PDM_InitField( &m_endTimestepGeoMech, "EndTimeStepGeoMech", 0, "End Time Step" ); - m_endTimestepGeoMech.uiCapability()->setUiEditorTypeName( caf::PdmUiComboBoxEditor::uiEditorTypeName() ); - - CAF_PDM_InitFieldNoDefault( &m_eclipseCase, "EclipseCase", "Eclipse Case" ); - m_eclipseCase.setValue( nullptr ); - - CAF_PDM_InitFieldNoDefault( &m_geomechCase, "GeomechCase", "GeoMech Case" ); - m_geomechCase.setValue( nullptr ); - - CAF_PDM_InitFieldNoDefault( &m_baseDir, "BaseDir", "Output Directory" ); - m_baseDir.uiCapability()->setUiReadOnly( true ); - - CAF_PDM_InitField( &m_cleanBaseDir, "CleanBaseDir", false, "Clean Output Directory" ); - CAF_PDM_InitField( &m_smoothEclipseData, "SmoothEclipseData", true, "Smooth Eclipse Data" ); - - CAF_PDM_InitField( &m_elasticTableFilename, "ElasticTableFilename", QString( "" ), "Elastic Table" ); - m_elasticTableFilename.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); - m_elasticTableFilename.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimFaultRAPreprocSettings::~RimFaultRAPreprocSettings() -{ -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimFaultRAPreprocSettings::fieldChangedByUi( const caf::PdmFieldHandle* changedField, - const QVariant& oldValue, - const QVariant& newValue ) -{ - if ( ( changedField == &m_eclipseCase ) && ( m_startTimestepEclipse == m_endTimestepEclipse ) ) - { - m_endTimestepEclipse = m_eclipseCase()->timeStepStrings().size() - 1; - } -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimFaultRAPreprocSettings::defineEditorAttribute( const caf::PdmFieldHandle* field, - QString uiConfigName, - caf::PdmUiEditorAttribute* attribute ) -{ -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimFaultRAPreprocSettings::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) -{ - if ( m_geomechCase() ) - { - auto geomechGroup = uiOrdering.addNewGroup( "GeoMechanical Model" ); - geomechGroup->add( &m_geomechCase ); - geomechGroup->add( &m_startTimestepGeoMech ); - geomechGroup->add( &m_endTimestepGeoMech ); - - auto tableGroup = uiOrdering.addNewGroup( "Elastic Table" ); - tableGroup->add( &m_elasticTableFilename ); - } - - auto eclipseGroup = uiOrdering.addNewGroup( "Eclipse Model" ); - eclipseGroup->add( &m_eclipseCase ); - eclipseGroup->add( &m_smoothEclipseData ); - eclipseGroup->add( &m_startTimestepEclipse ); - eclipseGroup->add( &m_endTimestepEclipse ); - - auto outputGroup = uiOrdering.addNewGroup( "Output Settings" ); - outputGroup->add( &m_baseDir ); - outputGroup->add( &m_cleanBaseDir ); - - uiOrdering.skipRemainingFields( true ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QList - RimFaultRAPreprocSettings::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) -{ - QList options; - - if ( fieldNeedingOptions == &m_eclipseCase ) - { - RimTools::eclipseCaseOptionItems( &options ); - } - else if ( fieldNeedingOptions == &m_geomechCase ) - { - RimTools::geoMechCaseOptionItems( &options ); - } - - if ( m_geomechCase() ) - { - if ( fieldNeedingOptions == &m_startTimestepGeoMech ) - { - RimTools::timeStepsForCase( m_geomechCase, &options ); - } - else if ( fieldNeedingOptions == &m_endTimestepGeoMech ) - { - RimTools::timeStepsForCase( m_geomechCase, &options ); - } - } - - if ( m_eclipseCase() ) - { - if ( fieldNeedingOptions == &m_startTimestepEclipse ) - { - RimTools::timeStepsForCase( m_eclipseCase, &options ); - } - else if ( fieldNeedingOptions == &m_endTimestepEclipse ) - { - RimTools::timeStepsForCase( m_eclipseCase, &options ); - } - } - - return options; -} - -RimCase* RimFaultRAPreprocSettings::startCase() const -{ - if ( m_geomechCase() ) return m_geomechCase(); - return m_eclipseCase(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -int RimFaultRAPreprocSettings::startTimeStepEclipseIndex() const -{ - return m_startTimestepEclipse(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRAPreprocSettings::startTimeStepEclipse() const -{ - if ( m_eclipseCase() ) - { - if ( ( m_startTimestepEclipse >= 0 ) && ( m_startTimestepEclipse <= m_eclipseCase->timeStepStrings().size() ) ) - return m_eclipseCase->timeStepStrings()[m_startTimestepEclipse]; - } - return ""; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -int RimFaultRAPreprocSettings::endTimeStepEclipseIndex() const -{ - return m_endTimestepEclipse(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRAPreprocSettings::endTimeStepEclipse() const -{ - if ( m_eclipseCase() ) - { - if ( ( m_endTimestepEclipse >= 0 ) && ( m_endTimestepEclipse <= m_eclipseCase->timeStepStrings().size() ) ) - return m_eclipseCase->timeStepStrings()[m_endTimestepEclipse]; - } - return ""; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRAPreprocSettings::eclipseCaseFilename() const -{ - if ( m_eclipseCase ) return m_eclipseCase->gridFileName(); - return ""; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -int RimFaultRAPreprocSettings::startTimeStepGeoMechIndex() const -{ - return m_startTimestepGeoMech(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRAPreprocSettings::startTimeStepGeoMech() const -{ - if ( m_geomechCase() ) - { - if ( ( m_startTimestepGeoMech >= 0 ) && ( m_startTimestepGeoMech <= m_geomechCase->timeStepStrings().size() ) ) - return m_geomechCase->timeStepStrings()[m_startTimestepGeoMech]; - } - return ""; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -int RimFaultRAPreprocSettings::endTimeStepGeoMechIndex() const -{ - return m_endTimestepGeoMech(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRAPreprocSettings::endTimeStepGeoMech() const -{ - if ( m_geomechCase() ) - { - if ( ( m_endTimestepGeoMech >= 0 ) && ( m_endTimestepGeoMech <= m_geomechCase->timeStepStrings().size() ) ) - return m_geomechCase->timeStepStrings()[m_endTimestepGeoMech]; - } - return ""; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRAPreprocSettings::geomechCaseFilename() const -{ - if ( m_geomechCase ) return m_geomechCase->gridFileName(); - return ""; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRAPreprocSettings::elasticTableFilename() const -{ - return m_elasticTableFilename(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRAPreprocSettings::preprocParameterFilename() const -{ - return m_baseDir + "/tmp/pre_processing.json"; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRAPreprocSettings::outputBaseDirectory() const -{ - return m_baseDir(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RimFaultRAPreprocSettings::cleanBaseDirectory() const -{ - return m_cleanBaseDir(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimFaultRAPreprocSettings::setCleanBaseDirectory( bool clean ) -{ - m_cleanBaseDir = clean; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RimFaultRAPreprocSettings::smoothEclipseData() const -{ - return m_smoothEclipseData(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimFaultRAPreprocSettings::setGeoMechCase( RimGeoMechCase* geomechCase ) -{ - m_geomechCase = geomechCase; - if ( geomechCase ) m_endTimestepGeoMech = geomechCase->timeStepStrings().size() - 1; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimGeoMechCase* RimFaultRAPreprocSettings::geoMechCase() const -{ - return m_geomechCase(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimFaultRAPreprocSettings::setEclipseCase( RimEclipseResultCase* eclipseCase ) -{ - m_eclipseCase = eclipseCase; - if ( eclipseCase ) m_endTimestepEclipse = eclipseCase->timeStepStrings().size() - 1; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimEclipseCase* RimFaultRAPreprocSettings::eclipseCase() const -{ - return m_eclipseCase(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimFaultRAPreprocSettings::setOutputBaseDirectory( QString baseDir ) -{ - m_baseDir = baseDir; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRAPreprocSettings::outputEclipseFilename() const -{ - QString retval = outputEclipseDirectory(); - retval += QDir::separator(); - - QFileInfo fi( eclipseCaseFilename() ); - retval += fi.baseName() + "_RI.GRDECL"; - - return retval; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRAPreprocSettings::outputEclipseDirectory() const -{ - QString retval = m_baseDir; - retval += "/Eclipse"; - - return retval; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRAPreprocSettings::outputAbaqusDirectory() const -{ - QString retval = m_baseDir; - retval += "/Abaqus"; - - return retval; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QStringList RimFaultRAPreprocSettings::preprocParameterList() const -{ - QStringList retlist; - retlist << preprocParameterFilename(); - return retlist; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QStringList RimFaultRAPreprocSettings::macrisPrepareParameterList() const -{ - QStringList retlist; - - retlist << "prepare"; - - retlist << "-o"; - - retlist << outputEclipseDirectory(); - - if ( m_smoothEclipseData ) - { - retlist << "-ds"; - } - else - { - retlist << "-d"; - } - - retlist << m_eclipseCase()->gridFileName(); - - return retlist; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RimFaultRAPreprocSettings::geoMechSelected() const -{ - return m_geomechCase.value() != nullptr; -} diff --git a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRAPreprocSettings.h b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRAPreprocSettings.h deleted file mode 100644 index 743575dca7..0000000000 --- a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRAPreprocSettings.h +++ /dev/null @@ -1,96 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2021 Equinor ASA -// -// ResInsight 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 3 of the License, or -// (at your option) any later version. -// -// ResInsight 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 at -// for more details. -// -///////////////////////////////////////////////////////////////////////////////// -#pragma once - -#include "cafPdmField.h" -#include "cafPdmObject.h" -#include "cafPdmPtrField.h" - -class RimEclipseResultCase; -class RimEclipseCase; -class RimGeoMechCase; -class RimCase; - -class RimFaultRAPreprocSettings : public caf::PdmObject -{ - CAF_PDM_HEADER_INIT; - -public: - RimFaultRAPreprocSettings(); - ~RimFaultRAPreprocSettings() override; - - void setGeoMechCase( RimGeoMechCase* geomechCase ); - RimGeoMechCase* geoMechCase() const; - - void setEclipseCase( RimEclipseResultCase* eclipseCase ); - RimEclipseCase* eclipseCase() const; - - void setOutputBaseDirectory( QString baseDir ); - QString outputBaseDirectory() const; - - int startTimeStepGeoMechIndex() const; - QString startTimeStepGeoMech() const; - int endTimeStepGeoMechIndex() const; - QString endTimeStepGeoMech() const; - - int startTimeStepEclipseIndex() const; - QString startTimeStepEclipse() const; - int endTimeStepEclipseIndex() const; - QString endTimeStepEclipse() const; - - QString eclipseCaseFilename() const; - QString geomechCaseFilename() const; - bool smoothEclipseData() const; - QString elasticTableFilename() const; - - bool cleanBaseDirectory() const; - void setCleanBaseDirectory( bool clean ); - - bool geoMechSelected() const; - - QString preprocParameterFilename() const; - QString outputEclipseFilename() const; - QString outputEclipseDirectory() const; - - QString outputAbaqusDirectory() const; - - QStringList preprocParameterList() const; - QStringList macrisPrepareParameterList() const; - -protected: - void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; - void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; - void defineEditorAttribute( const caf::PdmFieldHandle* field, - QString uiConfigName, - caf::PdmUiEditorAttribute* attribute ) override; - - QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; - - RimCase* startCase() const; - - caf::PdmField m_startTimestepEclipse; - caf::PdmField m_endTimestepEclipse; - caf::PdmField m_startTimestepGeoMech; - caf::PdmField m_endTimestepGeoMech; - caf::PdmPtrField m_eclipseCase; - caf::PdmField m_smoothEclipseData; - caf::PdmPtrField m_geomechCase; - caf::PdmField m_baseDir; - caf::PdmField m_cleanBaseDir; - caf::PdmField m_elasticTableFilename; -}; diff --git a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRASettings.cpp b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRASettings.cpp deleted file mode 100644 index 9fb828c5c7..0000000000 --- a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRASettings.cpp +++ /dev/null @@ -1,627 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2021 - Equinor ASA -// -// ResInsight 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 3 of the License, or -// (at your option) any later version. -// -// ResInsight 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 at -// for more details. -// -///////////////////////////////////////////////////////////////////////////////// - -#include "RimFaultRASettings.h" -#include "RimFaultRAPreprocSettings.h" - -#include "RiaApplication.h" -#include "RiaPreferencesGeoMech.h" -#include "RimDoubleParameter.h" -#include "RimEclipseCase.h" -#include "RimEclipseInputCase.h" -#include "RimEclipseResultCase.h" -#include "RimGenericParameter.h" -#include "RimGeoMechCase.h" -#include "RimIntegerParameter.h" -#include "RimParameterGroup.h" -#include "RimProject.h" -#include "RimStringParameter.h" -#include "RimTools.h" - -#include "RifParameterXmlReader.h" - -#include "cafPdmFieldScriptingCapability.h" -#include "cafPdmObjectScriptingCapability.h" -#include "cafPdmUiComboBoxEditor.h" -#include "cafPdmUiFilePathEditor.h" -#include "cafPdmUiTableViewEditor.h" -#include "cafPdmUiTreeOrdering.h" - -#include - -#include - -CAF_PDM_SOURCE_INIT( RimFaultRASettings, "RimFaultRASettings" ); - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimFaultRASettings::RimFaultRASettings() -{ - CAF_PDM_InitObject( "Reactivation Assessment Settings", ":/fault_react_24x24.png" ); - - CAF_PDM_InitFieldNoDefault( &m_eclipseCase, "EclipseCase", "Eclipse Case" ); - m_eclipseCase.uiCapability()->setUiReadOnly( true ); - - CAF_PDM_InitFieldNoDefault( &m_geomechCase, "GeomechCase", "GeoMech Case" ); - m_geomechCase.uiCapability()->setUiReadOnly( true ); - - CAF_PDM_InitFieldNoDefault( &m_eclipseFRAGeneratedCase, "EclipseFRACase", "Eclipse FRA Case" ); - m_eclipseFRAGeneratedCase.uiCapability()->setUiReadOnly( true ); - - CAF_PDM_InitFieldNoDefault( &m_baseDir, "BaseDir", "Working Directory" ); - m_baseDir.uiCapability()->setUiReadOnly( true ); - - CAF_PDM_InitField( &m_elasticTableFilename, "ElasticTableFilename", QString( "" ), "Elastic Table" ); - m_elasticTableFilename.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); - m_elasticTableFilename.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP ); - - CAF_PDM_InitField( &m_startTimestepEclipse, "StartTimeStepEclipse", 0, "Start Time Step" ); - m_startTimestepEclipse.uiCapability()->setUiEditorTypeName( caf::PdmUiComboBoxEditor::uiEditorTypeName() ); - CAF_PDM_InitField( &m_endTimestepEclipse, "EndTimeStepEclipse", 0, "End Time Step" ); - m_endTimestepEclipse.uiCapability()->setUiEditorTypeName( caf::PdmUiComboBoxEditor::uiEditorTypeName() ); - - CAF_PDM_InitField( &m_startTimestepGeoMech, "StartTimeStepGeoMech", 0, "Start Time Step" ); - m_startTimestepGeoMech.uiCapability()->setUiEditorTypeName( caf::PdmUiComboBoxEditor::uiEditorTypeName() ); - m_startTimestepGeoMech.uiCapability()->setUiReadOnly( true ); - CAF_PDM_InitField( &m_endTimestepGeoMech, "EndTimeStepGeoMech", 0, "End Time Step" ); - m_endTimestepGeoMech.uiCapability()->setUiEditorTypeName( caf::PdmUiComboBoxEditor::uiEditorTypeName() ); - m_endTimestepGeoMech.uiCapability()->setUiReadOnly( true ); - - CAF_PDM_InitFieldNoDefault( &m_basicParameters, "BasicParameters", "Basic Processing Parameters", ":/Bullet.png" ); - CAF_PDM_InitFieldNoDefault( &m_advancedParameters, "AdvancedParameters", "Advanced Processing Parameters", ":/Bullet.png" ); - - CAF_PDM_InitFieldNoDefault( &m_basicParametersRI, "BasicParametersRI", "Basic ResInsight Parameters" ); - CAF_PDM_InitFieldNoDefault( &m_advancedParametersRI, "AdvancedParametersRI", "Advanced ResInsight Parameters" ); - - setupResInsightParameters(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimFaultRASettings::~RimFaultRASettings() -{ -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QList RimFaultRASettings::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) -{ - QList options; - - if ( fieldNeedingOptions == &m_eclipseCase ) - { - RimTools::eclipseCaseOptionItems( &options ); - } - else if ( fieldNeedingOptions == &m_geomechCase ) - { - RimTools::geoMechCaseOptionItems( &options ); - } - - if ( m_geomechCase() ) - { - if ( fieldNeedingOptions == &m_startTimestepGeoMech ) - { - RimTools::timeStepsForCase( m_geomechCase, &options ); - } - else if ( fieldNeedingOptions == &m_endTimestepGeoMech ) - { - RimTools::timeStepsForCase( m_geomechCase, &options ); - } - } - - if ( m_eclipseCase() ) - { - if ( fieldNeedingOptions == &m_startTimestepEclipse ) - { - RimTools::timeStepsForCase( m_eclipseCase(), &options ); - } - else if ( fieldNeedingOptions == &m_endTimestepEclipse ) - { - RimTools::timeStepsForCase( m_eclipseCase(), &options ); - } - } - - return options; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimFaultRASettings::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) -{ - uiOrdering.add( &m_baseDir ); - auto eclipseGroup = uiOrdering.addNewGroup( "Eclipse Time Steps" ); - eclipseGroup->add( &m_startTimestepEclipse ); - eclipseGroup->add( &m_endTimestepEclipse ); - - if ( m_geomechCase() != nullptr ) - { - auto geomechGroup = uiOrdering.addNewGroup( "GeoMech Time Steps" ); - geomechGroup->add( &m_startTimestepGeoMech ); - geomechGroup->add( &m_endTimestepGeoMech ); - - auto tableGroup = uiOrdering.addNewGroup( "Additional Settings" ); - tableGroup->add( &m_elasticTableFilename ); - } - uiOrdering.skipRemainingFields( true ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimFaultRASettings::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName ) -{ - uiTreeOrdering.add( &m_basicParameters ); - uiTreeOrdering.add( &m_advancedParameters ); - uiTreeOrdering.skipRemainingChildren(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRASettings::eclipseCaseFilename() const -{ - if ( m_eclipseCase ) return m_eclipseCase->gridFileName(); - return ""; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimEclipseCase* RimFaultRASettings::eclipseCase() const -{ - return m_eclipseCase; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimEclipseInputCase* RimFaultRASettings::eclipseFRAGeneratedCase() const -{ - return m_eclipseFRAGeneratedCase; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRASettings::geomechCaseFilename() const -{ - if ( m_geomechCase ) return m_geomechCase->gridFileName(); - return ""; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRASettings::geomechCaseName() const -{ - QFileInfo fi( geomechCaseFilename() ); - return fi.baseName(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimGeoMechCase* RimFaultRASettings::geomechCase() const -{ - return m_geomechCase; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRASettings::outputBaseDirectory() const -{ - return m_baseDir(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimFaultRASettings::setGeoMechCase( RimGeoMechCase* geomechCase ) -{ - m_geomechCase = geomechCase; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimFaultRASettings::setOutputBaseDirectory( QString baseDir ) -{ - m_baseDir = baseDir; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimFaultRASettings::initFromPreprocSettings( RimFaultRAPreprocSettings* preprocSettings, - RimEclipseInputCase* eclipseCase ) -{ - m_geomechCase = preprocSettings->geoMechCase(); - m_eclipseCase = preprocSettings->eclipseCase(); - m_eclipseFRAGeneratedCase = eclipseCase; - m_baseDir = preprocSettings->outputBaseDirectory(); - m_startTimestepEclipse = preprocSettings->startTimeStepEclipseIndex(); - m_endTimestepEclipse = preprocSettings->endTimeStepEclipseIndex(); - m_startTimestepGeoMech = preprocSettings->startTimeStepGeoMechIndex(); - m_endTimestepGeoMech = preprocSettings->endTimeStepGeoMechIndex(); - m_elasticTableFilename = preprocSettings->elasticTableFilename(); - - QString errorText; - - RifParameterXmlReader basicreader( RiaPreferencesGeoMech::current()->geomechFRADefaultBasicXML() ); - if ( !basicreader.parseFile( errorText ) ) return; - - m_basicParameters.deleteChildren(); - for ( auto group : basicreader.parameterGroups() ) - { - m_basicParameters.push_back( group ); - } - - if ( geomechCase() != nullptr ) - { - RifParameterXmlReader advreader( RiaPreferencesGeoMech::current()->geomechFRADefaultAdvXML() ); - if ( !advreader.parseFile( errorText ) ) return; - - m_advancedParameters.deleteChildren(); - for ( auto group : advreader.parameterGroups() ) - { - m_advancedParameters.push_back( group ); - } - } -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -int RimFaultRASettings::startTimeStepEclipseIndex() const -{ - return m_startTimestepEclipse(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRASettings::startTimeStepEclipse() const -{ - if ( m_eclipseCase() ) - { - if ( ( m_startTimestepEclipse >= 0 ) && ( m_startTimestepEclipse <= m_eclipseCase->timeStepStrings().size() ) ) - return m_eclipseCase->timeStepStrings()[m_startTimestepEclipse]; - } - return ""; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -int RimFaultRASettings::endTimeStepEclipseIndex() const -{ - return m_endTimestepEclipse(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRASettings::endTimeStepEclipse() const -{ - if ( m_eclipseCase() ) - { - if ( ( m_endTimestepEclipse >= 0 ) && ( m_endTimestepEclipse <= m_eclipseCase->timeStepStrings().size() ) ) - return m_eclipseCase->timeStepStrings()[m_endTimestepEclipse]; - } - return ""; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -int RimFaultRASettings::startTimeStepGeoMechIndex() const -{ - return m_startTimestepGeoMech(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRASettings::startTimeStepGeoMech() const -{ - if ( m_geomechCase() ) - { - if ( ( m_startTimestepGeoMech >= 0 ) && ( m_startTimestepGeoMech <= m_geomechCase->timeStepStrings().size() ) ) - return m_geomechCase->timeStepStrings()[m_startTimestepGeoMech]; - } - return ""; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -int RimFaultRASettings::endTimeStepGeoMechIndex() const -{ - return m_endTimestepGeoMech(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRASettings::endTimeStepGeoMech() const -{ - if ( m_geomechCase() ) - { - if ( ( m_endTimestepGeoMech >= 0 ) && ( m_endTimestepGeoMech <= m_geomechCase->timeStepStrings().size() ) ) - return m_geomechCase->timeStepStrings()[m_endTimestepGeoMech]; - } - return ""; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimFaultRASettings::setEclipseTimeStepIndexes( int start, int stop ) -{ - m_startTimestepEclipse = start; - m_endTimestepEclipse = stop; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimFaultRASettings::setGeomechTimeStepIndexes( int start, int stop ) -{ - m_startTimestepGeoMech = start; - m_endTimestepGeoMech = stop; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -std::list RimFaultRASettings::basicParameters( int faultID ) -{ - m_basicParametersRI->setParameterValue( "eclipse_input_grid", eclipseCaseFilename() ); - m_basicParametersRI->setParameterValue( "faultid", faultID ); - - std::list retlist; - - for ( auto& p : m_basicParametersRI->parameters() ) - { - retlist.push_back( p ); - } - - for ( auto& group : m_basicParameters.children() ) - { - for ( auto& p : group->parameters() ) - { - retlist.push_back( p ); - } - } - - return retlist; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -std::list RimFaultRASettings::advancedParameters( int faultID ) -{ - bool advanced = true; - m_advancedParametersRI->setParameterValue( "eclipse_loadstep_start", loadStepStart( advanced ) ); - m_advancedParametersRI->setParameterValue( "eclipse_loadstep_end", loadStepEnd() ); - m_advancedParametersRI->setParameterValue( "faultid_calibration", faultID ); - m_advancedParametersRI->setParameterValue( "abaqus_elastic_properties", elasticPropertiesFilename() ); - m_advancedParametersRI->setParameterValue( "abaqus_stress_start", stressStartFilename() ); - m_advancedParametersRI->setParameterValue( "abaqus_stress_end", stressEndFilename() ); - - std::list retlist; - - for ( auto& p : m_advancedParametersRI->parameters() ) - { - retlist.push_back( p ); - } - - for ( auto& group : m_advancedParameters.children() ) - { - for ( auto& p : group->parameters() ) - { - retlist.push_back( p ); - } - } - - return retlist; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimFaultRASettings::setupResInsightParameters() -{ - m_basicParametersRI = new RimParameterGroup(); - m_basicParametersRI->setName( "ResInsight Basic" ); - m_basicParametersRI->addParameter( "eclipse_input_grid", "" ); - m_basicParametersRI->addParameter( "faultid", -1 ); - - m_advancedParametersRI = new RimParameterGroup(); - m_advancedParametersRI->setName( "ResInsight Advanced" ); - m_advancedParametersRI->addParameter( "abaqus_elastic_properties", "" ); - m_advancedParametersRI->addParameter( "abaqus_stress_start", "" ); - m_advancedParametersRI->addParameter( "abaqus_stress_end", "" ); - m_advancedParametersRI->addParameter( "faultid_calibration", -1 ); - m_advancedParametersRI->addParameter( "eclipse_loadstep_start", "" ); - m_advancedParametersRI->addParameter( "eclipse_loadstep_end", "" ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRASettings::elasticPropertiesFilename() const -{ - return m_elasticTableFilename; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRASettings::stressStartFilename() const -{ - QString filename = QString( "/%1/%2_%3_stress.rpt" ).arg( "Abaqus", geomechCaseName(), startTimeStepGeoMech() ); - return m_baseDir + filename; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRASettings::stressEndFilename() const -{ - QString filename = QString( "/%1/%2_%3_stress.rpt" ).arg( "Abaqus", geomechCaseName(), endTimeStepGeoMech() ); - return m_baseDir + filename; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRASettings::basicMacrisDatabase() const -{ - return m_baseDir + "/MacrisCalcResult.sqlite3"; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRASettings::advancedMacrisDatabase() const -{ - return m_baseDir + "/MacrisCalcCalibration.sqlite3"; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -int RimFaultRASettings::timeStepDigits() const -{ - if ( m_eclipseCase == nullptr ) return 1; - - int timesteps = m_eclipseCase->timeStepStrings().size(); - if ( timesteps <= 0 ) return 1; - - return 1 + (int)( std::log10( 1.0 * timesteps ) ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRASettings::loadStepStart( bool advanced /* = false */ ) const -{ - int startStep = 0; - if ( !advanced ) startStep = startTimeStepEclipseIndex(); - - QString retval = QString( "PRESSURE_%1" ).arg( startStep, timeStepDigits(), 10, QChar( '0' ) ); - return retval; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRASettings::loadStepEnd() const -{ - QString retval = QString( "PRESSURE_%1" ).arg( endTimeStepEclipseIndex(), timeStepDigits(), 10, QChar( '0' ) ); - return retval; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRASettings::basicParameterXMLFilename( int faultID ) const -{ - QString retval = m_baseDir; - retval += QString( "/tmp/calculate_%1.xml" ).arg( faultID, 3, 10, QChar( '0' ) ); - return retval; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRASettings::advancedParameterXMLFilename( int faultID ) const -{ - QString retval = m_baseDir; - retval += QString( "/tmp/calibrate_%1.xml" ).arg( faultID, 3, 10, QChar( '0' ) ); - return retval; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QStringList RimFaultRASettings::basicMacrisParameters( int faultID ) const -{ - QStringList retlist; - - retlist << "calculate"; - retlist << basicParameterXMLFilename( faultID ); - retlist << m_baseDir(); - retlist << "-i"; - retlist << loadStepStart(); - retlist << loadStepEnd(); - - return retlist; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QStringList RimFaultRASettings::advancedMacrisParameters( int faultID ) const -{ - QStringList retlist; - - retlist << "calibrate"; - retlist << basicParameterXMLFilename( faultID ); - retlist << advancedParameterXMLFilename( faultID ); - retlist << m_baseDir(); - - return retlist; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RimFaultRASettings::tsurfOutputDirectory() const -{ - return m_baseDir + "/tsurf"; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimGenericParameter* RimFaultRASettings::getInputParameter( QString name ) const -{ - RimGenericParameter* retval = nullptr; - - for ( auto group : m_basicParameters.children() ) - { - retval = group->parameter( name ); - if ( retval != nullptr ) return retval; - } - - for ( auto group : m_advancedParameters.children() ) - { - retval = group->parameter( name ); - if ( retval != nullptr ) return retval; - } - - return retval; -} diff --git a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRASettings.h b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRASettings.h deleted file mode 100644 index 0dd279581f..0000000000 --- a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRASettings.h +++ /dev/null @@ -1,118 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2021 Equinor ASA -// -// ResInsight 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 3 of the License, or -// (at your option) any later version. -// -// ResInsight 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 at -// for more details. -// -///////////////////////////////////////////////////////////////////////////////// -#pragma once - -#include "cafPdmChildArrayField.h" -#include "cafPdmChildField.h" -#include "cafPdmField.h" -#include "cafPdmObject.h" -#include "cafPdmPtrField.h" - -#include -#include - -class RimEclipseInputCase; -class RimEclipseCase; -class RimGeoMechCase; -class RimParameterGroup; -class RimFaultRAPreprocSettings; -class RimGenericParameter; - -class RimFaultRASettings : public caf::PdmObject -{ - CAF_PDM_HEADER_INIT; - -public: - RimFaultRASettings(); - ~RimFaultRASettings() override; - - void initFromPreprocSettings( RimFaultRAPreprocSettings* preprocsettings, RimEclipseInputCase* eclipseCase ); - - void setGeoMechCase( RimGeoMechCase* geomechCase ); - RimGeoMechCase* geomechCase() const; - QString geomechCaseFilename() const; - QString geomechCaseName() const; - - RimEclipseInputCase* eclipseFRAGeneratedCase() const; - RimEclipseCase* eclipseCase() const; - QString eclipseCaseFilename() const; - - void setOutputBaseDirectory( QString baseDir ); - QString outputBaseDirectory() const; - - int startTimeStepGeoMechIndex() const; - QString startTimeStepGeoMech() const; - int endTimeStepGeoMechIndex() const; - QString endTimeStepGeoMech() const; - - void setEclipseTimeStepIndexes( int start, int stop ); - void setGeomechTimeStepIndexes( int start, int stop ); - - int startTimeStepEclipseIndex() const; - QString startTimeStepEclipse() const; - QString loadStepStart( bool advanced = false ) const; - int endTimeStepEclipseIndex() const; - QString endTimeStepEclipse() const; - QString loadStepEnd() const; - - std::list basicParameters( int faultID ); - std::list advancedParameters( int faultID ); - - QString elasticPropertiesFilename() const; - QString stressStartFilename() const; - QString stressEndFilename() const; - QString basicMacrisDatabase() const; - QString advancedMacrisDatabase() const; - - QString basicParameterXMLFilename( int faultID ) const; - QString advancedParameterXMLFilename( int faultID ) const; - - QStringList basicMacrisParameters( int faultID ) const; - QStringList advancedMacrisParameters( int faultID ) const; - - QString tsurfOutputDirectory() const; - - RimGenericParameter* getInputParameter( QString name ) const; - -protected: - void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; - void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName ) override; - - QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; - -private: - void setupResInsightParameters(); - int timeStepDigits() const; - -private: - caf::PdmPtrField m_eclipseFRAGeneratedCase; - caf::PdmPtrField m_eclipseCase; - caf::PdmPtrField m_geomechCase; - caf::PdmField m_baseDir; - caf::PdmField m_elasticTableFilename; - - caf::PdmField m_startTimestepEclipse; - caf::PdmField m_endTimestepEclipse; - caf::PdmField m_startTimestepGeoMech; - caf::PdmField m_endTimestepGeoMech; - - caf::PdmChildArrayField m_basicParameters; - caf::PdmChildArrayField m_advancedParameters; - caf::PdmChildField m_basicParametersRI; - caf::PdmChildField m_advancedParametersRI; -}; diff --git a/ApplicationLibCode/ProjectDataModel/Flow/RimWellAllocationPlot.cpp b/ApplicationLibCode/ProjectDataModel/Flow/RimWellAllocationPlot.cpp index 910025fc58..d50fc91a68 100644 --- a/ApplicationLibCode/ProjectDataModel/Flow/RimWellAllocationPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/Flow/RimWellAllocationPlot.cpp @@ -18,6 +18,7 @@ #include "RimWellAllocationPlot.h" +#include "RiaNumericalTools.h" #include "RiaPreferences.h" #include "RigAccWellFlowCalculator.h" @@ -234,10 +235,9 @@ void RimWellAllocationPlot::updateFromWell() if ( m_flowType() == ACCUMULATED ) description = "Accumulated Flow"; if ( m_flowType() == INFLOW ) description = "Inflow Rates"; - RimWellLogPlotNameConfig* nameConfig = accumulatedWellFlowPlot()->nameConfig(); - nameConfig->setCustomName( description ); - nameConfig->setAutoNameTags( false, true, false, false, false ); - nameConfig->setFieldVisibility( true, true, true, false, false ); + accumulatedWellFlowPlot()->setNameTemplateText( description + " " + RiaDefines::namingVariableWell() ); + accumulatedWellFlowPlot()->setNamingMethod( RiaDefines::ObjectNamingMethod::TEMPLATE ); + accumulatedWellFlowPlot()->updateAutoName(); if ( !m_case ) return; @@ -375,9 +375,7 @@ void RimWellAllocationPlot::updateFromWell() double depthSpan = 0.1 * cvf::Math::abs( availableMinDepth - availableMaxDepth ); // Round off value to floored decade - double logDecValue = log10( depthSpan ); - logDecValue = cvf::Math::floor( logDecValue ); - depthSpan = pow( 10.0, logDecValue ); + depthSpan = RiaNumericalTools::roundToClosestPowerOfTenFloor( depthSpan ); double dummyNegativeDepthValue = curveDepthValues.back() - depthSpan; diff --git a/ApplicationLibCode/ProjectDataModel/Flow/RimWellPltPlot.cpp b/ApplicationLibCode/ProjectDataModel/Flow/RimWellPltPlot.cpp index 686341a276..a465c203de 100644 --- a/ApplicationLibCode/ProjectDataModel/Flow/RimWellPltPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/Flow/RimWellPltPlot.cpp @@ -52,6 +52,7 @@ #include "RimWellLogFileCurve.h" #include "RimWellLogPlot.h" #include "RimWellLogPlotCollection.h" +#include "RimWellLogPlotNameConfig.h" #include "RimWellLogRftCurve.h" #include "RimWellLogTrack.h" #include "RimWellPath.h" @@ -130,6 +131,7 @@ RimWellPltPlot::RimWellPltPlot() m_phases.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN ); m_nameConfig->setCustomName( "PLT Plot" ); + setNamingMethod( RiaDefines::ObjectNamingMethod::CUSTOM ); this->setAsPlotMdiWindow(); m_doInitAfterLoad = false; @@ -973,14 +975,15 @@ void RimWellPltPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& if ( track ) { track->uiOrderingForRftPltFormations( uiOrdering ); - track->uiOrderingForXAxisSettings( uiOrdering ); + track->uiOrderingForPropertyAxisSettings( uiOrdering ); caf::PdmUiGroup* depthGroup = uiOrdering.addNewGroup( "Depth Axis Settings" ); uiOrderingForDepthAxis( uiConfigName, *depthGroup ); - caf::PdmUiGroup* plotLayoutGroup = uiOrdering.addNewGroup( "Plot Layout" ); - plotLayoutGroup->setCollapsedByDefault(); - RimWellLogPlot::uiOrderingForAutoName( uiConfigName, *plotLayoutGroup ); - RimWellLogPlot::uiOrderingForPlotLayout( uiConfigName, *plotLayoutGroup ); + caf::PdmUiGroup* nameGroup = uiOrdering.addNewGroup( "Plot Name" ); + nameGroup->setCollapsedByDefault(); + RimWellLogPlot::uiOrderingForAutoName( uiConfigName, *nameGroup ); + + RimPlotWindow::uiOrderingForLegendsAndFonts( uiConfigName, uiOrdering ); } } diff --git a/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.cpp b/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.cpp index e43294fbbb..fab0959bc4 100644 --- a/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.cpp +++ b/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.cpp @@ -17,9 +17,11 @@ ///////////////////////////////////////////////////////////////////////////////// #include "RimWellRftEnsembleCurveSet.h" + #include "RimEnsembleCurveSetColorManager.h" #include "RimRegularLegendConfig.h" #include "RimSummaryCase.h" +#include "RimSummaryCaseCollection.h" #include "RimWellRftPlot.h" #include "RiuQwtPlotWidget.h" diff --git a/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.h b/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.h index 51d2ac6647..1df8bf8963 100644 --- a/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.h +++ b/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.h @@ -19,7 +19,6 @@ #pragma once #include "RimEnsembleCurveSetColorManager.h" -#include "RimSummaryCaseCollection.h" #include "RigEnsembleParameter.h" @@ -32,6 +31,7 @@ #include class RiuCvfOverlayItemWidget; +class RimSummaryCaseCollection; class RimWellRftEnsembleCurveSet : public caf::PdmObject { diff --git a/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftPlot.cpp b/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftPlot.cpp index 34b2c43dac..c0404b0993 100644 --- a/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftPlot.cpp @@ -47,6 +47,7 @@ #include "RimWellLogFileChannel.h" #include "RimWellLogFileCurve.h" #include "RimWellLogPlot.h" +#include "RimWellLogPlotNameConfig.h" #include "RimWellLogRftCurve.h" #include "RimWellLogTrack.h" #include "RimWellPath.h" @@ -129,6 +130,8 @@ RimWellRftPlot::RimWellRftPlot() setAvailableDepthTypes( { RiaDefines::DepthTypeEnum::MEASURED_DEPTH, RiaDefines::DepthTypeEnum::TRUE_VERTICAL_DEPTH } ); m_nameConfig->setCustomName( "RFT Plot" ); + setNamingMethod( RiaDefines::ObjectNamingMethod::CUSTOM ); + m_plotLegendsHorizontal = false; setPlotTitleVisible( true ); @@ -971,14 +974,14 @@ void RimWellRftPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& if ( track ) { track->uiOrderingForRftPltFormations( uiOrdering ); - track->uiOrderingForXAxisSettings( uiOrdering ); + track->uiOrderingForPropertyAxisSettings( uiOrdering ); caf::PdmUiGroup* depthGroup = uiOrdering.addNewGroup( "Depth Axis Settings" ); uiOrderingForDepthAxis( uiConfigName, *depthGroup ); caf::PdmUiGroup* plotLayoutGroup = uiOrdering.addNewGroup( "Plot Layout" ); plotLayoutGroup->setCollapsedByDefault(); RimWellLogPlot::uiOrderingForAutoName( uiConfigName, *plotLayoutGroup ); - RimWellLogPlot::uiOrderingForPlotLayout( uiConfigName, *plotLayoutGroup ); + RimPlotWindow::uiOrderingForLegendsAndFonts( uiConfigName, uiOrdering ); plotLayoutGroup->add( &m_depthOrientation ); } } diff --git a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechContourMapView.cpp b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechContourMapView.cpp index bcf3feaf23..1420fc92b8 100644 --- a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechContourMapView.cpp +++ b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechContourMapView.cpp @@ -83,6 +83,14 @@ RimGeoMechContourMapProjection* RimGeoMechContourMapView::contourMapProjection() return m_contourMapProjection().p(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaDefines::View3dContent RimGeoMechContourMapView::viewContent() const +{ + return ( RiaDefines::View3dContent::GEOMECH_DATA & RiaDefines::View3dContent::CONTOUR ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechContourMapView.h b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechContourMapView.h index 0e452a687c..d763a99b03 100644 --- a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechContourMapView.h +++ b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechContourMapView.h @@ -36,6 +36,8 @@ class RimGeoMechContourMapView : public RimGeoMechView RimGeoMechContourMapView(); RimGeoMechContourMapProjection* contourMapProjection() const; + RiaDefines::View3dContent viewContent() const override; + QString createAutoName() const override; void setDefaultCustomName(); void updatePickPointAndRedraw(); diff --git a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechView.cpp b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechView.cpp index dc0b729851..7b441c5379 100644 --- a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechView.cpp +++ b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechView.cpp @@ -130,6 +130,14 @@ RimGeoMechView::~RimGeoMechView( void ) delete m_propertyFilterCollection; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaDefines::View3dContent RimGeoMechView::viewContent() const +{ + return RiaDefines::View3dContent::GEOMECH_DATA; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -801,7 +809,7 @@ void RimGeoMechView::onClampCurrentTimestep() //-------------------------------------------------------------------------------------------------- size_t RimGeoMechView::onTimeStepCountRequested() { - if ( m_geomechCase ) + if ( m_geomechCase && m_geomechCase->geoMechData() && m_geomechCase->geoMechData()->femPartResults() ) { return m_geomechCase->geoMechData()->femPartResults()->frameCount(); } diff --git a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechView.h b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechView.h index 1e63cd01a6..941ca92b33 100644 --- a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechView.h +++ b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechView.h @@ -66,6 +66,8 @@ class RimGeoMechView : public RimGridView RimGeoMechView( void ); ~RimGeoMechView( void ) override; + RiaDefines::View3dContent viewContent() const override; + void setGeoMechCase( RimGeoMechCase* gmCase ); RimGeoMechCase* geoMechCase() const; RimCase* ownerCase() const override; diff --git a/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp b/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp index 4e344e9cdd..465623ba4e 100644 --- a/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp @@ -517,7 +517,7 @@ void RimGridCrossPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrderin if ( isMdiWindow() ) { - RimPlotWindow::uiOrderingForPlotLayout( uiConfigName, *generalGroup ); + RimPlotWindow::uiOrderingForLegendsAndFonts( uiConfigName, uiOrdering ); } else { diff --git a/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCurve.cpp b/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCurve.cpp index 6c079924c3..a0070c8bbf 100644 --- a/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCurve.cpp @@ -134,7 +134,7 @@ void RimGridCrossPlotCurve::updateZoomInParentPlot() //-------------------------------------------------------------------------------------------------- QString RimGridCrossPlotCurve::createCurveAutoName() { - return m_customCurveName; + return m_curveName; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Intersections/RimExtrudedCurveIntersection.cpp b/ApplicationLibCode/ProjectDataModel/Intersections/RimExtrudedCurveIntersection.cpp index 76d81eef2b..98b7428b99 100644 --- a/ApplicationLibCode/ProjectDataModel/Intersections/RimExtrudedCurveIntersection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Intersections/RimExtrudedCurveIntersection.cpp @@ -729,7 +729,7 @@ std::vector> RimExtrudedCurveIntersection::polyLines( cv lines.push_back( wellPath()->wellPathGeometry()->wellPathPoints() ); RimCase* ownerCase = nullptr; this->firstAncestorOrThisOfType( ownerCase ); - if ( ownerCase ) + if ( ownerCase && ownerCase->activeCellsBoundingBox().isValid() ) { size_t dummy; lines[0] = RigWellPath::clipPolylineStartAboveZ( lines[0], diff --git a/ApplicationLibCode/ProjectDataModel/ProcessControl/RimProcess.cpp b/ApplicationLibCode/ProjectDataModel/ProcessControl/RimProcess.cpp index 815ead8a87..b1f79aecd1 100644 --- a/ApplicationLibCode/ProjectDataModel/ProcessControl/RimProcess.cpp +++ b/ApplicationLibCode/ProjectDataModel/ProcessControl/RimProcess.cpp @@ -29,6 +29,9 @@ #ifdef _MSC_VER #pragma warning( disable : 4996 ) #endif +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif CAF_PDM_SOURCE_INIT( RimProcess, "RimProcess" ); @@ -146,7 +149,6 @@ bool RimProcess::execute() QObject::connect( proc, SIGNAL( started() ), m_monitor, SLOT( started() ) ); bool retval = false; - proc->start( cmd ); if ( proc->waitForStarted( -1 ) ) { diff --git a/ApplicationLibCode/ProjectDataModel/RiaOpmParserTools.cpp b/ApplicationLibCode/ProjectDataModel/RiaOpmParserTools.cpp index bada06f166..cbb5c32a6c 100644 --- a/ApplicationLibCode/ProjectDataModel/RiaOpmParserTools.cpp +++ b/ApplicationLibCode/ProjectDataModel/RiaOpmParserTools.cpp @@ -24,6 +24,8 @@ #include "opm/input/eclipse/Deck/Deck.hpp" #include "opm/input/eclipse/Parser/ParseContext.hpp" #include "opm/input/eclipse/Parser/Parser.hpp" +#include "opm/input/eclipse/Parser/ParserKeywords/I.hpp" +#include "opm/input/eclipse/Parser/ParserKeywords/P.hpp" #include "opm/input/eclipse/Parser/ParserKeywords/V.hpp" #include "opm/input/eclipse/Parser/ParserKeywords/W.hpp" @@ -129,10 +131,15 @@ std::map>> RiaOpmParserTools::extra { if ( !std::filesystem::exists( filename ) ) return {}; - Opm::Parser parser( false ); + Opm::Parser parser( false ); + const Opm::ParserKeywords::WSEGLINK kw1; + const Opm::ParserKeywords::INCLUDE kw2; + const Opm::ParserKeywords::PATHS kw3; parser.addParserKeyword( kw1 ); + parser.addParserKeyword( kw2 ); + parser.addParserKeyword( kw3 ); std::stringstream ss; Opm::ParseContext parseContext( Opm::InputError::Action::WARN ); diff --git a/ApplicationLibCode/ProjectDataModel/Rim2dIntersectionView.cpp b/ApplicationLibCode/ProjectDataModel/Rim2dIntersectionView.cpp index cd904fcbc3..5c237c51b6 100644 --- a/ApplicationLibCode/ProjectDataModel/Rim2dIntersectionView.cpp +++ b/ApplicationLibCode/ProjectDataModel/Rim2dIntersectionView.cpp @@ -31,6 +31,8 @@ #include "RimRegularLegendConfig.h" #include "RimSimWellInView.h" #include "RimTernaryLegendConfig.h" +#include "RimViewController.h" +#include "RimViewLinker.h" #include "RimViewNameConfig.h" #include "RimWellPath.h" @@ -101,8 +103,6 @@ Rim2dIntersectionView::Rim2dIntersectionView( void ) nameConfig()->hideAggregationTypeField( true ); nameConfig()->hidePropertyField( true ); nameConfig()->hideSampleSpacingField( true ); - - hideComparisonViewField(); } //-------------------------------------------------------------------------------------------------- @@ -112,6 +112,14 @@ Rim2dIntersectionView::~Rim2dIntersectionView( void ) { } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaDefines::View3dContent Rim2dIntersectionView::viewContent() const +{ + return RiaDefines::View3dContent::FLAT_INTERSECTION; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -206,7 +214,7 @@ bool Rim2dIntersectionView::isTimeStepDependentDataVisible() const //-------------------------------------------------------------------------------------------------- void Rim2dIntersectionView::update3dInfo() { - if ( !nativeOrOverrideViewer() ) return; + if ( !nativeOrOverrideViewer() || !m_intersection ) return; QString overlayInfoText; @@ -427,16 +435,6 @@ bool Rim2dIntersectionView::handleOverlayItemPicked( const cvf::OverlayItem* pic return false; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QList Rim2dIntersectionView::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) -{ - QList options; - - return options; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -592,11 +590,13 @@ void Rim2dIntersectionView::onCreateDisplayModel() m_intersectionVizModel->updateBoundingBoxesRecursive(); - if ( viewer() ) viewer()->setCurrentFrame( m_currentTimeStep ); - - if ( this->viewer()->mainCamera()->viewMatrix() == sm_defaultViewMatrix ) + if ( viewer() ) { - this->zoomAll(); + viewer()->setCurrentFrame( m_currentTimeStep ); + if ( viewer()->mainCamera() && viewer()->mainCamera()->viewMatrix() == sm_defaultViewMatrix ) + { + this->zoomAll(); + } } } @@ -605,6 +605,8 @@ void Rim2dIntersectionView::onCreateDisplayModel() //-------------------------------------------------------------------------------------------------- void Rim2dIntersectionView::onUpdateDisplayModelForCurrentTimeStep() { + if ( !m_intersection ) return; + update3dInfo(); onUpdateLegends(); @@ -664,7 +666,7 @@ void Rim2dIntersectionView::onUpdateDisplayModelForCurrentTimeStep() } } - if ( this->hasResults() ) + if ( m_flatIntersectionPartMgr.notNull() && this->hasResults() ) { m_flatIntersectionPartMgr->updateCellResultColor( m_currentTimeStep, m_legendConfig->scalarMapper(), @@ -682,7 +684,7 @@ void Rim2dIntersectionView::onUpdateLegends() { m_legendObjectToSelect = nullptr; - if ( !nativeOrOverrideViewer() ) return; + if ( !nativeOrOverrideViewer() || !m_intersection ) return; nativeOrOverrideViewer()->removeAllColorLegends(); @@ -877,7 +879,7 @@ void Rim2dIntersectionView::defineUiOrdering( QString uiConfigName, caf::PdmUiOr uiOrdering.skipRemainingFields( true ); - if ( m_intersection->hasDefiningPoints() ) + if ( m_intersection && m_intersection->hasDefiningPoints() ) { caf::PdmUiGroup* plGroup = uiOrdering.addNewGroup( "Defining Points" ); plGroup->add( &m_showDefiningPoints ); diff --git a/ApplicationLibCode/ProjectDataModel/Rim2dIntersectionView.h b/ApplicationLibCode/ProjectDataModel/Rim2dIntersectionView.h index 8270fdd021..435b08a247 100644 --- a/ApplicationLibCode/ProjectDataModel/Rim2dIntersectionView.h +++ b/ApplicationLibCode/ProjectDataModel/Rim2dIntersectionView.h @@ -48,6 +48,8 @@ class Rim2dIntersectionView : public Rim3dView Rim2dIntersectionView( void ); ~Rim2dIntersectionView( void ) override; + RiaDefines::View3dContent viewContent() const override; + void setVisible( bool isVisible ); void setIntersection( RimExtrudedCurveIntersection* intersection ); RimExtrudedCurveIntersection* intersection() const; @@ -57,9 +59,6 @@ class Rim2dIntersectionView : public Rim3dView RimCase* ownerCase() const override; void selectOverlayInfoConfig() override {} - RimViewLinker* assosiatedViewLinker() const override { return nullptr; } - RimViewController* viewController() const override { return nullptr; } - bool isTimeStepDependentDataVisible() const override; void update3dInfo(); @@ -94,7 +93,6 @@ class Rim2dIntersectionView : public Rim3dView void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "" ) override; - QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; bool hasResults(); diff --git a/ApplicationLibCode/ProjectDataModel/Rim3dView.cpp b/ApplicationLibCode/ProjectDataModel/Rim3dView.cpp index 2230f21b7e..b21d690564 100644 --- a/ApplicationLibCode/ProjectDataModel/Rim3dView.cpp +++ b/ApplicationLibCode/ProjectDataModel/Rim3dView.cpp @@ -40,6 +40,7 @@ #include "RimTools.h" #include "RimViewController.h" #include "RimViewLinker.h" +#include "RimViewLinkerCollection.h" #include "RimViewManipulator.h" #include "RimViewNameConfig.h" #include "RimWellPathCollection.h" @@ -184,6 +185,47 @@ Rim3dView::Rim3dView() //-------------------------------------------------------------------------------------------------- Rim3dView::~Rim3dView() { + // When a 3d view is destructed, make sure that all other views using this as a comparison view is reset and + // redrawn. A crash was seen for test case + // "\ResInsight-regression-test\ProjectFiles\ProjectFilesSmallTests\TestCase_CoViz-Simple" when a view used as + // comparison view was deleted. + + if ( auto proj = RimProject::current() ) + { + std::vector allViews; + proj->allViews( allViews ); + + for ( auto v : allViews ) + { + if ( v->activeComparisonView() == this ) + { + v->setComparisonView( nullptr ); + v->scheduleCreateDisplayModelAndRedraw(); + } + } + + if ( this->isMasterView() ) + { + RimViewLinker* viewLinker = this->assosiatedViewLinker(); + viewLinker->setMasterView( nullptr ); + + delete proj->viewLinkerCollection->viewLinker(); + proj->viewLinkerCollection->viewLinker = nullptr; + + proj->uiCapability()->updateConnectedEditors(); + } + + RimViewController* vController = this->viewController(); + if ( vController ) + { + vController->setManagedView( nullptr ); + vController->ownerViewLinker()->removeViewController( vController ); + delete vController; + + proj->uiCapability()->updateConnectedEditors(); + } + } + if ( RiaApplication::instance()->activeReservoirView() == this ) { RiaApplication::instance()->setActiveReservoirView( nullptr ); @@ -193,6 +235,10 @@ Rim3dView::~Rim3dView() { m_viewer->clearRimView(); } + + // Make sure the object is disconnected from other objects before delete + prepareForDelete(); + removeMdiWindowFromMdiArea(); delete m_viewer; @@ -331,6 +377,8 @@ QWidget* Rim3dView::createViewWidget( QWidget* mainWindowParent ) //-------------------------------------------------------------------------------------------------- void Rim3dView::updateViewWidgetAfterCreation() { + if ( !m_viewer ) return; + m_viewer->setDefaultPerspectiveNearPlaneDistance( 10 ); this->onResetLegendsInViewer(); @@ -379,9 +427,56 @@ void Rim3dView::updateMdiWindowTitle() { if ( m_viewer ) { - m_viewer->layoutWidget()->setWindowTitle( - autoName() + ( isMasterView() ? " (Primary)" : viewController() ? " (Controlled)" : "" ) ); + auto title = autoName(); + + if ( isMasterView() && assosiatedViewLinker() && assosiatedViewLinker()->isActive() ) + { + title += " (Primary)"; + } + else if ( viewController() && viewController()->isActive() ) + { + title += " (Controlled)"; + } + + m_viewer->layoutWidget()->setWindowTitle( title ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimViewLinker* Rim3dView::assosiatedViewLinker() const +{ + RimViewLinker* viewLinker = this->viewLinkerIfMasterView(); + if ( !viewLinker ) + { + RimViewController* viewController = this->viewController(); + if ( viewController ) + { + viewLinker = viewController->ownerViewLinker(); + } + } + + return viewLinker; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimViewController* Rim3dView::viewController() const +{ + std::vector objects; + this->objectsWithReferringPtrFieldsOfType( objects ); + + for ( auto v : objects ) + { + if ( v ) + { + return v; + } } + + return nullptr; } //-------------------------------------------------------------------------------------------------- @@ -851,6 +946,13 @@ void Rim3dView::fieldChangedByUi( const caf::PdmFieldHandle* changedField, const updateScaling(); RiuMainWindow::instance()->updateScaleValue(); + + RimViewLinker* viewLinker = this->assosiatedViewLinker(); + if ( viewLinker ) + { + viewLinker->updateScaleZ( this, scaleZ() ); + viewLinker->updateCamera( this ); + } } else if ( changedField == &surfaceMode ) { @@ -1409,16 +1511,13 @@ QList Rim3dView::calculateValueOptions( const caf::PdmFi proj->allViews( views ); for ( auto view : views ) { - if ( view != this && dynamic_cast( view ) ) + if ( view != this ) { RiaOptionItemFactory::appendOptionItemFromViewNameAndCaseName( view, &options ); } } - if ( !options.empty() ) - { - options.push_front( caf::PdmOptionItemInfo( "None", nullptr ) ); - } + options.push_front( caf::PdmOptionItemInfo( "None", nullptr ) ); } } else if ( fieldNeedingOptions == &m_fontSize ) @@ -1652,3 +1751,22 @@ void Rim3dView::restoreComparisonView() depView->setOverrideViewer( nullptr ); viewer()->setCurrentComparisonFrame( depView->currentTimeStep() ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimViewLinker* Rim3dView::viewLinkerIfMasterView() const +{ + std::vector objects; + this->objectsWithReferringPtrFieldsOfType( objects ); + + for ( auto viewLinker : objects ) + { + if ( viewLinker ) + { + return viewLinker; + } + } + + return nullptr; +} diff --git a/ApplicationLibCode/ProjectDataModel/Rim3dView.h b/ApplicationLibCode/ProjectDataModel/Rim3dView.h index 6955bca439..b0d803ab79 100644 --- a/ApplicationLibCode/ProjectDataModel/Rim3dView.h +++ b/ApplicationLibCode/ProjectDataModel/Rim3dView.h @@ -115,6 +115,8 @@ class Rim3dView : public RimViewWindow, public RiuViewerToViewInterface, public QString name() const; QString autoName() const; + virtual RiaDefines::View3dContent viewContent() const = 0; + void setMeshOnlyDrawstyle(); void setMeshSurfDrawstyle(); void setSurfOnlyDrawstyle(); @@ -178,6 +180,10 @@ class Rim3dView : public RimViewWindow, public RiuViewerToViewInterface, public Rim3dView* activeComparisonView() const; void setComparisonView( Rim3dView* compView ); std::set viewsUsingThisAsComparisonView(); + void updateMdiWindowTitle() override; + + RimViewLinker* assosiatedViewLinker() const override; + RimViewController* viewController() const override; protected: static void removeModelByName( cvf::Scene* scene, const cvf::String& modelName ); @@ -229,8 +235,6 @@ class Rim3dView : public RimViewWindow, public RiuViewerToViewInterface, public virtual cvf::Transform* scaleTransform() = 0; protected: - // Overridden PdmObject methods: - caf::PdmFieldHandle* userDescriptionField() override; caf::PdmFieldHandle* backgroundColorField(); @@ -241,10 +245,11 @@ class Rim3dView : public RimViewWindow, public RiuViewerToViewInterface, public void setupBeforeSave() override; - // Overridden ViewWindow methods: void updateViewWidgetAfterCreation() override; QWidget* createViewWidget( QWidget* mainWindowParent ) override; + void setCameraPosition( const cvf::Mat4d& cameraPosition ) override; + protected: // Timestep Field. Children clamps this differently caf::PdmField m_currentTimeStep; @@ -263,7 +268,6 @@ class Rim3dView : public RimViewWindow, public RiuViewerToViewInterface, public void setId( int id ); void assignIdIfNecessary() final; - void updateMdiWindowTitle() override; void deleteViewWidget() override; QWidget* viewWidget() override; @@ -271,8 +275,6 @@ class Rim3dView : public RimViewWindow, public RiuViewerToViewInterface, public void performAutoNameUpdate() final; // Implementation of RiuViewerToViewInterface - - void setCameraPosition( const cvf::Mat4d& cameraPosition ) override; void setCameraPointOfInterest( const cvf::Vec3d& cameraPointOfInterest ) override; void endAnimation() override; @@ -295,6 +297,8 @@ class Rim3dView : public RimViewWindow, public RiuViewerToViewInterface, public Rim3dView* prepareComparisonView(); void restoreComparisonView(); + RimViewLinker* viewLinkerIfMasterView() const; + private: QPointer m_viewer; QPointer m_overrideViewer; diff --git a/ApplicationLibCode/ProjectDataModel/RimCase.cpp b/ApplicationLibCode/ProjectDataModel/RimCase.cpp index 4199c45e2c..4cb63e88b1 100644 --- a/ApplicationLibCode/ProjectDataModel/RimCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimCase.cpp @@ -138,6 +138,22 @@ QString RimCase::gridFileName() const return m_caseFileName().path(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimCase::DisplayNameEnum RimCase::displayNameType() const +{ + return m_displayNameOption(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimCase::setDisplayNameType( RimCaseDisplayNameTools::DisplayName displayNameType ) +{ + m_displayNameOption = displayNameType; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimCase.h b/ApplicationLibCode/ProjectDataModel/RimCase.h index 7b637507c8..2e609a3f33 100644 --- a/ApplicationLibCode/ProjectDataModel/RimCase.h +++ b/ApplicationLibCode/ProjectDataModel/RimCase.h @@ -63,9 +63,11 @@ class RimCase : public caf::PdmObject void setGridFileName( const QString& fileName ); QString gridFileName() const; - void setCustomCaseName( const QString& caseName ); - void updateAutoShortName(); - void updateOptionSensitivity(); + DisplayNameEnum displayNameType() const; + void setDisplayNameType( RimCaseDisplayNameTools::DisplayName displayNameType ); + void setCustomCaseName( const QString& caseName ); + void updateAutoShortName(); + void updateOptionSensitivity(); std::vector views() const; std::vector gridViews() const; diff --git a/ApplicationLibCode/ProjectDataModel/RimContextCommandBuilder.cpp b/ApplicationLibCode/ProjectDataModel/RimContextCommandBuilder.cpp index 5b1af4e6c3..646c9ce5b6 100644 --- a/ApplicationLibCode/ProjectDataModel/RimContextCommandBuilder.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimContextCommandBuilder.cpp @@ -282,13 +282,6 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "Separator"; menuBuilder << "RicCopyReferencesToClipboardFeature"; menuBuilder << "Separator"; -#ifdef USE_ODB_API - if ( dynamic_cast( firstUiItem ) ) - { - menuBuilder << "RicNewFaultReactAssessmentFeature"; - menuBuilder << "Separator"; - } -#endif } else if ( dynamic_cast( firstUiItem ) ) { @@ -306,8 +299,6 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "Separator"; menuBuilder << "RicGeoMechCopyCaseFeature"; menuBuilder << "Separator"; - menuBuilder << "RicNewFaultReactAssessmentFeature"; - menuBuilder << "Separator"; } else if ( dynamic_cast( firstUiItem ) ) { @@ -1086,8 +1077,10 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() } else if ( dynamic_cast( firstUiItem ) ) { - menuBuilder << "RicNewRftWellLogPlotFeature"; + menuBuilder << "RicNewMultiPhaseRftSegmentPlotFeature"; menuBuilder << "RicNewRftSegmentWellLogPlotFeature"; + menuBuilder.addSeparator(); + menuBuilder << "RicNewRftWellLogPlotFeature"; } if ( dynamic_cast( firstUiItem ) ) @@ -1222,19 +1215,6 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicExportFaultsFeature"; -#ifdef USE_ODB_API - menuBuilder.subMenuStart( "Reactivation Assessment" ); - menuBuilder << "RicRunBasicFaultReactAssessmentFeature"; - menuBuilder << "RicRunAdvFaultReactAssessmentFeature"; - menuBuilder.subMenuEnd(); - } - else if ( dynamic_cast( firstUiItem ) ) - { - menuBuilder.subMenuStart( "Reactivation Assessment" ); - menuBuilder << "RicRunBasicFaultReactAssessmentFeature"; - menuBuilder << "RicRunAdvFaultReactAssessmentFeature"; - menuBuilder.subMenuEnd(); -#endif } else if ( dynamic_cast( firstUiItem ) ) { diff --git a/ApplicationLibCode/ProjectDataModel/RimContourMapProjection.cpp b/ApplicationLibCode/ProjectDataModel/RimContourMapProjection.cpp index 3d01ad7307..33d64a109c 100644 --- a/ApplicationLibCode/ProjectDataModel/RimContourMapProjection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimContourMapProjection.cpp @@ -18,6 +18,7 @@ #include "RimContourMapProjection.h" +#include "RiaOpenMPTools.h" #include "RiaWeightedGeometricMeanCalculator.h" #include "RiaWeightedHarmonicMeanCalculator.h" #include "RiaWeightedMeanCalculator.h" @@ -45,10 +46,6 @@ #include -#ifdef USE_OPENMP -#include -#endif - namespace caf { template <> @@ -861,19 +858,13 @@ void RimContourMapProjection::generateTrianglesWithVertexValues() } } -#ifdef USE_OPENMP - std::vector>> threadTriangles( omp_get_max_threads() ); -#else - std::vector>> threadTriangles( 1 ); -#endif + int numberOfThreads = RiaOpenMPTools::availableThreadCount(); + + std::vector>> threadTriangles( numberOfThreads ); #pragma omp parallel { -#ifdef USE_OPENMP - int myThread = omp_get_thread_num(); -#else - int myThread = 0; -#endif + int myThread = RiaOpenMPTools::currentThreadIndex(); threadTriangles[myThread].resize( std::max( (size_t)1, m_contourPolygons.size() ) ); #pragma omp for schedule( dynamic ) diff --git a/ApplicationLibCode/ProjectDataModel/RimDepthTrackPlot.cpp b/ApplicationLibCode/ProjectDataModel/RimDepthTrackPlot.cpp index f786a94fc5..082ec3aa9a 100644 --- a/ApplicationLibCode/ProjectDataModel/RimDepthTrackPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimDepthTrackPlot.cpp @@ -21,7 +21,10 @@ #include "RiaGuiApplication.h" #include "RiaOptionItemFactory.h" +#include "RiaPlotWindowRedrawScheduler.h" #include "RiaPreferences.h" +#include "RiaQDateTimeTools.h" +#include "RiaTextStringTools.h" #include "RiaResultNames.h" #include "RigWellLogCurveData.h" @@ -36,11 +39,14 @@ #include "RimMainPlotCollection.h" #include "RimOilField.h" #include "RimPlot.h" +#include "RimPlotAxisAnnotation.h" #include "RimPlotWindow.h" #include "RimProject.h" +#include "RimSummaryCase.h" #include "RimWellAllocationPlot.h" #include "RimWellLogCurve.h" #include "RimWellLogCurveCommonDataSource.h" +#include "RimWellLogPlotNameConfig.h" #include "RimWellLogTrack.h" #include "RimWellPath.h" @@ -76,11 +82,11 @@ void RimDepthTrackPlot::AxisGridEnum::setUp() } template <> -void caf::AppEnum::setUp() +void caf::AppEnum::setUp() { - addItem( RimDepthTrackPlot::DepthOrientation::HORIZONTAL, "HORIZONTAL", "Horizontal" ); - addItem( RimDepthTrackPlot::DepthOrientation::VERTICAL, "VERTICAL", "Vertical" ); - setDefault( RimDepthTrackPlot::DepthOrientation::VERTICAL ); + addItem( RimDepthTrackPlot::DepthOrientation_OBSOLETE::HORIZONTAL, "HORIZONTAL", "Horizontal" ); + addItem( RimDepthTrackPlot::DepthOrientation_OBSOLETE::VERTICAL, "VERTICAL", "Vertical" ); + setDefault( RimDepthTrackPlot::DepthOrientation_OBSOLETE::VERTICAL ); } } // End namespace caf @@ -108,6 +114,10 @@ RimDepthTrackPlot::RimDepthTrackPlot() CAF_PDM_InitField( &m_plotWindowTitle, "PlotDescription", QString( "" ), "Name" ); m_plotWindowTitle.xmlCapability()->setIOWritable( false ); + auto templateText = QString( "%1, %2" ).arg( RiaDefines::namingVariableCase() ).arg( RiaDefines::namingVariableWell() ); + CAF_PDM_InitField( &m_nameTemplateText, "TemplateText", templateText, "Template Text" ); + CAF_PDM_InitFieldNoDefault( &m_namingMethod, "PlotNamingMethod", "Plot Name" ); + caf::AppEnum depthType = RiaDefines::DepthTypeEnum::MEASURED_DEPTH; CAF_PDM_InitScriptableField( &m_depthType, "DepthType", depthType, "Type" ); @@ -123,6 +133,18 @@ RimDepthTrackPlot::RimDepthTrackPlot() CAF_PDM_InitScriptableField( &m_isAutoScaleDepthEnabled, "AutoScaleDepthEnabled", true, "Auto Scale" ); m_isAutoScaleDepthEnabled.uiCapability()->setUiHidden( true ); + caf::AppEnum depthAxisVisibility = RiaDefines::MultiPlotAxisVisibility::ONE_VISIBLE; + CAF_PDM_InitField( &m_depthAxisVisibility, "DepthAxisVisibility", depthAxisVisibility, "Axis Visibility" ); + + CAF_PDM_InitScriptableField( &m_showDepthMarkerLine, "ShowDepthMarkerLine", false, "Show Depth Marker Line" ); + + CAF_PDM_InitScriptableField( &m_autoZoomMinDepthFactor, "AutoZoomMinDepthFactor", 0.0, "Auto Zoom Minimum Factor" ); + CAF_PDM_InitScriptableField( &m_autoZoomMaxDepthFactor, "AutoZoomMaxDepthFactor", 0.0, "Auto Zoom Maximum Factor" ); + + CAF_PDM_InitFieldNoDefault( &m_depthAnnotations, "DepthAnnotations", "Depth Annotations" ); + m_depthAnnotations.uiCapability()->setUiTreeHidden( true ); + m_depthAnnotations.uiCapability()->setUiTreeChildrenHidden( true ); + CAF_PDM_InitScriptableFieldNoDefault( &m_subTitleFontSize, "SubTitleFontSize", "Track Title Font Size" ); CAF_PDM_InitScriptableFieldNoDefault( &m_axisTitleFontSize, "AxisTitleFontSize", "Axis Title Font Size" ); CAF_PDM_InitScriptableFieldNoDefault( &m_axisValueFontSize, "AxisValueFontSize", "Axis Value Font Size" ); @@ -200,6 +222,7 @@ RimDepthTrackPlot& RimDepthTrackPlot::operator=( RimDepthTrackPlot&& rhs ) m_maxVisibleDepth = rhs.m_maxVisibleDepth(); m_depthAxisGridVisibility = rhs.m_depthAxisGridVisibility(); m_isAutoScaleDepthEnabled = rhs.m_isAutoScaleDepthEnabled(); + m_depthAxisVisibility = rhs.m_depthAxisVisibility(); m_subTitleFontSize = rhs.m_subTitleFontSize(); m_axisTitleFontSize = rhs.m_axisTitleFontSize(); @@ -299,7 +322,7 @@ std::vector RimDepthTrackPlot::visiblePlots() const //-------------------------------------------------------------------------------------------------- int RimDepthTrackPlot::columnCount() const { - if ( depthOrientation() == DepthOrientation::VERTICAL ) + if ( depthOrientation() == RiaDefines::Orientation::VERTICAL ) return RimPlotWindow::columnCount(); else return 1; @@ -315,8 +338,10 @@ void RimDepthTrackPlot::updateZoom() calculateAvailableDepthRange(); if ( m_minAvailableDepth < HUGE_VAL && m_maxAvailableDepth > -HUGE_VAL ) { - m_minVisibleDepth = m_minAvailableDepth; - m_maxVisibleDepth = m_maxAvailableDepth + 0.01 * ( m_maxAvailableDepth - m_minAvailableDepth ); + auto depthRange = m_maxAvailableDepth - m_minAvailableDepth; + + m_minVisibleDepth = m_minAvailableDepth - m_autoZoomMinDepthFactor * depthRange; + m_maxVisibleDepth = m_maxAvailableDepth + ( 0.01 + m_autoZoomMaxDepthFactor ) * depthRange; } } @@ -330,6 +355,9 @@ void RimDepthTrackPlot::updateZoom() { m_viewer->updateVerticalScrollBar( m_minVisibleDepth(), m_maxVisibleDepth(), m_minAvailableDepth, m_maxAvailableDepth ); } + + // Required to make sure the tracks are aligned correctly for vertical plots + updateLayout(); } //-------------------------------------------------------------------------------------------------- @@ -423,6 +451,78 @@ void RimDepthTrackPlot::visibleDepthRange( double* minimumDepth, double* maximum *maximumDepth = m_maxVisibleDepth; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimDepthTrackPlot::enableDepthMarkerLine( bool enable ) +{ + m_showDepthMarkerLine = enable; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimDepthTrackPlot::isDepthMarkerLineEnabled() const +{ + return m_showDepthMarkerLine(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimDepthTrackPlot::setDepthMarkerPosition( double depth ) +{ + RimPlotAxisAnnotation* firstAnnotation = nullptr; + if ( !m_depthAnnotations.empty() ) + { + firstAnnotation = m_depthAnnotations[0]; + } + + if ( firstAnnotation == nullptr ) + { + firstAnnotation = RimPlotAxisAnnotation::createLineAnnotation(); + firstAnnotation->setPenStyle( Qt::DashLine ); + m_depthAnnotations.push_back( firstAnnotation ); + } + + firstAnnotation->setValue( depth ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimDepthTrackPlot::clearDepthAnnotations() +{ + m_depthAnnotations.deleteChildren(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimDepthTrackPlot::depthAxisAnnotations() const +{ + return m_depthAnnotations.children(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimDepthTrackPlot::setAutoZoomMinimumDepthFactor( double factor ) +{ + m_autoZoomMinDepthFactor = factor; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimDepthTrackPlot::setAutoZoomMaximumDepthFactor( double factor ) +{ + m_autoZoomMaxDepthFactor = factor; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- RiaDefines::DepthUnitType RimDepthTrackPlot::caseDepthUnit() const { RimEclipseResultCase* thecase = dynamic_cast( commonDataSource()->caseToApply() ); @@ -472,7 +572,16 @@ void RimDepthTrackPlot::uiOrderingForDepthAxis( QString uiConfigName, caf::PdmUi uiOrdering.add( &m_minVisibleDepth ); uiOrdering.add( &m_maxVisibleDepth ); - uiOrdering.add( &m_depthAxisGridVisibility ); + + auto group = uiOrdering.addNewGroup( "Advanced" ); + group->setCollapsedByDefault(); + group->add( &m_depthOrientation ); + group->add( &m_depthAxisGridVisibility ); + group->add( &m_depthAxisVisibility ); + group->add( &m_showDepthMarkerLine ); + + group->add( &m_autoZoomMinDepthFactor ); + group->add( &m_autoZoomMaxDepthFactor ); } //-------------------------------------------------------------------------------------------------- @@ -481,68 +590,142 @@ void RimDepthTrackPlot::uiOrderingForDepthAxis( QString uiConfigName, caf::PdmUi void RimDepthTrackPlot::uiOrderingForAutoName( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) { uiOrdering.add( &m_showPlotTitle ); + uiOrdering.add( &m_namingMethod ); + uiOrdering.add( &m_nameTemplateText ); + m_nameConfig->uiOrdering( uiConfigName, uiOrdering ); + + auto tooltipText = supportedPlotNameVariables().join( ", " ); + m_nameTemplateText.uiCapability()->setUiToolTip( tooltipText ); + m_nameTemplateText.uiCapability()->setUiHidden( m_namingMethod() != RiaDefines::ObjectNamingMethod::TEMPLATE ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QString RimDepthTrackPlot::createAutoName() const +QString RimDepthTrackPlot::createPlotNameFromTemplate( const QString& templateText ) const { - QStringList generatedCurveName; + return RiaTextStringTools::replaceTemplateTextWithValues( templateText, createNameKeyValueMap() ); +} - if ( !m_nameConfig->customName().isEmpty() ) - { - generatedCurveName.push_back( m_nameConfig->customName() ); - } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QStringList RimDepthTrackPlot::supportedPlotNameVariables() const +{ + return { RiaDefines::namingVariableCase(), + RiaDefines::namingVariableWell(), + RiaDefines::namingVariableRefWell(), + RiaDefines::namingVariableWellBranch(), + RiaDefines::namingVariableTime(), + RiaDefines::namingVariableAirGap() }; +} - RimCase* commonCase = m_commonDataSource->caseToApply(); - RimWellPath* commonWellPath = m_commonDataSource->wellPathToApply(); +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::map RimDepthTrackPlot::createNameKeyValueMap() const +{ + std::map variableValueMap; - QStringList generatedAutoTags; - if ( m_nameConfig->addCaseName() && commonCase ) - { - generatedAutoTags.push_back( commonCase->caseUserDescription() ); - } + RimCase* commonCase = m_commonDataSource->caseToApply(); + RimWellPath* commonWellPath = m_commonDataSource->wellPathToApply(); + RimWellPath* commonRefWellPath = m_commonDataSource->referenceWellPathToApply(); - if ( m_nameConfig->addWellName() ) + if ( commonCase ) { - if ( commonWellPath && !commonWellPath->name().isEmpty() ) + variableValueMap[RiaDefines::namingVariableCase()] = commonCase->caseUserDescription(); + + if ( m_commonDataSource->timeStepToApply() != -1 ) { - generatedAutoTags.push_back( commonWellPath->name() ); + variableValueMap[RiaDefines::namingVariableTime()] = + commonCase->timeStepName( m_commonDataSource->timeStepToApply() ); } - else if ( !m_commonDataSource->simWellNameToApply().isEmpty() ) + } + else + { + auto summaryCase = m_commonDataSource->summaryCaseToApply(); + if ( summaryCase ) { - generatedAutoTags.push_back( m_commonDataSource->simWellNameToApply() ); + variableValueMap[RiaDefines::namingVariableCase()] = summaryCase->displayCaseName(); + + auto wellName = m_commonDataSource->rftWellName(); + if ( !wellName.isEmpty() ) variableValueMap[RiaDefines::namingVariableWell()] = wellName; + + auto dateTime = m_commonDataSource->rftTime(); + if ( dateTime.isValid() ) + { + variableValueMap[RiaDefines::namingVariableTime()] = + dateTime.toString( RiaQDateTimeTools::dateFormatString() ); + } + + auto branchIndex = m_commonDataSource->rftBranchIndex(); + if ( branchIndex >= 0 ) + { + variableValueMap[RiaDefines::namingVariableWellBranch()] = QString::number( branchIndex ); + } } } - if ( m_nameConfig->addTimeStep() ) + if ( commonWellPath && !commonWellPath->name().isEmpty() ) + { + variableValueMap[RiaDefines::namingVariableWell()] = commonWellPath->name(); + } + else if ( !m_commonDataSource->simWellNameToApply().isEmpty() ) { - if ( commonCase && m_commonDataSource->timeStepToApply() != -1 ) + variableValueMap[RiaDefines::namingVariableWell()] = m_commonDataSource->simWellNameToApply(); + } + + if ( commonRefWellPath && !commonRefWellPath->name().isEmpty() ) + { + variableValueMap[RiaDefines::namingVariableRefWell()] = QString( "Ref. Well: %1" ).arg( commonRefWellPath->name() ); + } + + if ( commonWellPath ) + { + RigWellPath* wellPathGeometry = commonWellPath->wellPathGeometry(); + if ( wellPathGeometry ) { - generatedAutoTags.push_back( commonCase->timeStepName( m_commonDataSource->timeStepToApply() ) ); + double rkb = wellPathGeometry->rkbDiff(); + + variableValueMap[RiaDefines::namingVariableAirGap()] = QString( "Air Gap = %1 m" ).arg( rkb ); } } - if ( m_nameConfig->addAirGap() ) + return variableValueMap; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimDepthTrackPlot::createAutoName() const +{ + if ( m_namingMethod() == RiaDefines::ObjectNamingMethod::AUTO ) { - if ( commonWellPath ) + // Use the ordering of the supported variables to create a name + auto candidateNames = supportedPlotNameVariables(); + + auto variableValues = createNameKeyValueMap(); + + QStringList variablesWithValue; + for ( const auto& name : candidateNames ) { - RigWellPath* wellPathGeometry = commonWellPath->wellPathGeometry(); - if ( wellPathGeometry ) + if ( variableValues.count( name ) ) { - double rkb = wellPathGeometry->rkbDiff(); - generatedAutoTags.push_back( QString( "Air Gap = %1 m" ).arg( rkb ) ); + variablesWithValue.push_back( name ); } } + + QString templateText = variablesWithValue.join( ", " ); + return createPlotNameFromTemplate( templateText ); } - if ( !generatedAutoTags.empty() ) + if ( m_namingMethod() == RiaDefines::ObjectNamingMethod::TEMPLATE ) { - generatedCurveName.push_back( generatedAutoTags.join( ", " ) ); + return createPlotNameFromTemplate( m_nameTemplateText ); } - return generatedCurveName.join( ": " ); + + return m_nameConfig->customName(); } //-------------------------------------------------------------------------------------------------- @@ -553,6 +736,22 @@ RimWellLogPlotNameConfig* RimDepthTrackPlot::nameConfig() const return m_nameConfig; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimDepthTrackPlot::setNameTemplateText( const QString& templateText ) +{ + m_nameTemplateText = templateText; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimDepthTrackPlot::setNamingMethod( RiaDefines::ObjectNamingMethod namingMethod ) +{ + m_namingMethod = namingMethod; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -766,6 +965,9 @@ void RimDepthTrackPlot::onPlotsReordered( const SignalEmitter* emitter ) updateSubPlotNames(); recreatePlotWidgets(); loadDataAndUpdate(); + + RiaPlotWindowRedrawScheduler::instance()->performScheduledUpdatesAndReplots(); + updateLayout(); } //-------------------------------------------------------------------------------------------------- @@ -840,7 +1042,8 @@ void RimDepthTrackPlot::fieldChangedByUi( const caf::PdmFieldHandle* changedFiel m_isAutoScaleDepthEnabled = false; updateZoom(); } - else if ( changedField == &m_depthAxisGridVisibility ) + else if ( changedField == &m_depthAxisGridVisibility || changedField == &m_autoZoomMaxDepthFactor || + changedField == &m_autoZoomMinDepthFactor ) { updateZoom(); } @@ -855,13 +1058,6 @@ void RimDepthTrackPlot::fieldChangedByUi( const caf::PdmFieldHandle* changedFiel { m_isAutoScaleDepthEnabled = true; - bool isTVDRKB = m_depthType == RiaDefines::DepthTypeEnum::TRUE_VERTICAL_DEPTH_RKB; - m_nameConfig->setAutoNameTags( m_nameConfig->addCaseName(), - m_nameConfig->addWellName(), - m_nameConfig->addTimeStep(), - isTVDRKB, - m_nameConfig->addWaterDepth() ); - RimWellAllocationPlot* parentWellAllocation = nullptr; this->firstAncestorOrThisOfType( parentWellAllocation ); if ( parentWellAllocation ) @@ -878,7 +1074,7 @@ void RimDepthTrackPlot::fieldChangedByUi( const caf::PdmFieldHandle* changedFiel m_isAutoScaleDepthEnabled = true; onLoadDataAndUpdate(); } - else if ( changedField == &m_depthOrientation ) + else if ( changedField == &m_depthOrientation || changedField == &m_depthAxisVisibility ) { onLoadDataAndUpdate(); } @@ -887,7 +1083,7 @@ void RimDepthTrackPlot::fieldChangedByUi( const caf::PdmFieldHandle* changedFiel { updateFonts(); } - else if ( changedField == &m_showPlotTitle ) + else if ( changedField == &m_showPlotTitle || changedField == &m_namingMethod || changedField == &m_nameTemplateText ) { performAutoNameUpdate(); } @@ -911,6 +1107,17 @@ void RimDepthTrackPlot::fieldChangedByUi( const caf::PdmFieldHandle* changedFiel ensembleWellLogCurveSet->loadDataAndUpdate( true ); } } + else if ( changedField == &m_showDepthMarkerLine ) + { + if ( !m_showDepthMarkerLine ) + { + clearDepthAnnotations(); + for ( auto p : plots() ) + { + p->updateAxes(); + } + } + } updateConnectedEditors(); } @@ -931,12 +1138,16 @@ void RimDepthTrackPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrderi caf::PdmUiGroup* titleGroup = uiOrdering.addNewGroup( "Plot Title" ); uiOrderingForAutoName( uiConfigName, *titleGroup ); - caf::PdmUiGroup* plotLayoutGroup = uiOrdering.addNewGroup( "Plot Layout" ); - RimPlotWindow::uiOrderingForPlotLayout( uiConfigName, *plotLayoutGroup, true ); - plotLayoutGroup->add( &m_subTitleFontSize ); - plotLayoutGroup->add( &m_axisTitleFontSize ); - plotLayoutGroup->add( &m_axisValueFontSize ); - plotLayoutGroup->add( &m_depthOrientation ); + caf::PdmUiGroup* legendGroup = uiOrdering.addNewGroup( "Legends" ); + legendGroup->setCollapsedByDefault(); + RimPlotWindow::uiOrderingForLegends( uiConfigName, *legendGroup, true ); + + caf::PdmUiGroup* fontGroup = uiOrdering.addNewGroup( "Fonts" ); + fontGroup->setCollapsedByDefault(); + RimPlotWindow::uiOrderingForFonts( uiConfigName, *fontGroup ); + fontGroup->add( &m_subTitleFontSize ); + fontGroup->add( &m_axisTitleFontSize ); + fontGroup->add( &m_axisValueFontSize ); std::vector ensembleWellLogCurveSets; descendantsOfType( ensembleWellLogCurveSets ); @@ -946,7 +1157,7 @@ void RimDepthTrackPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrderi ensembleWellLogGroup->add( &m_depthEqualization ); ensembleWellLogGroup->add( &m_ensembleCurveSet ); - // Disable depth equalization if any of the ensmble is missing k-layer info + // Disable depth equalization if any of the ensemble is missing k-layer info bool hasKLayerIndex = true; for ( auto wellLogCurveSet : ensembleWellLogCurveSets ) if ( !wellLogCurveSet->hasPropertyInFile( RiaResultNames::indexKResultName() ) ) hasKLayerIndex = false; @@ -994,6 +1205,23 @@ QList RimDepthTrackPlot::calculateValueOptions( const ca { RiaOptionItemFactory::appendOptionItemsForEnsembleCurveSets( &options ); } + else if ( fieldNeedingOptions == &m_namingMethod ) + { + options.push_back( caf::PdmOptionItemInfo( caf::AppEnum::uiText( + RiaDefines::ObjectNamingMethod::AUTO ), + RiaDefines::ObjectNamingMethod::AUTO ) ); + + options.push_back( caf::PdmOptionItemInfo( caf::AppEnum::uiText( + RiaDefines::ObjectNamingMethod::CUSTOM ), + RiaDefines::ObjectNamingMethod::CUSTOM ) ); + + if ( !supportedPlotNameVariables().isEmpty() ) + { + options.push_back( caf::PdmOptionItemInfo( caf::AppEnum::uiText( + RiaDefines::ObjectNamingMethod::TEMPLATE ), + RiaDefines::ObjectNamingMethod::TEMPLATE ) ); + } + } return options; } @@ -1014,6 +1242,13 @@ void RimDepthTrackPlot::initAfterRead() { m_nameConfig->setCustomName( m_plotWindowTitle ); } + + if ( RimProject::current()->isProjectFileVersionEqualOrOlderThan( "2022.06.2" ) && + !m_nameConfig->customName().isEmpty() ) + { + m_namingMethod = RiaDefines::ObjectNamingMethod::CUSTOM; + } + performAutoNameUpdate(); } @@ -1040,6 +1275,7 @@ void RimDepthTrackPlot::defineEditorAttribute( const caf::PdmFieldHandle* field, //-------------------------------------------------------------------------------------------------- void RimDepthTrackPlot::onLoadDataAndUpdate() { + updateReferenceWellPathInCurves(); updateMdiWindowVisibility(); performAutoNameUpdate(); updatePlots(); @@ -1071,6 +1307,21 @@ caf::PdmFieldHandle* RimDepthTrackPlot::userDescriptionField() return &m_plotWindowTitle; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimDepthTrackPlot::updateReferenceWellPathInCurves() +{ + for ( auto plot : this->plots() ) + { + auto wellLogTrack = dynamic_cast( plot ); + for ( auto curve : wellLogTrack->curves() ) + { + curve->setReferenceWellPath( m_commonDataSource->referenceWellPathToApply() ); + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1201,7 +1452,7 @@ RimDepthTrackPlot::AxisGridVisibility RimDepthTrackPlot::depthAxisGridLinesEnabl //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimDepthTrackPlot::DepthOrientation RimDepthTrackPlot::depthOrientation() const +RiaDefines::Orientation RimDepthTrackPlot::depthOrientation() const { return m_depthOrientation(); } @@ -1209,11 +1460,27 @@ RimDepthTrackPlot::DepthOrientation RimDepthTrackPlot::depthOrientation() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimDepthTrackPlot::setDepthOrientation( DepthOrientation depthOrientation ) +void RimDepthTrackPlot::setDepthOrientation( RiaDefines::Orientation depthOrientation ) { m_depthOrientation = depthOrientation; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaDefines::MultiPlotAxisVisibility RimDepthTrackPlot::depthAxisVisibility() const +{ + return m_depthAxisVisibility(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimDepthTrackPlot::setDepthAxisVisibility( RiaDefines::MultiPlotAxisVisibility axisVisibility ) +{ + m_depthAxisVisibility = axisVisibility; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1225,9 +1492,9 @@ RiuPlotAxis RimDepthTrackPlot::depthAxis() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RiuPlotAxis RimDepthTrackPlot::depthAxis( DepthOrientation depthOrientation ) +RiuPlotAxis RimDepthTrackPlot::depthAxis( RiaDefines::Orientation depthOrientation ) { - if ( depthOrientation == RimDepthTrackPlot::DepthOrientation::VERTICAL ) return RiuPlotAxis::defaultLeft(); + if ( depthOrientation == RiaDefines::Orientation::VERTICAL ) return RiuPlotAxis::defaultLeft(); return RiuPlotAxis::defaultBottom(); } @@ -1243,9 +1510,9 @@ RiuPlotAxis RimDepthTrackPlot::valueAxis() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RiuPlotAxis RimDepthTrackPlot::valueAxis( DepthOrientation depthOrientation ) +RiuPlotAxis RimDepthTrackPlot::valueAxis( RiaDefines::Orientation depthOrientation ) { - if ( depthOrientation == RimDepthTrackPlot::DepthOrientation::VERTICAL ) return RiuPlotAxis::defaultTop(); + if ( depthOrientation == RiaDefines::Orientation::VERTICAL ) return RiuPlotAxis::defaultTop(); return RiuPlotAxis::defaultLeft(); } @@ -1261,7 +1528,7 @@ RiuPlotAxis RimDepthTrackPlot::annotationAxis() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RiuPlotAxis RimDepthTrackPlot::annotationAxis( DepthOrientation depthOrientation ) +RiuPlotAxis RimDepthTrackPlot::annotationAxis( RiaDefines::Orientation depthOrientation ) { auto riuAxis = valueAxis( depthOrientation ); diff --git a/ApplicationLibCode/ProjectDataModel/RimDepthTrackPlot.h b/ApplicationLibCode/ProjectDataModel/RimDepthTrackPlot.h index dc8f2ac50c..3a39c4745c 100644 --- a/ApplicationLibCode/ProjectDataModel/RimDepthTrackPlot.h +++ b/ApplicationLibCode/ProjectDataModel/RimDepthTrackPlot.h @@ -20,11 +20,12 @@ #pragma once #include "RiaDefines.h" +#include "RiaPlotDefines.h" + #include "RimAbstractPlotCollection.h" #include "RimEnsembleWellLogStatistics.h" #include "RimPlot.h" #include "RimPlotWindow.h" -#include "RimWellLogPlotNameConfig.h" #include "cafAppEnum.h" #include "cafPdmChildArrayField.h" @@ -44,6 +45,8 @@ class RimPlot; class RimEnsembleCurveSet; class RiuPlotAxis; class RimWellLogTrack; +class RimWellLogPlotNameConfig; +class RimPlotAxisAnnotation; class QKeyEvent; @@ -67,7 +70,7 @@ class RimDepthTrackPlot : public RimTypedPlotCollection, public RimPlot typedef caf::AppEnum AxisGridEnum; using DepthTypeEnum = RiaDefines::DepthTypeEnum; - enum class DepthOrientation + enum class DepthOrientation_OBSOLETE { HORIZONTAL, VERTICAL @@ -104,8 +107,11 @@ class RimDepthTrackPlot : public RimTypedPlotCollection, public RimPlot void enableDepthAxisGridLines( AxisGridVisibility gridVisibility ); AxisGridVisibility depthAxisGridLinesEnabled() const; - RimDepthTrackPlot::DepthOrientation depthOrientation() const; - void setDepthOrientation( RimDepthTrackPlot::DepthOrientation depthOrientation ); + RiaDefines::Orientation depthOrientation() const; + void setDepthOrientation( RiaDefines::Orientation depthOrientation ); + + RiaDefines::MultiPlotAxisVisibility depthAxisVisibility() const; + void setDepthAxisVisibility( RiaDefines::MultiPlotAxisVisibility axisVisibility ); RiuPlotAxis depthAxis() const; RiuPlotAxis valueAxis() const; @@ -124,11 +130,21 @@ class RimDepthTrackPlot : public RimTypedPlotCollection, public RimPlot void availableDepthRange( double* minimumDepth, double* maximumDepth ) const; void visibleDepthRange( double* minimumDepth, double* maximumDepth ) const; + void enableDepthMarkerLine( bool enable ); + bool isDepthMarkerLineEnabled() const; + void setDepthMarkerPosition( double depth ); + void clearDepthAnnotations(); + std::vector depthAxisAnnotations() const; + void setAutoZoomMinimumDepthFactor( double factor ); + void setAutoZoomMaximumDepthFactor( double factor ); + void uiOrderingForDepthAxis( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ); void uiOrderingForAutoName( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ); QString createAutoName() const override; RimWellLogPlotNameConfig* nameConfig() const; + void setNameTemplateText( const QString& templateText ); + void setNamingMethod( RiaDefines::ObjectNamingMethod namingMethod ); RimWellLogCurveCommonDataSource* commonDataSource() const; void updateCommonDataSource(); @@ -151,17 +167,22 @@ class RimDepthTrackPlot : public RimTypedPlotCollection, public RimPlot void updateDepthAxisVisibility(); - static RiuPlotAxis depthAxis( DepthOrientation depthOrientation ); - static RiuPlotAxis valueAxis( DepthOrientation depthOrientation ); - static RiuPlotAxis annotationAxis( DepthOrientation depthOrientation ); + static RiuPlotAxis depthAxis( RiaDefines::Orientation depthOrientation ); + static RiuPlotAxis valueAxis( RiaDefines::Orientation depthOrientation ); + static RiuPlotAxis annotationAxis( RiaDefines::Orientation depthOrientation ); protected: QImage snapshotWindowContent() override; QWidget* createViewWidget( QWidget* mainWindowParent ) override; void deleteViewWidget() override; - void performAutoNameUpdate() override; - void recreatePlotWidgets(); + + void performAutoNameUpdate() override; + QString createPlotNameFromTemplate( const QString& templateText ) const override; + QStringList supportedPlotNameVariables() const override; + virtual std::map createNameKeyValueMap() const; + + void recreatePlotWidgets(); // Overridden PDM methods void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; @@ -176,6 +197,8 @@ class RimDepthTrackPlot : public RimTypedPlotCollection, public RimPlot void updatePlots(); caf::PdmFieldHandle* userDescriptionField() override; + void updateReferenceWellPathInCurves(); + private: void cleanupBeforeClose(); void updateSubPlotNames(); @@ -188,16 +211,27 @@ class RimDepthTrackPlot : public RimTypedPlotCollection, public RimPlot caf::PdmChildField m_commonDataSource; bool m_commonDataSourceEnabled; - caf::PdmField m_plotWindowTitle; - caf::PdmField> m_depthType; - caf::PdmField> m_depthUnit; - caf::PdmField m_minVisibleDepth; - caf::PdmField m_maxVisibleDepth; - caf::PdmField m_depthAxisGridVisibility; - caf::PdmField m_isAutoScaleDepthEnabled; - caf::PdmField m_subTitleFontSize; - caf::PdmField m_axisTitleFontSize; - caf::PdmField m_axisValueFontSize; + caf::PdmField m_plotWindowTitle; + caf::PdmField m_nameTemplateText; + + caf::PdmField> m_namingMethod; + + // Depth axis + caf::PdmField> m_depthType; + caf::PdmField> m_depthUnit; + caf::PdmField m_minVisibleDepth; + caf::PdmField m_maxVisibleDepth; + caf::PdmField m_depthAxisGridVisibility; + caf::PdmField m_isAutoScaleDepthEnabled; + caf::PdmField> m_depthAxisVisibility; + caf::PdmField m_showDepthMarkerLine; + caf::PdmField m_autoZoomMinDepthFactor; + caf::PdmField m_autoZoomMaxDepthFactor; + caf::PdmChildArrayField m_depthAnnotations; + + caf::PdmField m_subTitleFontSize; + caf::PdmField m_axisTitleFontSize; + caf::PdmField m_axisValueFontSize; caf::PdmChildField m_nameConfig; caf::PdmChildArrayField m_plots; @@ -205,7 +239,7 @@ class RimDepthTrackPlot : public RimTypedPlotCollection, public RimPlot caf::PdmField> m_depthEqualization; caf::PdmPtrField m_ensembleCurveSet; - caf::PdmField> m_depthOrientation; + caf::PdmField> m_depthOrientation; QPointer m_viewer; std::set m_availableDepthUnits; diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseCase.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseCase.cpp index 2adbad2e9c..6ecbd61334 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseCase.cpp @@ -20,6 +20,7 @@ #include "RimEclipseCase.h" +#include "RiaApplication.h" #include "RiaColorTables.h" #include "RiaDefines.h" #include "RiaFieldHandleTools.h" @@ -30,12 +31,13 @@ #include "CompletionExportCommands/RicWellPathExportCompletionDataFeatureImpl.h" #include "RicfCommandObject.h" -#include "RifEclipseInputPropertyLoader.h" +#include "RifInputPropertyLoader.h" #include "RifReaderSettings.h" #include "RigActiveCellInfo.h" #include "RigCaseCellResultsData.h" #include "RigEclipseCaseData.h" +#include "RigGridManager.h" #include "RigMainGrid.h" #include "RigNNCData.h" #include "RigSimWellData.h" @@ -270,6 +272,19 @@ const RigMainGrid* RimEclipseCase::mainGrid() const return nullptr; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEclipseCase::isGridSizeEqualTo( const RimEclipseCase* otherCase ) const +{ + if ( !mainGrid() || !otherCase || !otherCase->mainGrid() ) + { + return false; + } + + return RigGridManager::isMainGridDimensionsEqual( mainGrid(), otherCase->mainGrid() ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -529,7 +544,7 @@ void RimEclipseCase::updateFormationNamesData() } RimEclipsePropertyFilterCollection* eclFilColl = eclView->eclipsePropertyFilterCollection(); - for ( RimEclipsePropertyFilter* propFilter : eclFilColl->propertyFilters ) + for ( RimEclipsePropertyFilter* propFilter : eclFilColl->propertyFilters() ) { if ( propFilter->resultDefinition()->resultType() == RiaDefines::ResultCatType::FORMATION_NAMES ) { @@ -539,7 +554,7 @@ void RimEclipseCase::updateFormationNamesData() } RimEclipsePropertyFilterCollection* eclFilColl = eclView->eclipsePropertyFilterCollection(); - for ( RimEclipsePropertyFilter* propFilter : eclFilColl->propertyFilters ) + for ( RimEclipsePropertyFilter* propFilter : eclFilColl->propertyFilters() ) { if ( propFilter->resultDefinition()->resultType() == RiaDefines::ResultCatType::FORMATION_NAMES ) { @@ -637,7 +652,12 @@ void RimEclipseCase::computeCachedData() { auto task = pInf.task( "Calculating Cell Search Tree", 10 ); - rigEclipseCase->mainGrid()->computeCachedData(); + + std::string aabbTreeInfo; + rigEclipseCase->mainGrid()->computeCachedData( &aabbTreeInfo ); + + // Debug output of the content of the AABB tree + // RiaLogging::debug( QString::fromStdString( aabbTreeInfo ) ); } { @@ -704,7 +724,7 @@ std::vector RimEclipseCase::additionalFiles() const /// Loads input property data from the gridFile and additional files /// Creates new InputProperties if necessary, and flags the unused ones as obsolete //-------------------------------------------------------------------------------------------------- -void RimEclipseCase::loadAndSyncronizeInputProperties( bool importGridOrFaultData ) +void RimEclipseCase::loadAndSynchronizeInputProperties( bool importGridOrFaultData ) { // Make sure we actually have reservoir data @@ -719,10 +739,10 @@ void RimEclipseCase::loadAndSyncronizeInputProperties( bool importGridOrFaultDat filenames.push_back( fileName ); } - RifEclipseInputPropertyLoader::loadAndSyncronizeInputProperties( inputPropertyCollection(), - eclipseCaseData(), - filenames, - importGridOrFaultData ); + RifInputPropertyLoader::loadAndSynchronizeInputProperties( inputPropertyCollection(), + eclipseCaseData(), + filenames, + importGridOrFaultData ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseCase.h b/ApplicationLibCode/ProjectDataModel/RimEclipseCase.h index 166bec3c01..bde445c597 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseCase.h +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseCase.h @@ -83,6 +83,7 @@ class RimEclipseCase : public RimCase cvf::Color3f defaultWellColor( const QString& wellName ); const RigMainGrid* mainGrid() const; + bool isGridSizeEqualTo( const RimEclipseCase* otherCase ) const; RigCaseCellResultsData* results( RiaDefines::PorosityModelType porosityModel ); const RigCaseCellResultsData* results( RiaDefines::PorosityModelType porosityModel ) const; @@ -116,7 +117,7 @@ class RimEclipseCase : public RimCase std::set sortedSimWellNames() const; - void loadAndSyncronizeInputProperties( bool importGridOrFaultData ); + void loadAndSynchronizeInputProperties( bool importGridOrFaultData ); void ensureFaultDataIsComputed(); bool ensureNncDataIsComputed(); diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseCellColors.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseCellColors.cpp index cc09ddac0f..b32e4620d0 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseCellColors.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseCellColors.cpp @@ -244,6 +244,11 @@ void RimEclipseCellColors::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeO uiTreeOrdering.add( m_legendConfigPtrField() ); } + for ( const auto& obj : m_additionalUiTreeObjects ) + { + uiTreeOrdering.add( obj ); + } + uiTreeOrdering.skipRemainingChildren( true ); } @@ -271,6 +276,14 @@ void RimEclipseCellColors::useDiscreteLogLevels( bool enable ) m_useDiscreteLogLevels = true; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEclipseCellColors::setAdditionalUiTreeObjects( const std::vector& objects ) +{ + m_additionalUiTreeObjects = objects; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseCellColors.h b/ApplicationLibCode/ProjectDataModel/RimEclipseCellColors.h index df6ce7fc2a..e8a786fa8a 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseCellColors.h +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseCellColors.h @@ -62,6 +62,8 @@ class RimEclipseCellColors : public RimEclipseResultDefinition void useDiscreteLogLevels( bool enable ); + void setAdditionalUiTreeObjects( const std::vector& objects ); + protected: // Overridden methods void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; @@ -85,6 +87,8 @@ class RimEclipseCellColors : public RimEclipseResultDefinition caf::PdmPointer m_reservoirView; + std::vector m_additionalUiTreeObjects; + bool m_useDiscreteLogLevels; // Obsolete diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapProjection.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapProjection.cpp index ef48a47059..3217aff4c0 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapProjection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapProjection.cpp @@ -35,7 +35,6 @@ #include "RimEclipseContourMapView.h" #include "RimEclipseResultDefinition.h" #include "RimEclipseView.h" -#include "RimProject.h" #include "RimRegularLegendConfig.h" #include "RimTextAnnotation.h" @@ -163,16 +162,16 @@ double RimEclipseContourMapProjection::sampleSpacing() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimEclipseContourMapProjection::updatedWeightingResult() +void RimEclipseContourMapProjection::clearGridMappingAndRedraw() { this->clearGridMapping(); this->updateConnectedEditors(); this->generateResultsIfNecessary( view()->currentTimeStep() ); this->updateLegend(); - RimProject* proj; - this->firstAncestorOrThisOfTypeAsserted( proj ); - proj->scheduleCreateDisplayModelAndRedrawAllViews(); + RimEclipseView* parentView = nullptr; + this->firstAncestorOrThisOfTypeAsserted( parentView ); + parentView->scheduleCreateDisplayModelAndRedraw(); } //-------------------------------------------------------------------------------------------------- @@ -228,7 +227,11 @@ std::vector RimEclipseContourMapProjection::generateResults( int timeSte cellColors->resultVariable(), cellColors->timeLapseBaseTimeStep(), cellColors->caseDiffIndex() ); - if ( resAddr.isValid() && gridCellResult->hasResultEntry( resAddr ) ) + + // When loading a project file, grid calculator results are not computed the first time this function is + // called. Must check if result is loaded. See RimReloadCaseTools::updateAll3dViews() + if ( resAddr.isValid() && gridCellResult->hasResultEntry( resAddr ) && + gridCellResult->isResultLoaded( resAddr ) ) { gridResultValues = gridCellResult->cellScalarResults( resAddr, timeStep ); } diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapProjection.h b/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapProjection.h index 8cb131ed85..a6f4cba7b1 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapProjection.h +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapProjection.h @@ -18,7 +18,6 @@ #pragma once -#include "RimCheckableNamedObject.h" #include "RimContourMapProjection.h" #include "cafDisplayCoordTransform.h" @@ -51,7 +50,7 @@ class RimEclipseContourMapProjection : public RimContourMapProjection ~RimEclipseContourMapProjection() override; QString weightingParameter() const; - void updatedWeightingResult(); + void clearGridMappingAndRedraw(); // Eclipse case overrides for contour map methods QString resultDescriptionText() const override; diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapView.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapView.cpp index 08069213de..04c0d31638 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapView.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapView.cpp @@ -35,6 +35,7 @@ #include "RimGridCollection.h" #include "RimRegularLegendConfig.h" #include "RimSimWellInViewCollection.h" +#include "RimViewLinker.h" #include "RimViewNameConfig.h" #include "cafPdmUiTreeOrdering.h" @@ -72,7 +73,7 @@ RimEclipseContourMapView::RimEclipseContourMapView() m_contourMapProjectionPartMgr = new RivContourMapProjectionPartMgr( contourMapProjection(), this ); - ( (RiuViewerToViewInterface*)this )->setCameraPosition( sm_defaultViewMatrix ); + setCameraPosition( sm_defaultViewMatrix ); cellResult()->setTernaryEnabled( false ); cellResult()->legendConfigChanged.connect( this, &RimEclipseContourMapView::onLegendConfigChanged ); @@ -86,6 +87,14 @@ RimEclipseContourMapProjection* RimEclipseContourMapView::contourMapProjection() return m_contourMapProjection().p(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaDefines::View3dContent RimEclipseContourMapView::viewContent() const +{ + return ( RiaDefines::View3dContent::ECLIPSE_DATA & RiaDefines::View3dContent::CONTOUR ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -239,6 +248,7 @@ void RimEclipseContourMapView::onUpdateDisplayModelForCurrentTimeStep() { static_cast( nativePropertyFilterCollection() )->updateFromCurrentTimeStep(); + m_contourMapProjection->clearGeometry(); updateGeometry(); } @@ -410,7 +420,22 @@ void RimEclipseContourMapView::onUpdateLegends() } } - nativeOrOverrideViewer()->showScaleLegend( m_showScaleLegend() ); + // Hide the scale widget if any 3D views are present, as the display of the scale widget is only working for + // default rotation. The update is triggered in RimViewLinker::updateScaleWidgetVisibility() + + bool any3DViewsLinked = false; + + if ( auto viewLinker = assosiatedViewLinker() ) + { + auto views = viewLinker->allViews(); + for ( auto v : views ) + { + if ( dynamic_cast( v ) ) continue; + any3DViewsLinked = true; + } + } + + nativeOrOverrideViewer()->showScaleLegend( any3DViewsLinked ? false : m_showScaleLegend() ); } } @@ -569,3 +594,18 @@ RimSurfaceInViewCollection* RimEclipseContourMapView::surfaceInViewCollection() // Surfaces should not be shown in contour map. return nullptr; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEclipseContourMapView::zoomAll() +{ + setCameraPosition( sm_defaultViewMatrix ); + isPerspectiveView = false; + + // If a 3D view has been used as the primary linked view, a contour map can be rotated in 3D. Use the following + // function to make sure view is reset to original state, with correct rotation and grid box configuration. + updateViewWidgetAfterCreation(); + + RimEclipseView::zoomAll(); +} diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapView.h b/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapView.h index ed1d9f5709..3e78d295ca 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapView.h +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapView.h @@ -36,11 +36,14 @@ class RimEclipseContourMapView : public RimEclipseView RimEclipseContourMapView(); RimEclipseContourMapProjection* contourMapProjection() const; + RiaDefines::View3dContent viewContent() const override; + QString createAutoName() const override; void setDefaultCustomName(); void updatePickPointAndRedraw(); RimSurfaceInViewCollection* surfaceInViewCollection() const override; + void zoomAll() override; protected: void initAfterRead() override; diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapViewCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapViewCollection.cpp index d806f069be..6ff982b31d 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapViewCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapViewCollection.cpp @@ -1,6 +1,6 @@ #include "RimEclipseContourMapViewCollection.h" -#include "RimCase.h" +#include "RimEclipseCase.h" #include "RimEclipseContourMapView.h" CAF_PDM_SOURCE_INIT( RimEclipseContourMapViewCollection, "Eclipse2dViewCollection" ); @@ -38,3 +38,14 @@ void RimEclipseContourMapViewCollection::push_back( RimEclipseContourMapView* co { m_contourMapViews.push_back( contourMap ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEclipseContourMapViewCollection::onChildDeleted( caf::PdmChildArrayFieldHandle* childArray, + std::vector& referringObjects ) +{ + RimEclipseCase* eclipseCase = nullptr; + this->firstAncestorOrThisOfType( eclipseCase ); + if ( eclipseCase ) eclipseCase->updateConnectedEditors(); +} diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapViewCollection.h b/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapViewCollection.h index 60c2360cce..20fc1795d8 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapViewCollection.h +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapViewCollection.h @@ -35,6 +35,9 @@ class RimEclipseContourMapViewCollection : public caf::PdmObject std::vector views(); void push_back( RimEclipseContourMapView* contourMap ); + void onChildDeleted( caf::PdmChildArrayFieldHandle* childArray, + std::vector& referringObjects ) override; + private: caf::PdmChildArrayField m_contourMapViews; }; diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseInputCase.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseInputCase.cpp index 11133e7b1a..4f219b468b 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseInputCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseInputCase.cpp @@ -26,7 +26,7 @@ #include "RiaPreferences.h" #include "RifEclipseInputFileTools.h" -#include "RifEclipseInputPropertyLoader.h" +#include "RifInputPropertyLoader.h" #include "RifReaderEclipseInput.h" #include "RifReaderInterface.h" #include "RifReaderMockModel.h" @@ -174,10 +174,10 @@ bool RimEclipseInputCase::openDataFileSet( const QStringList& fileNames ) } } - RifEclipseInputPropertyLoader::loadAndSyncronizeInputProperties( m_inputPropertyCollection, - this->eclipseCaseData(), - filesToRead, - importFaults ); + RifInputPropertyLoader::loadAndSynchronizeInputProperties( m_inputPropertyCollection, + this->eclipseCaseData(), + filesToRead, + importFaults ); if ( importFaults ) { @@ -224,7 +224,7 @@ bool RimEclipseInputCase::openEclipseGridFile() this->eclipseCaseData()->mainGrid()->setFlipAxis( m_flipXAxis, m_flipYAxis ); - loadAndSyncronizeInputProperties( true ); + loadAndSynchronizeInputProperties( true ); computeCachedData(); } diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.cpp index 5a1748312e..da954a5d37 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.cpp @@ -28,8 +28,8 @@ #include "RicfCommandObject.h" -#include "RifEclipseInputPropertyLoader.h" #include "RifEclipseOutputFileTools.h" +#include "RifInputPropertyLoader.h" #include "RifReaderEclipseOutput.h" #include "RifReaderEclipseRft.h" #include "RifReaderMockModel.h" @@ -201,7 +201,7 @@ bool RimEclipseResultCase::importGridAndResultMetaData( bool showTimeStepFilter progInfo.setProgressDescription( "Computing Case Cache" ); computeCachedData(); - loadAndSyncronizeInputProperties( false ); + loadAndSynchronizeInputProperties( false ); m_gridAndWellDataIsReadFromFile = true; m_activeCellInfoIsReadFromFile = true; @@ -236,11 +236,10 @@ bool RimEclipseResultCase::importGridAndResultMetaData( bool showTimeStepFilter bool RimEclipseResultCase::importAsciiInputProperties( const QStringList& fileNames ) { bool importFaults = false; - RifEclipseInputPropertyLoader::loadAndSyncronizeInputProperties( m_inputPropertyCollection, - this->eclipseCaseData(), - std::vector( fileNames.begin(), - fileNames.end() ), - importFaults ); + RifInputPropertyLoader::loadAndSynchronizeInputProperties( m_inputPropertyCollection, + this->eclipseCaseData(), + std::vector( fileNames.begin(), fileNames.end() ), + importFaults ); return true; } diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseResultDefinition.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseResultDefinition.cpp index 619ef591a7..b00c952e1c 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseResultDefinition.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseResultDefinition.cpp @@ -350,7 +350,7 @@ void RimEclipseResultDefinition::fieldChangedByUi( const caf::PdmFieldHandle* ch if ( contourMapView ) { - contourMapView->contourMapProjection()->updatedWeightingResult(); + contourMapView->contourMapProjection()->clearGridMappingAndRedraw(); } loadDataAndUpdate(); @@ -360,7 +360,7 @@ void RimEclipseResultDefinition::fieldChangedByUi( const caf::PdmFieldHandle* ch { if ( contourMapView ) { - contourMapView->contourMapProjection()->updatedWeightingResult(); + contourMapView->contourMapProjection()->clearGridMappingAndRedraw(); } loadDataAndUpdate(); @@ -508,7 +508,7 @@ void RimEclipseResultDefinition::updateAnyFieldHasChanged() this->firstAncestorOrThisOfType( contourMap ); if ( contourMap ) { - contourMap->updatedWeightingResult(); + contourMap->clearGridMappingAndRedraw(); } RimWellLogTrack* wellLogTrack = nullptr; diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp index 089ed6de2b..6b2bf24e78 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp @@ -66,6 +66,7 @@ #include "RimIntersectionCollection.h" #include "RimIntersectionResultDefinition.h" #include "RimIntersectionResultsDefinitionCollection.h" +#include "RimMultipleEclipseResults.h" #include "RimOilField.h" #include "RimProject.h" #include "RimRegularLegendConfig.h" @@ -211,6 +212,14 @@ RimEclipseView::RimEclipseView() nameConfig()->hidePropertyField( false ); nameConfig()->hideSampleSpacingField( true ); + CAF_PDM_InitFieldNoDefault( &m_additionalResultsForResultInfo, + "AdditionalResultsForResultInfo", + "Additional Result Info" ); + m_additionalResultsForResultInfo = new RimMultipleEclipseResults; + m_additionalResultsForResultInfo->setEclipseView( this ); + + m_cellResult()->setAdditionalUiTreeObjects( { m_additionalResultsForResultInfo() } ); + setDeletable( true ); this->updateAnimations.connect( this, &RimEclipseView::onAnimationsUpdate ); @@ -236,6 +245,14 @@ RimEclipseView::~RimEclipseView() m_eclipseCase = nullptr; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaDefines::View3dContent RimEclipseView::viewContent() const +{ + return RiaDefines::View3dContent::ECLIPSE_DATA; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1639,6 +1656,14 @@ void RimEclipseView::syncronizeLocalAnnotationsFromGlobal() } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimEclipseView::additionalResultsForResultInfo() const +{ + return m_additionalResultsForResultInfo()->additionalResultAddresses(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1811,7 +1836,7 @@ void RimEclipseView::calculateCompletionTypeAndRedrawIfRequired() isDependingOnCompletionType = true; } - for ( const auto& propFilter : m_propertyFilterCollection()->propertyFilters ) + for ( const auto& propFilter : m_propertyFilterCollection()->propertyFilters() ) { if ( propFilter->isActive() && propFilter->resultDefinition()->resultVariable() == RiaResultNames::completionTypeResultName() ) @@ -1834,7 +1859,7 @@ void RimEclipseView::calculateCompletionTypeAndRedrawIfRequired() } } - for ( const auto& propFilter : m_propertyFilterCollection()->propertyFilters ) + for ( const auto& propFilter : m_propertyFilterCollection()->propertyFilters() ) { if ( propFilter->isActive() && propFilter->resultDefinition()->resultVariable() == RiaResultNames::completionTypeResultName() ) @@ -1904,7 +1929,6 @@ void RimEclipseView::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrderin { uiTreeOrdering.add( m_overlayInfoConfig() ); uiTreeOrdering.add( m_gridCollection() ); - uiTreeOrdering.add( cellResult() ); uiTreeOrdering.add( cellEdgeResult() ); uiTreeOrdering.add( cellFilterCollection() ); diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseView.h b/ApplicationLibCode/ProjectDataModel/RimEclipseView.h index 77367dd1d0..858357a73e 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseView.h +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseView.h @@ -66,6 +66,8 @@ class RimTernaryLegendConfig; class RimEclipseResultDefinition; class RimElementVectorResult; class RimStreamlineInViewCollection; +class RimMultipleEclipseResults; +class RigEclipseResultAddress; namespace cvf { @@ -87,6 +89,8 @@ class RimEclipseView : public RimGridView RimEclipseView(); ~RimEclipseView() override; + RiaDefines::View3dContent viewContent() const override; + RimEclipseCellColors* cellResult() const; RimCellEdgeColors* cellEdgeResult() const; RimElementVectorResult* elementVectorResult() const; @@ -156,6 +160,8 @@ class RimEclipseView : public RimGridView void syncronizeLocalAnnotationsFromGlobal(); + std::vector additionalResultsForResultInfo() const; + protected: void initAfterRead() override; void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; @@ -237,4 +243,6 @@ class RimEclipseView : public RimGridView cvf::ref m_streamlinesPartManager; std::vector m_visibleGridParts; + + caf::PdmChildField m_additionalResultsForResultInfo; }; diff --git a/ApplicationLibCode/ProjectDataModel/RimEnsembleFractureStatisticsPlot.cpp b/ApplicationLibCode/ProjectDataModel/RimEnsembleFractureStatisticsPlot.cpp index 5071a6bbd3..fafdebe8f2 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEnsembleFractureStatisticsPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEnsembleFractureStatisticsPlot.cpp @@ -94,8 +94,7 @@ void RimEnsembleFractureStatisticsPlot::defineUiOrdering( QString uiConfigName, bool showNumHistogramBins = true; RimStatisticsPlot::uiOrderingForHistogram( uiConfigName, uiOrdering, showNumHistogramBins ); - caf::PdmUiGroup* plotLayoutGroup = uiOrdering.addNewGroup( "Plot Layout" ); - RimStatisticsPlot::uiOrderingForPlotLayout( uiConfigName, *plotLayoutGroup ); + uiOrderingForLegendsAndFonts( uiConfigName, uiOrdering ); uiOrdering.skipRemainingFields( true ); } diff --git a/ApplicationLibCode/ProjectDataModel/RimGridCalculation.cpp b/ApplicationLibCode/ProjectDataModel/RimGridCalculation.cpp index 4682e4a2f3..cf44e11a1a 100644 --- a/ApplicationLibCode/ProjectDataModel/RimGridCalculation.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimGridCalculation.cpp @@ -22,14 +22,19 @@ #include "RiaLogging.h" #include "RiaPorosityModel.h" +#include "RigActiveCellInfo.h" #include "RimEclipseCase.h" #include "RimEclipseCellColors.h" #include "RimEclipseView.h" #include "RimGridCalculationVariable.h" +#include "RimProject.h" #include "RimReloadCaseTools.h" +#include "RimTools.h" #include "RigCaseCellResultsData.h" +#include "RigEclipseCaseData.h" #include "RigEclipseResultAddress.h" +#include "RigGridManager.h" #include "RigMainGrid.h" #include "RigResultAccessor.h" #include "RigResultAccessorFactory.h" @@ -38,20 +43,41 @@ CAF_PDM_SOURCE_INIT( RimGridCalculation, "RimGridCalculation" ); +namespace caf +{ +template <> +void caf::AppEnum::setUp() +{ + addItem( RimGridCalculation::DefaultValueType::POSITIVE_INFINITY, "POSITIVE_INFINITY", "Infinity" ); + addItem( RimGridCalculation::DefaultValueType::FROM_PROPERTY, "FROM_PROPERTY", "Property Value" ); + addItem( RimGridCalculation::DefaultValueType::USER_DEFINED, "USER_DEFINED", "User Defined Custom Value" ); + setDefault( RimGridCalculation::DefaultValueType::POSITIVE_INFINITY ); +} +}; // namespace caf + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RimGridCalculation::RimGridCalculation() { CAF_PDM_InitObject( "RimGridCalculation", ":/octave.png", "Calculation", "" ); + CAF_PDM_InitFieldNoDefault( &m_cellFilterView, "VisibleCellView", "Filter by 3d View Visibility" ); + CAF_PDM_InitFieldNoDefault( &m_defaultValueType, "DefaultValueType", "Non-visible Cell Value" ); + CAF_PDM_InitField( &m_defaultValue, "DefaultValue", 0.0, "Custom Value" ); + CAF_PDM_InitFieldNoDefault( &m_destinationCase, "DestinationCase", "Destination Case" ); + CAF_PDM_InitField( &m_defaultPropertyVariableIndex, "DefaultPropertyVariableName", 0, "Property Variable Name" ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimGridCalculationVariable* RimGridCalculation::createVariable() const +RimGridCalculationVariable* RimGridCalculation::createVariable() { - return new RimGridCalculationVariable; + auto variable = new RimGridCalculationVariable; + + variable->eclipseResultChanged.connect( this, &RimGridCalculation::onVariableUpdated ); + + return variable; } //-------------------------------------------------------------------------------------------------- @@ -61,7 +87,7 @@ bool RimGridCalculation::calculate() { QString leftHandSideVariableName = RimGridCalculation::findLeftHandSide( m_expression ); - RimEclipseCase* eclipseCase = findEclipseCaseFromVariables(); + RimEclipseCase* eclipseCase = outputEclipseCase(); if ( !eclipseCase ) { RiaLogging::errorInMessageBox( nullptr, @@ -77,6 +103,17 @@ bool RimGridCalculation::calculate() return false; } + for ( auto variableCase : inputCases() ) + { + if ( !eclipseCase->isGridSizeEqualTo( variableCase ) ) + { + QString msg = "Detected IJK mismatch between input cases and destination case. All grid " + "cases must have identical IJK sizes."; + RiaLogging::errorInMessageBox( nullptr, "Grid Property Calculator", msg ); + return false; + } + } + auto porosityModel = RiaDefines::PorosityModelType::MATRIX_MODEL; RigEclipseResultAddress resAddr( RiaDefines::ResultCatType::GENERATED, leftHandSideVariableName ); @@ -88,7 +125,9 @@ bool RimGridCalculation::calculate() eclipseCase->results( porosityModel )->clearScalarResult( resAddr ); - const size_t timeStepCount = eclipseCase->results( porosityModel )->maxTimeStepCount(); + // If an input grid is present, max time step count is zero. Make sure the time step count for the calculation is + // always 1 or more. + const size_t timeStepCount = std::max( size_t( 1 ), eclipseCase->results( porosityModel )->maxTimeStepCount() ); std::vector>* scalarResultFrames = eclipseCase->results( porosityModel )->modifiableCellScalarResultTimesteps( resAddr ); @@ -101,7 +140,7 @@ bool RimGridCalculation::calculate() { RimGridCalculationVariable* v = dynamic_cast( m_variables[i] ); CAF_ASSERT( v != nullptr ); - values.push_back( getInputVectorForVariable( v, tsId, porosityModel ) ); + values.push_back( getInputVectorForVariable( v, tsId, porosityModel, outputEclipseCase() ) ); } ExpressionParser parser; @@ -121,12 +160,15 @@ bool RimGridCalculation::calculate() if ( evaluatedOk ) { - auto [cellFilterView, defaultValueConfig] = findFilterValuesFromVariables(); - - if ( cellFilterView ) + if ( m_cellFilterView() ) { - auto [defaultValueType, defaultValue] = defaultValueConfig; - filterResults( cellFilterView, values, defaultValueType, defaultValue, resultValues ); + filterResults( m_cellFilterView(), + values, + m_defaultValueType(), + m_defaultValue(), + resultValues, + porosityModel, + outputEclipseCase() ); } scalarResultFrames->at( tsId ) = resultValues; @@ -151,51 +193,176 @@ bool RimGridCalculation::calculate() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimEclipseCase* RimGridCalculation::findEclipseCaseFromVariables() const +RimEclipseCase* RimGridCalculation::outputEclipseCase() const { - for ( auto variable : m_variables ) + return m_destinationCase; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimGridCalculation::inputCases() const +{ + std::vector cases; + + for ( const auto& variable : m_variables ) { - RimGridCalculationVariable* v = dynamic_cast( variable.p() ); - CAF_ASSERT( v != nullptr ); + auto* v = dynamic_cast( variable.p() ); - if ( v->eclipseCase() ) return v->eclipseCase(); + if ( v->eclipseCase() ) cases.push_back( v->eclipseCase() ); } - return nullptr; + return cases; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimGridCalculation::DefaultValueConfig RimGridCalculation::defaultValueConfiguration() const +{ + if ( m_defaultValueType() == RimGridCalculation::DefaultValueType::USER_DEFINED ) + return std::make_pair( m_defaultValueType(), m_defaultValue() ); + + return std::make_pair( m_defaultValueType(), HUGE_VAL ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::pair - RimGridCalculation::findFilterValuesFromVariables() const +void RimGridCalculation::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) { - for ( auto variable : m_variables ) + RimUserDefinedCalculation::defineUiOrdering( uiConfigName, uiOrdering ); + + uiOrdering.add( &m_destinationCase ); + + caf::PdmUiGroup* filterGroup = uiOrdering.addNewGroup( "Cell Filter" ); + filterGroup->setCollapsedByDefault(); + filterGroup->add( &m_cellFilterView ); + + if ( m_cellFilterView() != nullptr ) { - RimGridCalculationVariable* v = dynamic_cast( variable.p() ); - CAF_ASSERT( v != nullptr ); + filterGroup->add( &m_defaultValueType ); - if ( v->cellFilterView() ) return std::make_pair( v->cellFilterView(), v->defaultValueConfiguration() ); + if ( m_defaultValueType() == RimGridCalculation::DefaultValueType::FROM_PROPERTY ) + filterGroup->add( &m_defaultPropertyVariableIndex ); + else if ( m_defaultValueType() == RimGridCalculation::DefaultValueType::USER_DEFINED ) + filterGroup->add( &m_defaultValue ); } - return std::pair( nullptr, std::make_pair( RimGridCalculationVariable::DefaultValueType::POSITIVE_INFINITY, HUGE_VAL ) ); + uiOrdering.skipRemainingFields(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -int RimGridCalculation::findFilterVariableIndex() const +QList RimGridCalculation::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) { - for ( size_t i = 0; i < m_variables.size(); i++ ) + QList options; + + if ( fieldNeedingOptions == &m_cellFilterView ) { - auto variable = m_variables[i]; - RimGridCalculationVariable* v = dynamic_cast( variable ); - CAF_ASSERT( v != nullptr ); + options.push_back( caf::PdmOptionItemInfo( "Disabled", nullptr ) ); - if ( v->cellFilterView() ) return static_cast( i ); + std::vector views; + RimProject::current()->allViews( views ); + + RimEclipseCase* firstEclipseCase = nullptr; + if ( !inputCases().empty() ) firstEclipseCase = inputCases().front(); + + if ( firstEclipseCase ) + { + for ( auto* view : views ) + { + auto eclipseView = dynamic_cast( view ); + if ( !eclipseView ) continue; + if ( !firstEclipseCase->isGridSizeEqualTo( eclipseView->eclipseCase() ) ) continue; + + options.push_back( caf::PdmOptionItemInfo( view->autoName(), view, false, view->uiIconProvider() ) ); + } + } } + else if ( fieldNeedingOptions == &m_destinationCase ) + { + if ( inputCases().empty() ) + { + RimTools::eclipseCaseOptionItems( &options ); + } + else + { + RimEclipseCase* firstInputCase = inputCases()[0]; + + RimProject* proj = RimProject::current(); + if ( proj ) + { + std::vector cases; + proj->allCases( cases ); + + for ( RimCase* c : cases ) + { + auto* eclipseCase = dynamic_cast( c ); + if ( !eclipseCase ) continue; + if ( !firstInputCase->isGridSizeEqualTo( eclipseCase ) ) continue; - return -1; + options.push_back( caf::PdmOptionItemInfo( c->caseUserDescription(), c, false, c->uiIconProvider() ) ); + } + } + } + + options.push_front( caf::PdmOptionItemInfo( "None", nullptr ) ); + } + else if ( fieldNeedingOptions == &m_defaultPropertyVariableIndex ) + { + for ( int i = 0; i < static_cast( m_variables.size() ); i++ ) + { + auto v = dynamic_cast( m_variables[i] ); + + QString optionText = v->name(); + options.push_back( caf::PdmOptionItemInfo( optionText, i ) ); + } + } + return options; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimGridCalculation::initAfterRead() +{ + for ( auto& variable : m_variables ) + { + auto gridVar = dynamic_cast( variable.p() ); + if ( gridVar ) + { + gridVar->eclipseResultChanged.connect( this, &RimGridCalculation::onVariableUpdated ); + + if ( m_destinationCase == nullptr ) m_destinationCase = gridVar->eclipseCase(); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimGridCalculation::onVariableUpdated( const SignalEmitter* emitter ) +{ + if ( m_destinationCase == nullptr ) + { + auto variable = dynamic_cast( emitter ); + if ( variable && variable->eclipseCase() ) + { + m_destinationCase = variable->eclipseCase(); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RigEclipseResultAddress RimGridCalculation::outputAddress() const +{ + QString leftHandSideVariableName = RimGridCalculation::findLeftHandSide( m_expression ); + RigEclipseResultAddress resAddr( RiaDefines::ResultCatType::GENERATED, leftHandSideVariableName ); + return resAddr; } //-------------------------------------------------------------------------------------------------- @@ -203,7 +370,8 @@ int RimGridCalculation::findFilterVariableIndex() const //-------------------------------------------------------------------------------------------------- std::vector RimGridCalculation::getInputVectorForVariable( RimGridCalculationVariable* v, size_t tsId, - RiaDefines::PorosityModelType porosityModel ) const + RiaDefines::PorosityModelType porosityModel, + RimEclipseCase* outputEclipseCase ) const { int timeStep = v->timeStep(); @@ -228,7 +396,9 @@ std::vector RimGridCalculation::getInputVectorForVariable( RimGridCalcul auto mainGrid = v->eclipseCase()->mainGrid(); size_t maxGridCount = mainGrid->gridCount(); - size_t cellCount = mainGrid->globalCellArray().size(); + auto activeCellInfo = outputEclipseCase->eclipseCaseData()->activeCellInfo( porosityModel ); + size_t cellCount = activeCellInfo->reservoirActiveCellCount(); + std::vector inputValues( cellCount ); for ( size_t gridIdx = 0; gridIdx < maxGridCount; ++gridIdx ) { @@ -245,7 +415,11 @@ std::vector RimGridCalculation::getInputVectorForVariable( RimGridCalcul for ( int localGridCellIdx = 0; localGridCellIdx < static_cast( grid->cellCount() ); localGridCellIdx++ ) { const size_t reservoirCellIndex = grid->reservoirCellIndex( localGridCellIdx ); - inputValues[reservoirCellIndex] = sourceResultAccessor->cellScalar( localGridCellIdx ); + if ( activeCellInfo->isActive( reservoirCellIndex ) ) + { + size_t cellResultIndex = activeCellInfo->cellResultIndex( reservoirCellIndex ); + inputValues[cellResultIndex] = sourceResultAccessor->cellScalar( localGridCellIdx ); + } } } @@ -255,16 +429,23 @@ std::vector RimGridCalculation::getInputVectorForVariable( RimGridCalcul //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimGridCalculation::replaceFilteredValuesWithVector( const std::vector& inputValues, - cvf::ref visibility, - std::vector& resultValues ) +void RimGridCalculation::replaceFilteredValuesWithVector( const std::vector& inputValues, + cvf::ref visibility, + std::vector& resultValues, + RiaDefines::PorosityModelType porosityModel, + RimEclipseCase* outputEclipseCase ) + { + auto activeCellInfo = outputEclipseCase->eclipseCaseData()->activeCellInfo( porosityModel ); + int numCells = static_cast( visibility->size() ); + #pragma omp parallel for - for ( int i = 0; i < static_cast( resultValues.size() ); i++ ) + for ( int i = 0; i < numCells; i++ ) { - if ( !visibility->val( i ) ) + if ( !visibility->val( i ) && activeCellInfo->isActive( i ) ) { - resultValues[i] = inputValues[i]; + size_t cellResultIndex = activeCellInfo->cellResultIndex( i ); + resultValues[cellResultIndex] = inputValues[cellResultIndex]; } } } @@ -272,16 +453,23 @@ void RimGridCalculation::replaceFilteredValuesWithVector( const std::vector visibility, - std::vector& resultValues ) +void RimGridCalculation::replaceFilteredValuesWithDefaultValue( double defaultValue, + cvf::ref visibility, + std::vector& resultValues, + RiaDefines::PorosityModelType porosityModel, + RimEclipseCase* outputEclipseCase ) + { + auto activeCellInfo = outputEclipseCase->eclipseCaseData()->activeCellInfo( porosityModel ); + int numCells = static_cast( visibility->size() ); + #pragma omp parallel for - for ( int i = 0; i < static_cast( resultValues.size() ); i++ ) + for ( int i = 0; i < numCells; i++ ) { - if ( !visibility->val( i ) ) + if ( !visibility->val( i ) && activeCellInfo->isActive( i ) ) { - resultValues[i] = defaultValue; + size_t cellResultIndex = activeCellInfo->cellResultIndex( i ); + resultValues[cellResultIndex] = defaultValue; } } } @@ -289,22 +477,38 @@ void RimGridCalculation::replaceFilteredValuesWithDefaultValue( double //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimGridCalculation::filterResults( RimGridView* cellFilterView, - const std::vector>& values, - RimGridCalculationVariable::DefaultValueType defaultValueType, - double defaultValue, - std::vector& resultValues ) const +void RimGridCalculation::filterResults( RimGridView* cellFilterView, + const std::vector>& values, + RimGridCalculation::DefaultValueType defaultValueType, + double defaultValue, + std::vector& resultValues, + RiaDefines::PorosityModelType porosityModel, + RimEclipseCase* outputEclipseCase ) const + { auto visibility = cellFilterView->currentTotalCellVisibility(); - if ( defaultValueType == RimGridCalculationVariable::DefaultValueType::FROM_PROPERTY ) + if ( defaultValueType == RimGridCalculation::DefaultValueType::FROM_PROPERTY ) { - int filterVariableIndex = findFilterVariableIndex(); - replaceFilteredValuesWithVector( values[filterVariableIndex], visibility, resultValues ); + if ( m_defaultPropertyVariableIndex < static_cast( values.size() ) ) + replaceFilteredValuesWithVector( values[m_defaultPropertyVariableIndex], + visibility, + resultValues, + porosityModel, + outputEclipseCase ); + else + { + QString errorMessage = + "Invalid input data for default result property, no data assigned to non-visible cells."; + RiaLogging::errorInMessageBox( nullptr, "Grid Property Calculator", errorMessage ); + } } else { - replaceFilteredValuesWithDefaultValue( defaultValue, visibility, resultValues ); + double valueToUse = defaultValue; + if ( defaultValueType == RimGridCalculation::DefaultValueType::POSITIVE_INFINITY ) valueToUse = HUGE_VAL; + + replaceFilteredValuesWithDefaultValue( valueToUse, visibility, resultValues, porosityModel, outputEclipseCase ); } } @@ -313,7 +517,7 @@ void RimGridCalculation::filterResults( RimGridView* //-------------------------------------------------------------------------------------------------- void RimGridCalculation::updateDependentObjects() { - RimEclipseCase* eclipseCase = findEclipseCaseFromVariables(); + RimEclipseCase* eclipseCase = outputEclipseCase(); if ( eclipseCase ) { RimReloadCaseTools::updateAll3dViews( eclipseCase ); @@ -331,7 +535,7 @@ void RimGridCalculation::removeDependentObjects() RigEclipseResultAddress resAddr( RiaDefines::ResultCatType::GENERATED, leftHandSideVariableName ); - RimEclipseCase* eclipseCase = findEclipseCaseFromVariables(); + RimEclipseCase* eclipseCase = outputEclipseCase(); if ( eclipseCase ) { // Select "None" result if the result that is being removed were displayed in a view. diff --git a/ApplicationLibCode/ProjectDataModel/RimGridCalculation.h b/ApplicationLibCode/ProjectDataModel/RimGridCalculation.h index 9d4b559791..2fa8aefdcf 100644 --- a/ApplicationLibCode/ProjectDataModel/RimGridCalculation.h +++ b/ApplicationLibCode/ProjectDataModel/RimGridCalculation.h @@ -22,10 +22,12 @@ #include "RimGridCalculationVariable.h" #include "RimUserDefinedCalculation.h" +#include "cafSignal.h" #include "cvfArray.h" class RimEclipseCase; class RimGridView; +class RigEclipseResultAddress; //================================================================================================== /// @@ -36,40 +38,70 @@ class RimGridCalculation : public RimUserDefinedCalculation CAF_PDM_HEADER_INIT; public: + enum class DefaultValueType + { + POSITIVE_INFINITY, + FROM_PROPERTY, + USER_DEFINED + }; + RimGridCalculation(); bool calculate() override; void updateDependentObjects() override; void removeDependentObjects() override; + RimEclipseCase* outputEclipseCase() const; + RigEclipseResultAddress outputAddress() const; + + std::vector inputCases() const; + protected: void onChildrenUpdated( caf::PdmChildArrayFieldHandle* childArray, std::vector& updatedObjects ) override; - RimGridCalculationVariable* createVariable() const override; + RimGridCalculationVariable* createVariable() override; std::pair validateVariables(); - RimEclipseCase* findEclipseCaseFromVariables() const; - std::vector getInputVectorForVariable( RimGridCalculationVariable* v, size_t tsId, - RiaDefines::PorosityModelType porosityModel ) const; - - void filterResults( RimGridView* cellFilterView, - const std::vector>& values, - RimGridCalculationVariable::DefaultValueType defaultValueType, - double defaultValue, - std::vector& resultValues ) const; - - static void replaceFilteredValuesWithVector( const std::vector& inputValues, - cvf::ref visibility, - std::vector& resultValues ); - - static void replaceFilteredValuesWithDefaultValue( double defaultValue, - cvf::ref visibility, - std::vector& resultValues ); - - int findFilterVariableIndex() const; - - std::pair findFilterValuesFromVariables() const; + RiaDefines::PorosityModelType porosityModel, + RimEclipseCase* outputEclipseCase ) const; + + void filterResults( RimGridView* cellFilterView, + const std::vector>& values, + RimGridCalculation::DefaultValueType defaultValueType, + double defaultValue, + std::vector& resultValues, + RiaDefines::PorosityModelType porosityModel, + RimEclipseCase* outputEclipseCase ) const; + + static void replaceFilteredValuesWithVector( const std::vector& inputValues, + cvf::ref visibility, + std::vector& resultValues, + RiaDefines::PorosityModelType porosityModel, + RimEclipseCase* outputEclipseCase ); + + static void replaceFilteredValuesWithDefaultValue( double defaultValue, + cvf::ref visibility, + std::vector& resultValues, + RiaDefines::PorosityModelType porosityModel, + RimEclipseCase* outputEclipseCase ); + + using DefaultValueConfig = std::pair; + DefaultValueConfig defaultValueConfiguration() const; + + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; + void initAfterRead() override; + +private: + void onVariableUpdated( const SignalEmitter* emitter ); + +private: + caf::PdmPtrField m_cellFilterView; + caf::PdmField> m_defaultValueType; + caf::PdmField m_defaultValue; + caf::PdmPtrField m_destinationCase; + caf::PdmField m_defaultPropertyVariableIndex; }; diff --git a/ApplicationLibCode/ProjectDataModel/RimGridCalculationCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimGridCalculationCollection.cpp index 4dd394ad60..2c212e30d9 100644 --- a/ApplicationLibCode/ProjectDataModel/RimGridCalculationCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimGridCalculationCollection.cpp @@ -18,6 +18,8 @@ #include "RimGridCalculationCollection.h" +#include "RiaLogging.h" +#include "RigEclipseResultAddress.h" #include "RimGridCalculation.h" #include "cafPdmUiGroup.h" @@ -40,6 +42,59 @@ RimGridCalculation* RimGridCalculationCollection::createCalculation() const return new RimGridCalculation; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimGridCalculationCollection::sortedGridCalculations() const +{ + std::vector sortedCalculations; + for ( auto userCalculation : calculations() ) + { + auto gridCalculation = dynamic_cast( userCalculation ); + if ( gridCalculation ) sortedCalculations.emplace_back( gridCalculation ); + } + + // Check if source calculation is depending on other. Will check one level dependency. + auto isSourceDependingOnOther = []( const RimGridCalculation* source, const RimGridCalculation* other ) -> bool { + auto outputCase = source->outputEclipseCase(); + auto outputAdr = source->outputAddress(); + + for ( auto v : other->allVariables() ) + { + auto gridVariable = dynamic_cast( v ); + if ( gridVariable->eclipseCase() == outputCase && + outputAdr.resultCatType() == gridVariable->resultCategoryType() && + outputAdr.resultName() == gridVariable->resultVariable() ) + { + return true; + } + } + + return false; + }; + + for ( auto source : sortedCalculations ) + { + for ( auto other : sortedCalculations ) + { + if ( source == other ) continue; + + if ( isSourceDependingOnOther( source, other ) && isSourceDependingOnOther( other, source ) ) + { + QString txt = "Detected circular dependency between " + source->description() + " and " + + other->description(); + RiaLogging::error( txt ); + + return sortedCalculations; + } + } + } + + std::sort( sortedCalculations.begin(), sortedCalculations.end(), isSourceDependingOnOther ); + + return sortedCalculations; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimGridCalculationCollection.h b/ApplicationLibCode/ProjectDataModel/RimGridCalculationCollection.h index e5bc424e37..03a767837a 100644 --- a/ApplicationLibCode/ProjectDataModel/RimGridCalculationCollection.h +++ b/ApplicationLibCode/ProjectDataModel/RimGridCalculationCollection.h @@ -34,7 +34,8 @@ class RimGridCalculationCollection : public RimUserDefinedCalculationCollection void rebuildCaseMetaData() override; - RimGridCalculation* createCalculation() const override; + RimGridCalculation* createCalculation() const override; + std::vector sortedGridCalculations() const; private: void initAfterRead() override; diff --git a/ApplicationLibCode/ProjectDataModel/RimGridCalculationVariable.cpp b/ApplicationLibCode/ProjectDataModel/RimGridCalculationVariable.cpp index 6a6144a3e6..335b84540f 100644 --- a/ApplicationLibCode/ProjectDataModel/RimGridCalculationVariable.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimGridCalculationVariable.cpp @@ -23,34 +23,23 @@ #include "RiaPorosityModel.h" #include "RiaResultNames.h" -#include "RimGridCalculation.h" -#include "RiuDragDrop.h" - #include "RigCaseCellResultsData.h" #include "RimEclipseCase.h" #include "RimEclipseResultAddress.h" -#include "RimEclipseView.h" +#include "RimGridCalculation.h" #include "RimTools.h" -CAF_PDM_SOURCE_INIT( RimGridCalculationVariable, "RimGridCalculationVariable" ); +#include "RiuDragDrop.h" -namespace caf -{ -template <> -void caf::AppEnum::setUp() -{ - addItem( RimGridCalculationVariable::DefaultValueType::POSITIVE_INFINITY, "POSITIVE_INFINITY", "Inf" ); - addItem( RimGridCalculationVariable::DefaultValueType::FROM_PROPERTY, "FROM_PROPERTY", "Property Value" ); - addItem( RimGridCalculationVariable::DefaultValueType::USER_DEFINED, "USER_DEFINED", "User Defined" ); - setDefault( RimGridCalculationVariable::DefaultValueType::POSITIVE_INFINITY ); -} -}; // namespace caf +CAF_PDM_SOURCE_INIT( RimGridCalculationVariable, "RimGridCalculationVariable" ); //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RimGridCalculationVariable::RimGridCalculationVariable() + : eclipseResultChanged( this ) + { CAF_PDM_InitObject( "RimGridCalculationVariable", ":/octave.png" ); @@ -58,9 +47,6 @@ RimGridCalculationVariable::RimGridCalculationVariable() CAF_PDM_InitField( &m_resultVariable, "ResultVariable", RiaResultNames::undefinedResultName(), "Variable" ); CAF_PDM_InitFieldNoDefault( &m_eclipseCase, "EclipseGridCase", "Grid Case" ); CAF_PDM_InitField( &m_timeStep, "TimeStep", allTimeStepsValue(), "Time Step" ); - CAF_PDM_InitFieldNoDefault( &m_cellFilterView, "VisibleCellView", "Filter by 3d View Visibility" ); - CAF_PDM_InitFieldNoDefault( &m_defaultValueType, "DefaultValueType", "Default Value Type" ); - CAF_PDM_InitField( &m_defaultValue, "DefaultValue", 0.0, "Default Value" ); } //-------------------------------------------------------------------------------------------------- @@ -86,35 +72,11 @@ void RimGridCalculationVariable::defineUiOrdering( QString uiConfigName, caf::Pd uiOrdering.add( &m_resultType ); uiOrdering.add( &m_resultVariable ); uiOrdering.add( &m_timeStep ); - uiOrdering.add( &m_cellFilterView ); - uiOrdering.add( &m_defaultValueType ); - uiOrdering.add( &m_defaultValue ); uiOrdering.skipRemainingFields(); m_resultType.uiCapability()->setUiReadOnly( m_eclipseCase == nullptr ); m_timeStep.uiCapability()->setUiReadOnly( m_resultType == RiaDefines::ResultCatType::STATIC_NATIVE ); - - // Can have only one variable with cell filter at a time. - // Set read-only state based on the state of the sibling variables. - RimGridCalculation* calculation = nullptr; - firstAncestorOfType( calculation ); - - bool hasOtherVariableWithFilter = false; - for ( auto variable : calculation->allVariables() ) - { - auto v = dynamic_cast( variable ); - if ( variable != this && v->cellFilterView() ) - { - hasOtherVariableWithFilter = true; - } - } - - m_cellFilterView.uiCapability()->setUiReadOnly( m_eclipseCase == nullptr || hasOtherVariableWithFilter ); - m_defaultValueType.uiCapability()->setUiReadOnly( m_cellFilterView == nullptr || hasOtherVariableWithFilter ); - m_defaultValue.uiCapability()->setUiReadOnly( - m_cellFilterView == nullptr || - defaultValueType() != RimGridCalculationVariable::DefaultValueType::USER_DEFINED || hasOtherVariableWithFilter ); } //-------------------------------------------------------------------------------------------------- @@ -158,18 +120,6 @@ QList RimTools::timeStepsForCase( m_eclipseCase(), &options ); } - else if ( fieldNeedingOptions == &m_cellFilterView ) - { - if ( m_eclipseCase ) - { - options.push_back( caf::PdmOptionItemInfo( "Disabled", nullptr ) ); - for ( RimEclipseView* view : m_eclipseCase->reservoirViews.children() ) - { - CVF_ASSERT( view && "Really always should have a valid view pointer in ReservoirViews" ); - options.push_back( caf::PdmOptionItemInfo( view->name(), view, false, view->uiIconProvider() ) ); - } - } - } return options; } @@ -234,41 +184,6 @@ int RimGridCalculationVariable::allTimeStepsValue() return -1; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimGridView* RimGridCalculationVariable::cellFilterView() const -{ - return m_cellFilterView; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -double RimGridCalculationVariable::defaultValue() const -{ - return m_defaultValue; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimGridCalculationVariable::DefaultValueType RimGridCalculationVariable::defaultValueType() const -{ - return m_defaultValueType(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimGridCalculationVariable::DefaultValueConfig RimGridCalculationVariable::defaultValueConfiguration() const -{ - if ( m_defaultValueType() == RimGridCalculationVariable::DefaultValueType::USER_DEFINED ) - return std::make_pair( m_defaultValueType(), m_defaultValue() ); - - return std::make_pair( m_defaultValueType(), HUGE_VAL ); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -292,5 +207,8 @@ void RimGridCalculationVariable::setEclipseResultAddress( const RimEclipseResult m_resultVariable = address.resultName(); m_resultType = address.resultType(); m_eclipseCase = address.eclipseCase(); + + eclipseResultChanged.send(); + updateConnectedEditors(); } diff --git a/ApplicationLibCode/ProjectDataModel/RimGridCalculationVariable.h b/ApplicationLibCode/ProjectDataModel/RimGridCalculationVariable.h index 59e3f9e20b..1bc1ba37c7 100644 --- a/ApplicationLibCode/ProjectDataModel/RimGridCalculationVariable.h +++ b/ApplicationLibCode/ProjectDataModel/RimGridCalculationVariable.h @@ -25,10 +25,10 @@ #include "cafPdmField.h" #include "cafPdmObject.h" #include "cafPdmPtrField.h" +#include "cafSignal.h" class RimEclipseCase; class RimEclipseResultAddress; -class RimGridView; class RigCaseCellResultsData; //================================================================================================== @@ -40,27 +40,16 @@ class RimGridCalculationVariable : public RimUserDefinedCalculationVariable CAF_PDM_HEADER_INIT; public: - enum class DefaultValueType - { - POSITIVE_INFINITY, - FROM_PROPERTY, - USER_DEFINED - }; - RimGridCalculationVariable(); + caf::Signal<> eclipseResultChanged; + QString displayString() const override; RimEclipseCase* eclipseCase() const; RiaDefines::ResultCatType resultCategoryType() const; QString resultVariable() const; int timeStep() const; - RimGridView* cellFilterView() const; - double defaultValue() const; - DefaultValueType defaultValueType() const; - - using DefaultValueConfig = std::pair; - DefaultValueConfig defaultValueConfiguration() const; static int allTimeStepsValue(); @@ -81,7 +70,4 @@ class RimGridCalculationVariable : public RimUserDefinedCalculationVariable caf::PdmField> m_resultType; caf::PdmField m_resultVariable; caf::PdmField m_timeStep; - caf::PdmPtrField m_cellFilterView; - caf::PdmField> m_defaultValueType; - caf::PdmField m_defaultValue; }; diff --git a/ApplicationLibCode/ProjectDataModel/RimGridStatisticsPlot.cpp b/ApplicationLibCode/ProjectDataModel/RimGridStatisticsPlot.cpp index 2298cf558c..a4baaa3d60 100644 --- a/ApplicationLibCode/ProjectDataModel/RimGridStatisticsPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimGridStatisticsPlot.cpp @@ -160,8 +160,7 @@ void RimGridStatisticsPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOr bool showNumHistogramBins = false; RimStatisticsPlot::uiOrderingForHistogram( uiConfigName, uiOrdering, showNumHistogramBins ); - caf::PdmUiGroup* plotLayoutGroup = uiOrdering.addNewGroup( "Plot Layout" ); - RimStatisticsPlot::uiOrderingForPlotLayout( uiConfigName, *plotLayoutGroup ); + uiOrderingForLegendsAndFonts( uiConfigName, uiOrdering ); uiOrdering.skipRemainingFields( true ); } diff --git a/ApplicationLibCode/ProjectDataModel/RimGridTimeHistoryCurve.cpp b/ApplicationLibCode/ProjectDataModel/RimGridTimeHistoryCurve.cpp index 969bc57b85..342c9c71a8 100644 --- a/ApplicationLibCode/ProjectDataModel/RimGridTimeHistoryCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimGridTimeHistoryCurve.cpp @@ -565,7 +565,7 @@ std::vector RimGridTimeHistoryCurve::daysSinceSimulationStart() const //-------------------------------------------------------------------------------------------------- void RimGridTimeHistoryCurve::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) { - RimPlotCurve::updateOptionSensitivity(); + RimPlotCurve::updateFieldUiState(); uiOrdering.add( &m_geometrySelectionText ); diff --git a/ApplicationLibCode/ProjectDataModel/RimGridView.cpp b/ApplicationLibCode/ProjectDataModel/RimGridView.cpp index 8e6deb57eb..89fe775339 100644 --- a/ApplicationLibCode/ProjectDataModel/RimGridView.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimGridView.cpp @@ -37,8 +37,6 @@ #include "RimTextAnnotation.h" #include "RimTools.h" #include "RimViewController.h" -#include "RimViewLinker.h" -#include "RimViewLinkerCollection.h" #include "RimViewNameConfig.h" #include "RimWellMeasurementCollection.h" #include "RimWellMeasurementInViewCollection.h" @@ -110,35 +108,6 @@ RimGridView::RimGridView() m_surfaceVizModel->setName( "SurfaceModel" ); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimGridView::~RimGridView( void ) -{ - RimProject* proj = RimProject::current(); - - if ( proj && this->isMasterView() ) - { - RimViewLinker* viewLinker = this->assosiatedViewLinker(); - viewLinker->setMasterView( nullptr ); - - delete proj->viewLinkerCollection->viewLinker(); - proj->viewLinkerCollection->viewLinker = nullptr; - - proj->uiCapability()->updateConnectedEditors(); - } - - RimViewController* vController = this->viewController(); - if ( proj && vController ) - { - vController->setManagedView( nullptr ); - vController->ownerViewLinker()->removeViewController( vController ); - delete vController; - - proj->uiCapability()->updateConnectedEditors(); - } -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -306,43 +275,6 @@ void RimGridView::replaceCellFilterCollectionWithOverride() this->uiCapability()->updateConnectedEditors(); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimViewController* RimGridView::viewController() const -{ - std::vector objects; - this->objectsWithReferringPtrFieldsOfType( objects ); - - for ( auto v : objects ) - { - if ( v ) - { - return v; - } - } - - return nullptr; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimViewLinker* RimGridView::assosiatedViewLinker() const -{ - RimViewLinker* viewLinker = this->viewLinkerIfMasterView(); - if ( !viewLinker ) - { - RimViewController* viewController = this->viewController(); - if ( viewController ) - { - viewLinker = viewController->ownerViewLinker(); - } - } - - return viewLinker; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -472,16 +404,6 @@ void RimGridView::fieldChangedByUi( const caf::PdmFieldHandle* changedField, con } Rim3dView::fieldChangedByUi( changedField, oldValue, newValue ); - - if ( changedField == &m_scaleZ ) - { - RimViewLinker* viewLinker = this->assosiatedViewLinker(); - if ( viewLinker ) - { - viewLinker->updateScaleZ( this, scaleZ() ); - viewLinker->updateCamera( this ); - } - } } //-------------------------------------------------------------------------------------------------- @@ -524,25 +446,6 @@ void RimGridView::selectOverlayInfoConfig() Riu3DMainWindowTools::selectAsCurrentItem( m_overlayInfoConfig ); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimViewLinker* RimGridView::viewLinkerIfMasterView() const -{ - std::vector objects; - this->objectsWithReferringPtrFieldsOfType( objects ); - - for ( auto viewLinker : objects ) - { - if ( viewLinker ) - { - return viewLinker; - } - } - - return nullptr; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimGridView.h b/ApplicationLibCode/ProjectDataModel/RimGridView.h index d5c4934c71..6969ab4e15 100644 --- a/ApplicationLibCode/ProjectDataModel/RimGridView.h +++ b/ApplicationLibCode/ProjectDataModel/RimGridView.h @@ -39,7 +39,6 @@ class RimGridView : public Rim3dView public: RimGridView(); - ~RimGridView( void ) override; void showGridCells( bool enableGridCells ); @@ -64,9 +63,6 @@ class RimGridView : public Rim3dView void setOverrideCellFilterCollection( RimCellFilterCollection* rfc ); void replaceCellFilterCollectionWithOverride(); - RimViewController* viewController() const override; - RimViewLinker* assosiatedViewLinker() const override; - bool isGridVisualizationMode() const override; void updateWellMeasurements(); @@ -105,6 +101,5 @@ class RimGridView : public Rim3dView void onCreatePartCollectionFromSelection( cvf::Collection* parts ) override; cvf::ref m_currentReservoirCellVisibility; - RimViewLinker* viewLinkerIfMasterView() const; bool m_previousGridModeMeshLinesWasFaults; }; diff --git a/ApplicationLibCode/ProjectDataModel/RimMultiPlot.cpp b/ApplicationLibCode/ProjectDataModel/RimMultiPlot.cpp index aac63f88a2..fa309ab600 100644 --- a/ApplicationLibCode/ProjectDataModel/RimMultiPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimMultiPlot.cpp @@ -370,7 +370,7 @@ void RimMultiPlot::updateSubPlotNames() //-------------------------------------------------------------------------------------------------- /// Empty default implementation //-------------------------------------------------------------------------------------------------- -void RimMultiPlot::updatePlotWindowTitle() +void RimMultiPlot::updatePlotTitles() { } @@ -559,7 +559,7 @@ QString RimMultiPlot::asciiDataForPlotExport() const void RimMultiPlot::onPlotAdditionOrRemoval() { updateSubPlotNames(); - updatePlotWindowTitle(); + updatePlotTitles(); applyPlotWindowTitleToWidgets(); updateAllRequiredEditors(); updateLayout(); @@ -683,7 +683,7 @@ void RimMultiPlot::fieldChangedByUi( const caf::PdmFieldHandle* changedField, co } else if ( changedField == &m_showPlotWindowTitle || changedField == &m_plotWindowTitle ) { - updatePlotWindowTitle(); + updatePlotTitles(); applyPlotWindowTitleToWidgets(); } else if ( changedField == &m_subTitleFontSize ) @@ -744,7 +744,7 @@ void RimMultiPlot::uiOrderingForMultiPlotLayout( QString uiConfigName, caf::PdmU uiOrdering.add( &m_showIndividualPlotTitles ); uiOrdering.add( &m_subTitleFontSize ); - RimPlotWindow::uiOrderingForPlotLayout( uiConfigName, uiOrdering ); + RimPlotWindow::uiOrderingForLegendsAndFonts( uiConfigName, uiOrdering ); uiOrdering.add( &m_columnCount ); uiOrdering.add( &m_rowsPerPage ); uiOrdering.add( &m_majorTickmarkCount ); @@ -805,7 +805,7 @@ void RimMultiPlot::onLoadDataAndUpdate() m_showPlotLegends = false; updateMdiWindowVisibility(); - updatePlotWindowTitle(); + updatePlotTitles(); applyPlotWindowTitleToWidgets(); updatePlots(); updateLayout(); diff --git a/ApplicationLibCode/ProjectDataModel/RimMultiPlot.h b/ApplicationLibCode/ProjectDataModel/RimMultiPlot.h index 727c2e486a..64ba859cbe 100644 --- a/ApplicationLibCode/ProjectDataModel/RimMultiPlot.h +++ b/ApplicationLibCode/ProjectDataModel/RimMultiPlot.h @@ -77,7 +77,7 @@ class RimMultiPlot : public RimPlotWindow, public RimTypedPlotCollection +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimMultipleEclipseResults.h" + +#include "RimEclipseCellColors.h" +#include "RimEclipseView.h" + +#include "cafPdmUiTreeSelectionEditor.h" + +CAF_PDM_SOURCE_INIT( RimMultipleEclipseResults, "RimMultipleEclipseResults" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimMultipleEclipseResults::RimMultipleEclipseResults() +{ + CAF_PDM_InitObject( "Multiple Result Info", ":/TextAnnotation16x16.png" ); + + CAF_PDM_InitFieldNoDefault( &m_selectedKeywords, "SelectedProperties", "Properties" ); + m_selectedKeywords.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP ); + + m_selectedKeywords.uiCapability()->setUiEditorTypeName( caf::PdmUiTreeSelectionEditor::uiEditorTypeName() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimMultipleEclipseResults::setEclipseView( RimEclipseView* eclipseView ) +{ + m_eclipseView = eclipseView; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimMultipleEclipseResults::additionalResultAddresses() const +{ + if ( !m_eclipseView || !m_eclipseView->currentGridCellResults() || !m_isChecked ) return {}; + + std::set selectedResults; + for ( const auto& result : m_selectedKeywords() ) + { + selectedResults.insert( result ); + } + + std::vector resultAddresses; + + auto gridCellResult = m_eclipseView->currentGridCellResults(); + for ( const auto& res : gridCellResult->existingResults() ) + { + auto candidate = res.resultName(); + if ( selectedResults.count( candidate ) > 0 ) + { + resultAddresses.emplace_back( res ); + } + } + + return resultAddresses; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QList + RimMultipleEclipseResults::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) +{ + if ( fieldNeedingOptions == &m_selectedKeywords ) + { + if ( !m_eclipseView || !m_eclipseView->currentGridCellResults() ) return {}; + + QList options; + + RigCaseCellResultsData* resultData = m_eclipseView->currentGridCellResults(); + std::vector resultCategories = { RiaDefines::ResultCatType::STATIC_NATIVE, + RiaDefines::ResultCatType::DYNAMIC_NATIVE, + RiaDefines::ResultCatType::INPUT_PROPERTY }; + for ( auto catType : resultCategories ) + { + QList allOptions = + RimEclipseResultDefinition::calcOptionsForVariableUiFieldStandard( catType, resultData ); + + bool isFirstOfCategory = true; + for ( const caf::PdmOptionItemInfo& option : allOptions ) + { + if ( resultData->hasResultEntry( RigEclipseResultAddress( catType, option.optionUiText() ) ) ) + { + if ( isFirstOfCategory ) + { + // Add the category title only when there is at least one valid result + options.push_back( + caf::PdmOptionItemInfo::createHeader( caf::AppEnum::uiText( catType ), + true ) ); + isFirstOfCategory = false; + } + + options.push_back( option ); + } + } + } + + return options; + } + + return {}; +} diff --git a/ApplicationLibCode/ProjectDataModel/RimMultipleEclipseResults.h b/ApplicationLibCode/ProjectDataModel/RimMultipleEclipseResults.h new file mode 100644 index 0000000000..1cf2497dcb --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/RimMultipleEclipseResults.h @@ -0,0 +1,49 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022 Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RimCheckableObject.h" + +#include + +class RigEclipseResultAddress; +class RimEclipseView; + +//================================================================================================== +/// +/// +//================================================================================================== +class RimMultipleEclipseResults : public RimCheckableObject +{ + CAF_PDM_HEADER_INIT; + +public: + RimMultipleEclipseResults(); + + void setEclipseView( RimEclipseView* eclipseView ); + + std::vector additionalResultAddresses() const; + +private: + QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; + +private: + caf::PdmField> m_selectedKeywords; + caf::PdmPointer m_eclipseView; +}; diff --git a/ApplicationLibCode/ProjectDataModel/RimNameConfig.h b/ApplicationLibCode/ProjectDataModel/RimNameConfig.h index 933abc8c71..bf23cb0ca7 100644 --- a/ApplicationLibCode/ProjectDataModel/RimNameConfig.h +++ b/ApplicationLibCode/ProjectDataModel/RimNameConfig.h @@ -34,6 +34,10 @@ class RimNameConfigHolderInterface protected: virtual void performAutoNameUpdate() {} + + // Override these two methods to show and use curve name template when assigning a name to the curve + virtual QString createPlotNameFromTemplate( const QString& templateText ) const { return templateText; } + virtual QStringList supportedPlotNameVariables() const { return {}; } }; //================================================================================================== diff --git a/ApplicationLibCode/ProjectDataModel/RimPlot.cpp b/ApplicationLibCode/ProjectDataModel/RimPlot.cpp index 02d557d66c..c69cfbafcc 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimPlot.cpp @@ -303,6 +303,14 @@ void RimPlot::handleWheelEvent( QWheelEvent* event ) { } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimPlot::isCurveHighlightSupported() const +{ + return true; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimPlot.h b/ApplicationLibCode/ProjectDataModel/RimPlot.h index a2395c04af..c89e5cfa67 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlot.h +++ b/ApplicationLibCode/ProjectDataModel/RimPlot.h @@ -105,6 +105,7 @@ class RimPlot : public QObject, public RimPlotWindow virtual void handleDroppedObjects( const std::vector& objects ); virtual std::vector visibleCurvesForLegend(); + virtual bool isCurveHighlightSupported() const; protected: virtual RiuPlotWidget* doCreatePlotViewWidget( QWidget* parent ) = 0; diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotAxisAnnotation.cpp b/ApplicationLibCode/ProjectDataModel/RimPlotAxisAnnotation.cpp index b6f577e501..91ef47fa5f 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotAxisAnnotation.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimPlotAxisAnnotation.cpp @@ -46,6 +46,19 @@ RimPlotAxisAnnotation::RimPlotAxisAnnotation() CAF_PDM_InitFieldNoDefault( &m_rangeStart, "RangeStart", "Range Start" ); CAF_PDM_InitFieldNoDefault( &m_rangeEnd, "RangeEnd", "Range End" ); + + caf::AppEnum defaultStyle = Qt::PenStyle::SolidLine; + CAF_PDM_InitField( &m_penStyle, "PenStyle", defaultStyle, "Pen Style" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimPlotAxisAnnotation* RimPlotAxisAnnotation::createLineAnnotation() +{ + auto annotation = new RimPlotAxisAnnotation(); + annotation->setAnnotationType( RimPlotAxisAnnotation::AnnotationType::LINE ); + return annotation; } //-------------------------------------------------------------------------------------------------- @@ -112,6 +125,22 @@ QColor RimPlotAxisAnnotation::color() const return QColor( 0, 0, 100 ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotAxisAnnotation::setPenStyle( Qt::PenStyle penStyle ) +{ + m_penStyle = penStyle; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +Qt::PenStyle RimPlotAxisAnnotation::penStyle() const +{ + return m_penStyle(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotAxisAnnotation.h b/ApplicationLibCode/ProjectDataModel/RimPlotAxisAnnotation.h index 042ea06842..9a1613687f 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotAxisAnnotation.h +++ b/ApplicationLibCode/ProjectDataModel/RimPlotAxisAnnotation.h @@ -40,6 +40,8 @@ class RimPlotAxisAnnotation : public caf::PdmObject }; RimPlotAxisAnnotation(); + static RimPlotAxisAnnotation* createLineAnnotation(); + void setName( const QString& name ); void setValue( double value ); @@ -50,6 +52,9 @@ class RimPlotAxisAnnotation : public caf::PdmObject virtual double rangeEnd() const; virtual QColor color() const; + void setPenStyle( Qt::PenStyle penStyle ); + Qt::PenStyle penStyle() const; + caf::PdmFieldHandle* userDescriptionField() override; caf::PdmFieldHandle* objectToggleField() override; @@ -59,11 +64,12 @@ class RimPlotAxisAnnotation : public caf::PdmObject void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; protected: - caf::PdmField m_isActive; - caf::PdmField m_name; - caf::PdmField m_value; - caf::PdmField m_rangeStart; - caf::PdmField m_rangeEnd; + caf::PdmField m_isActive; + caf::PdmField m_name; + caf::PdmField m_value; + caf::PdmField m_rangeStart; + caf::PdmField m_rangeEnd; + caf::PdmField> m_penStyle; protected: void setAnnotationType( AnnotationType annotationType ); diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotAxisLogRangeCalculator.cpp b/ApplicationLibCode/ProjectDataModel/RimPlotAxisLogRangeCalculator.cpp index b10d648262..57c59a2729 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotAxisLogRangeCalculator.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimPlotAxisLogRangeCalculator.cpp @@ -18,6 +18,7 @@ #include "RimPlotAxisLogRangeCalculator.h" +#include "RiaNumericalTools.h" #include "RiaPlotDefines.h" #include "RimPlotCurve.h" @@ -51,16 +52,11 @@ void RimPlotAxisLogRangeCalculator::computeAxisRange( double* minPositive, doubl if ( curveValueRange( curve, &minPosCurveValue, &maxCurveValue ) ) { - if ( minPosCurveValue < minPosValue ) - { - CVF_ASSERT( minPosCurveValue > 0.0 ); - minPosValue = minPosCurveValue; - } - - if ( maxCurveValue > maxValue ) - { - maxValue = maxCurveValue; - } + minPosCurveValue = RiaNumericalTools::roundToClosestPowerOfTenFloor( minPosCurveValue ); + maxCurveValue = RiaNumericalTools::roundToClosestPowerOfTenCeil( maxCurveValue ); + + minPosValue = std::min( minPosValue, minPosCurveValue ); + maxValue = std::max( maxValue, maxCurveValue ); } } diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp index e9dba3b12c..00a9eb6d6a 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp @@ -39,6 +39,7 @@ #include "cafAssert.h" #include "cafPdmUiComboBoxEditor.h" +#include "cafPdmUiTreeSelectionEditor.h" #include @@ -59,14 +60,20 @@ RimPlotCurve::RimPlotCurve() CAF_PDM_InitField( &m_showCurve, "Show", true, "Show curve" ); m_showCurve.uiCapability()->setUiHidden( true ); - CAF_PDM_InitFieldNoDefault( &m_curveName, "CurveName", "Curve Name" ); - CAF_PDM_InitFieldNoDefault( &m_customCurveName, "CurveDescription", "Custom Name" ); - m_customCurveName.uiCapability()->setUiHidden( true ); + CAF_PDM_InitFieldNoDefault( &m_curveName, "CurveName", "" ); + + auto templateText = + QString( "%1, %2" ).arg( RiaDefines::namingVariableCase() ).arg( RiaDefines::namingVariableResultName() ); + CAF_PDM_InitField( &m_curveNameTemplateText, "TemplateText", templateText, "Template Text" ); + CAF_PDM_InitFieldNoDefault( &m_namingMethod, "CurveNamingMethod", "Curve Name" ); CAF_PDM_InitFieldNoDefault( &m_legendEntryText, "LegendDescription", "Legend Name" ); m_legendEntryText.uiCapability()->setUiHidden( true ); - CAF_PDM_InitField( &m_isUsingAutoName, "AutoName", true, "Auto Name" ); + CAF_PDM_InitField( &m_isUsingAutoName_OBSOLETE, "AutoName", false, "Auto Name" ); + m_isUsingAutoName_OBSOLETE.xmlCapability()->setIOWritable( false ); + m_isUsingAutoName_OBSOLETE.uiCapability()->setUiHidden( true ); + CAF_PDM_InitField( &m_showLegend, "ShowLegend", true, "Contribute To Legend" ); CAF_PDM_InitField( &m_showErrorBars, "ShowErrorBars", true, "Show Error Bars" ); @@ -120,6 +127,10 @@ RimPlotCurve::RimPlotCurve() m_curveAppearance->appearanceChanged.connect( this, &RimPlotCurve::onCurveAppearanceChanged ); m_curveAppearance->fillColorChanged.connect( this, &RimPlotCurve::onFillColorChanged ); + CAF_PDM_InitFieldNoDefault( &m_additionalDataSources, "AdditionalDataSources", "Additional Data Sources" ); + m_additionalDataSources.uiCapability()->setUiEditorTypeName( caf::PdmUiTreeSelectionEditor::uiEditorTypeName() ); + m_additionalDataSources.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN ); + m_plotCurve = nullptr; m_parentPlot = nullptr; } @@ -150,16 +161,14 @@ void RimPlotCurve::fieldChangedByUi( const caf::PdmFieldHandle* changedField, co } else if ( changedField == &m_curveName ) { - m_customCurveName = m_curveName; updateCurveNameAndUpdatePlotLegendAndTitle(); } - else if ( changedField == &m_isUsingAutoName ) + else if ( changedField == &m_namingMethod ) + { + updateCurveNameAndUpdatePlotLegendAndTitle(); + } + else if ( changedField == &m_namingMethod || changedField == &m_curveNameTemplateText ) { - if ( !m_isUsingAutoName ) - { - m_customCurveName = createCurveAutoName(); - } - updateCurveNameAndUpdatePlotLegendAndTitle(); nameChanged.send( curveName() ); } @@ -189,37 +198,49 @@ caf::PdmFieldHandle* RimPlotCurve::objectToggleField() //-------------------------------------------------------------------------------------------------- void RimPlotCurve::setCustomName( const QString& customName ) { - m_isUsingAutoName = false; - m_customCurveName = customName; + m_namingMethod = RiaDefines::ObjectNamingMethod::CUSTOM; + m_curveName = customName; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QString RimPlotCurve::legendEntryText() const +void RimPlotCurve::setLegendEntryText( const QString& legendEntryText ) { - if ( !m_legendEntryText().isEmpty() ) - { - return m_legendEntryText; - } - return m_customCurveName; + m_legendEntryText = legendEntryText; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimPlotCurve::setLegendEntryText( const QString& legendEntryText ) +void RimPlotCurve::setErrorBarsVisible( bool isVisible ) { - m_legendEntryText = legendEntryText; + m_showErrorBars = isVisible; + updateCurveAppearance(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimPlotCurve::setErrorBarsVisible( bool isVisible ) +QString RimPlotCurve::createCurveNameFromTemplate( const QString& templateText ) { - m_showErrorBars = isVisible; - updateCurveAppearance(); + return templateText; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimPlotCurve::isCurveNameTemplateSupported() const +{ + return !supportedCurveNameVariables().isEmpty(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QStringList RimPlotCurve::supportedCurveNameVariables() const +{ + return {}; } //-------------------------------------------------------------------------------------------------- @@ -231,6 +252,18 @@ void RimPlotCurve::initAfterRead() { updateCurveAppearanceForFilesOlderThan_2021_06(); } + + if ( RimProject::current()->isProjectFileVersionEqualOrOlderThan( "2022.06.1" ) ) + { + if ( m_isUsingAutoName_OBSOLETE() ) + { + m_namingMethod = RiaDefines::ObjectNamingMethod::AUTO; + } + else + { + m_namingMethod = RiaDefines::ObjectNamingMethod::CUSTOM; + } + } } //-------------------------------------------------------------------------------------------------- @@ -261,6 +294,54 @@ caf::PdmFieldHandle* RimPlotCurve::userDescriptionField() return &m_curveName; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QList RimPlotCurve::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) +{ + QList options; + if ( fieldNeedingOptions == &m_namingMethod ) + { + options.push_back( caf::PdmOptionItemInfo( caf::AppEnum::uiText( + RiaDefines::ObjectNamingMethod::AUTO ), + RiaDefines::ObjectNamingMethod::AUTO ) ); + + options.push_back( caf::PdmOptionItemInfo( caf::AppEnum::uiText( + RiaDefines::ObjectNamingMethod::CUSTOM ), + RiaDefines::ObjectNamingMethod::CUSTOM ) ); + + if ( isCurveNameTemplateSupported() ) + { + options.push_back( caf::PdmOptionItemInfo( caf::AppEnum::uiText( + RiaDefines::ObjectNamingMethod::TEMPLATE ), + RiaDefines::ObjectNamingMethod::TEMPLATE ) ); + } + } + else if ( fieldNeedingOptions == &m_additionalDataSources ) + { + std::vector parentPlots; + + // Find all plot windows above this object upwards in the object hierarchy. Use the top most plot window as the + // root to find all plot curves. + this->allAncestorsOfType( parentPlots ); + + if ( !parentPlots.empty() ) + { + std::vector plotCurves; + parentPlots.back()->descendantsOfType( plotCurves ); + + for ( auto p : plotCurves ) + { + caf::PdmOptionItemInfo optionInfo( p->curveName(), p ); + + options.push_back( optionInfo ); + } + } + } + + return options; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -299,13 +380,13 @@ void RimPlotCurve::setCurveVisibility( bool visible ) //-------------------------------------------------------------------------------------------------- void RimPlotCurve::updateCurveName() { - if ( m_isUsingAutoName ) + if ( m_namingMethod == RiaDefines::ObjectNamingMethod::AUTO ) { m_curveName = this->createCurveAutoName(); } - else + else if ( m_namingMethod == RiaDefines::ObjectNamingMethod::TEMPLATE ) { - m_curveName = m_customCurveName; + m_curveName = this->createCurveNameFromTemplate( m_curveNameTemplateText ); } if ( !m_legendEntryText().isEmpty() ) @@ -339,9 +420,34 @@ void RimPlotCurve::updateCurveNameNoLegendUpdate() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimPlotCurve::updateOptionSensitivity() +void RimPlotCurve::setCurveNameTemplateText( const QString& templateText ) +{ + m_curveNameTemplateText = templateText; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurve::setNamingMethod( RiaDefines::ObjectNamingMethod namingMethod ) +{ + m_namingMethod = namingMethod; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurve::updateFieldUiState() { - m_curveName.uiCapability()->setUiReadOnly( m_isUsingAutoName ); + m_curveName.uiCapability()->setUiReadOnly( m_namingMethod != RiaDefines::ObjectNamingMethod::CUSTOM ); + + m_curveNameTemplateText.uiCapability()->setUiHidden( m_namingMethod != RiaDefines::ObjectNamingMethod::TEMPLATE ); + + auto templateVariables = supportedCurveNameVariables(); + if ( !templateVariables.isEmpty() ) + { + auto toolTipText = templateVariables.join( "," ); + m_curveNameTemplateText.uiCapability()->setUiToolTip( toolTipText ); + } } //-------------------------------------------------------------------------------------------------- @@ -371,10 +477,23 @@ void RimPlotCurve::appearanceUiOrdering( caf::PdmUiOrdering& uiOrdering ) //-------------------------------------------------------------------------------------------------- void RimPlotCurve::curveNameUiOrdering( caf::PdmUiOrdering& uiOrdering ) { - uiOrdering.add( &m_isUsingAutoName ); + updateFieldUiState(); + + uiOrdering.add( &m_namingMethod ); + uiOrdering.add( &m_curveNameTemplateText ); uiOrdering.add( &m_curveName ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurve::additionalDataSourcesUiOrdering( caf::PdmUiOrdering& uiOrdering ) +{ + auto group = uiOrdering.addNewGroup( RiaDefines::additionalDataSourcesGroupName() ); + group->add( &m_additionalDataSources ); + group->setCollapsedByDefault(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -989,6 +1108,22 @@ std::pair RimPlotCurve::sample( int index ) const return m_plotCurve->sample( index ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RimPlotCurve::closestYValueForX( double xValue ) const +{ + return std::numeric_limits::infinity(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimPlotCurve::additionalDataSources() const +{ + return m_additionalDataSources.ptrReferencedObjects(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1004,7 +1139,7 @@ void RimPlotCurve::setParentPlotNoReplot( RiuPlotWidget* plotWidget ) } auto color = RiaColorTools::toQColor( m_curveAppearance->color() ); - m_plotCurve = m_parentPlot->createPlotCurve( this, "", color ); + m_plotCurve = m_parentPlot->createPlotCurve( this, "" ); m_plotCurve->updateErrorBarsAppearance( m_showErrorBars, color ); // PERFORMANCE NOTE diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.h b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.h index c8a98d55cb..3758e8d864 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.h +++ b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.h @@ -32,6 +32,7 @@ #include "cafPdmField.h" #include "cafPdmFieldCvfColor.h" #include "cafPdmObject.h" +#include "cafPdmPtrArrayField.h" #include #include @@ -84,13 +85,15 @@ class RimPlotCurve : public caf::PdmObject void updateCurveName(); void updateCurveNameAndUpdatePlotLegendAndTitle(); void updateCurveNameNoLegendUpdate(); + void setCurveNameTemplateText( const QString& templateText ); + void setNamingMethod( RiaDefines::ObjectNamingMethod namingMethod ); QString curveName() const; virtual QString curveExportDescription( const RifEclipseSummaryAddress& address = RifEclipseSummaryAddress() ) const; + virtual QString createCurveNameFromTemplate( const QString& templateText ); - void setCustomName( const QString& customName ); - QString legendEntryText() const; - void setLegendEntryText( const QString& legendEntryText ); + void setCustomName( const QString& customName ); + void setLegendEntryText( const QString& legendEntryText ); virtual void updateCurveVisibility(); void updateLegendEntryVisibilityAndPlotLegend(); @@ -116,8 +119,10 @@ class RimPlotCurve : public caf::PdmObject virtual void setTitle( const QString& title ); - int dataSize() const; - std::pair sample( int index ) const; + int dataSize() const; + std::pair sample( int index ) const; + virtual double closestYValueForX( double xValue ) const; + std::vector additionalDataSources() const; void setParentPlotNoReplot( RiuPlotWidget* ); void setParentPlotAndReplot( RiuPlotWidget* ); @@ -129,13 +134,16 @@ class RimPlotCurve : public caf::PdmObject void deletePlotCurve(); protected: - virtual QString createCurveAutoName() = 0; - virtual void updateZoomInParentPlot() = 0; - virtual void onLoadDataAndUpdate( bool updateParentPlot ) = 0; - void initAfterRead() override; - void updateCurvePresentation( bool updatePlotLegendAndTitle ); + virtual QString createCurveAutoName() = 0; - void updateOptionSensitivity(); + virtual QStringList supportedCurveNameVariables() const; + + virtual void updateZoomInParentPlot() = 0; + virtual void onLoadDataAndUpdate( bool updateParentPlot ) = 0; + void initAfterRead() override; + void updateCurvePresentation( bool updatePlotLegendAndTitle ); + + void updateFieldUiState(); void updatePlotTitle(); virtual void updateLegendsInPlot(); @@ -159,13 +167,14 @@ class RimPlotCurve : public caf::PdmObject virtual double computeCurveZValue(); -protected: - // Overridden PDM methods - void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; - caf::PdmFieldHandle* objectToggleField() override; - caf::PdmFieldHandle* userDescriptionField() override; - void appearanceUiOrdering( caf::PdmUiOrdering& uiOrdering ); - void curveNameUiOrdering( caf::PdmUiOrdering& uiOrdering ); + void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; + caf::PdmFieldHandle* objectToggleField() override; + caf::PdmFieldHandle* userDescriptionField() override; + QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; + + void appearanceUiOrdering( caf::PdmUiOrdering& uiOrdering ); + void curveNameUiOrdering( caf::PdmUiOrdering& uiOrdering ); + void additionalDataSourcesUiOrdering( caf::PdmUiOrdering& uiOrdering ); void onCurveAppearanceChanged( const caf::SignalEmitter* emitter ); virtual void onFillColorChanged( const caf::SignalEmitter* emitter ); @@ -176,20 +185,30 @@ class RimPlotCurve : public caf::PdmObject virtual void updateAxisInPlot( RiuPlotAxis plotAxis ); +private: + bool isCurveNameTemplateSupported() const; + protected: - caf::PdmField m_showCurve; + caf::PdmField m_showCurve; + caf::PdmField m_curveName; - caf::PdmField m_customCurveName; - caf::PdmField m_showLegend; + caf::PdmField m_curveNameTemplateText; + + caf::PdmField> m_namingMethod; + caf::PdmField m_legendEntryText; - caf::PdmField m_showErrorBars; - caf::PdmField m_isUsingAutoName; + + caf::PdmField m_showLegend; + caf::PdmField m_showErrorBars; caf::PdmChildField m_curveAppearance; + caf::PdmPtrArrayField m_additionalDataSources; + QPointer m_parentPlot; RiuPlotCurve* m_plotCurve; + caf::PdmField m_isUsingAutoName_OBSOLETE; caf::PdmField m_symbolLabel_OBSOLETE; caf::PdmField m_symbolSize_OBSOLETE; caf::PdmField m_curveColor_OBSOLETE; diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotCurveAppearance.h b/ApplicationLibCode/ProjectDataModel/RimPlotCurveAppearance.h index 445dac52b8..d814a50988 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotCurveAppearance.h +++ b/ApplicationLibCode/ProjectDataModel/RimPlotCurveAppearance.h @@ -104,7 +104,6 @@ class RimPlotCurveAppearance : public caf::PdmObject protected: caf::PdmField m_symbolLabel; caf::PdmField m_symbolSize; - caf::PdmField m_legendEntryText; caf::PdmField m_curveColor; caf::PdmField m_curveThickness; diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotWindow.cpp b/ApplicationLibCode/ProjectDataModel/RimPlotWindow.cpp index 15bb532566..c2e4616bdf 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotWindow.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimPlotWindow.cpp @@ -41,7 +41,8 @@ template <> void caf::AppEnum::setUp() { addItem( RimPlotWindow::LegendPosition::ABOVE, "ABOVE", "Above" ); - addItem( RimPlotWindow::LegendPosition::INSIDE, "INSIDE", "Inside" ); + addItem( RimPlotWindow::LegendPosition::INSIDE_UPPER_RIGHT, "INSIDE_UPPER_RIGHT", "Inside Right", { "INSIDE" } ); + addItem( RimPlotWindow::LegendPosition::INSIDE_UPPER_LEFT, "INSIDE_UPPER_LEFT", "Inside Left" ); setDefault( RimPlotWindow::LegendPosition::ABOVE ); } }; // namespace caf @@ -68,6 +69,7 @@ RimPlotWindow::RimPlotWindow() CAF_PDM_InitField( &m_showPlotTitle, "ShowPlotTitle", true, "Show Plot Title" ); CAF_PDM_InitField( &m_showPlotLegends, "ShowTrackLegends", true, "Show Legends" ); CAF_PDM_InitField( &m_plotLegendsHorizontal, "TrackLegendsHorizontal", true, "Legend Orientation" ); + CAF_PDM_InitField( &m_legendItemsClickable, "LegendItemsClickable", true, "Legend Items Clickable" ); m_plotLegendsHorizontal.uiCapability()->setUiEditorTypeName( caf::PdmUiComboBoxEditor::uiEditorTypeName() ); CAF_PDM_InitFieldNoDefault( &m_titleFontSize, "TitleFontSize", "Title Font Size" ); @@ -76,6 +78,8 @@ RimPlotWindow::RimPlotWindow() m_titleFontSize = caf::FontTools::RelativeSize::XXLarge; m_legendFontSize = caf::FontTools::RelativeSize::Large; + + m_bottomMargin = -1; } //-------------------------------------------------------------------------------------------------- @@ -101,6 +105,7 @@ RimPlotWindow& RimPlotWindow::operator=( RimPlotWindow&& rhs ) m_showPlotTitle = rhs.m_showPlotTitle(); m_showPlotLegends = rhs.m_showPlotLegends(); m_plotLegendsHorizontal = rhs.m_plotLegendsHorizontal(); + m_legendItemsClickable = rhs.m_legendItemsClickable(); m_titleFontSize = rhs.m_titleFontSize(); m_legendFontSize = rhs.m_legendFontSize(); m_legendPosition = rhs.m_legendPosition(); @@ -155,6 +160,22 @@ void RimPlotWindow::setLegendsHorizontal( bool horizontal ) m_plotLegendsHorizontal = horizontal; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimPlotWindow::legendItemsClickable() const +{ + return m_legendItemsClickable(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotWindow::setLegendItemsClickable( bool clickable ) +{ + m_legendItemsClickable = clickable; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -267,6 +288,22 @@ QPageLayout RimPlotWindow::pageLayout() const return defaultPageLayout; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotWindow::setBottomMargin( int bottomMargin ) +{ + m_bottomMargin = bottomMargin; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RimPlotWindow::bottomMargin() const +{ + return m_bottomMargin; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -282,7 +319,8 @@ void RimPlotWindow::fieldChangedByUi( const caf::PdmFieldHandle* changedField, } if ( changedField == &m_showPlotLegends || changedField == &m_plotLegendsHorizontal || - changedField == &m_legendFontSize || changedField == &m_titleFontSize || changedField == &m_legendPosition ) + changedField == &m_legendFontSize || changedField == &m_titleFontSize || changedField == &m_legendPosition || + changedField == &m_legendItemsClickable ) { updateLayout(); } @@ -312,18 +350,40 @@ QList RimPlotWindow::calculateValueOptions( const caf::P //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimPlotWindow::uiOrderingForPlotLayout( QString uiConfigName, caf::PdmUiOrdering& uiOrdering, bool showLegendPosition ) +void RimPlotWindow::uiOrderingForLegends( QString uiConfigName, caf::PdmUiOrdering& uiOrdering, bool showLegendPosition ) { uiOrdering.add( &m_showPlotLegends ); uiOrdering.add( &m_plotLegendsHorizontal ); + uiOrdering.add( &m_legendItemsClickable ); if ( showLegendPosition ) { uiOrdering.add( &m_legendPosition ); } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotWindow::uiOrderingForFonts( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) +{ uiOrdering.add( &m_titleFontSize ); uiOrdering.add( &m_legendFontSize ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotWindow::uiOrderingForLegendsAndFonts( QString uiConfigName, caf::PdmUiOrdering& uiOrdering, bool showLegendPosition ) +{ + caf::PdmUiGroup* legendGroup = uiOrdering.addNewGroup( "Legends" ); + legendGroup->setCollapsedByDefault(); + RimPlotWindow::uiOrderingForLegends( uiConfigName, *legendGroup, showLegendPosition ); + + caf::PdmUiGroup* fontGroup = uiOrdering.addNewGroup( "Fonts" ); + fontGroup->setCollapsedByDefault(); + RimPlotWindow::uiOrderingForFonts( uiConfigName, *fontGroup ); +} + //-------------------------------------------------------------------------------------------------- /// Re-implement this in sub classes to provide a custom page layout for printing/PDF //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotWindow.h b/ApplicationLibCode/ProjectDataModel/RimPlotWindow.h index 5cf02e815e..6f84a47a13 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotWindow.h +++ b/ApplicationLibCode/ProjectDataModel/RimPlotWindow.h @@ -47,7 +47,8 @@ class RimPlotWindow : public RimViewWindow enum class LegendPosition { ABOVE, - INSIDE, + INSIDE_UPPER_RIGHT, + INSIDE_UPPER_LEFT, }; RimPlotWindow(); @@ -65,6 +66,8 @@ class RimPlotWindow : public RimViewWindow void setLegendsVisible( bool doShow ); bool legendsHorizontal() const; void setLegendsHorizontal( bool horizontal ); + bool legendItemsClickable() const; + void setLegendItemsClickable( bool clickable ); void setLegendPosition( RimPlotWindow::LegendPosition legendPosition ); RimPlotWindow::LegendPosition legendPosition() const; @@ -83,6 +86,7 @@ class RimPlotWindow : public RimViewWindow void renderWindowContent( QPaintDevice* painter ); QPageLayout pageLayout() const; + int bottomMargin() const; virtual bool handleGlobalKeyEvent( QKeyEvent* keyEvent ); virtual bool handleGlobalWheelEvent( QWheelEvent* wheelEvent ); @@ -92,9 +96,12 @@ class RimPlotWindow : public RimViewWindow QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; - void uiOrderingForPlotLayout( QString uiConfigName, caf::PdmUiOrdering& uiOrdering, bool showLegendPosition = false ); + void uiOrderingForLegends( QString uiConfigName, caf::PdmUiOrdering& uiOrdering, bool showLegendPosition = false ); + void uiOrderingForFonts( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ); + void uiOrderingForLegendsAndFonts( QString uiConfigName, caf::PdmUiOrdering& uiOrdering, bool showLegendPosition = false ); void updateWindowVisibility(); + void setBottomMargin( int bottomMargin ); private: virtual void doUpdateLayout() {} @@ -112,8 +119,12 @@ class RimPlotWindow : public RimViewWindow caf::PdmField m_showPlotTitle; caf::PdmField m_showPlotLegends; caf::PdmField m_plotLegendsHorizontal; + caf::PdmField m_legendItemsClickable; caf::PdmField> m_legendPosition; caf::PdmField m_titleFontSize; caf::PdmField m_legendFontSize; + +private: + int m_bottomMargin; }; diff --git a/ApplicationLibCode/ProjectDataModel/RimProject.cpp b/ApplicationLibCode/ProjectDataModel/RimProject.cpp index e0b9ea8085..45b56912a7 100644 --- a/ApplicationLibCode/ProjectDataModel/RimProject.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimProject.cpp @@ -93,6 +93,8 @@ #include "RimWellPath.h" #include "RimWellPathCollection.h" +#include "Tools/RiaVariableMapper.h" + #ifdef USE_QTCHARTS #include "RimEnsembleFractureStatisticsPlot.h" #include "RimEnsembleFractureStatisticsPlotCollection.h" @@ -116,6 +118,7 @@ #include #include #include + #include CAF_PDM_SOURCE_INIT( RimProject, "ResInsightProject" ); @@ -187,11 +190,11 @@ RimProject::RimProject( void ) CAF_PDM_InitField( &m_showPlotWindow, "showPlotWindow", false, "Show Plot Window" ); m_showPlotWindow.uiCapability()->setUiHidden( true ); - CAF_PDM_InitField( &m_subWindowsTiled3DWindow, "tiled3DWindow", false, "Tile 3D Window" ); - m_subWindowsTiled3DWindow.uiCapability()->setUiHidden( true ); + CAF_PDM_InitField( &m_subWindowsTiled3DWindow_OBSOLETE, "tiled3DWindow", false, "Tile 3D Window" ); + m_subWindowsTiled3DWindow_OBSOLETE.uiCapability()->setUiHidden( true ); - CAF_PDM_InitField( &m_subWindowsTiledPlotWindow, "tiledPlotWindow", false, "Tile Plot Window" ); - m_subWindowsTiledPlotWindow.uiCapability()->setUiHidden( true ); + CAF_PDM_InitField( &m_subWindowsTiledPlotWindow_OBSOLETE, "tiledPlotWindow", false, "Tile Plot Window" ); + m_subWindowsTiledPlotWindow_OBSOLETE.uiCapability()->setUiHidden( true ); CAF_PDM_InitFieldNoDefault( &m_dialogData, "DialogData", "DialogData" ); m_dialogData = new RimDialogData(); @@ -205,6 +208,11 @@ RimProject::RimProject( void ) CAF_PDM_InitFieldNoDefault( &caseGroupsObsolete, "CaseGroups", "" ); RiaFieldHandleTools::disableWriteAndSetFieldHidden( &caseGroupsObsolete ); + CAF_PDM_InitFieldNoDefault( &m_subWindowsTileMode3DWindow, "TileMode3DWindow", "TileMode3DWindow" ); + m_subWindowsTileMode3DWindow.uiCapability()->setUiHidden( true ); + CAF_PDM_InitFieldNoDefault( &m_subWindowsTileModePlotWindow, "TileModePlotWindow", "TileModePlotWindow" ); + m_subWindowsTileModePlotWindow.uiCapability()->setUiHidden( true ); + // Initialization scriptCollection = new RimScriptCollection(); @@ -272,6 +280,8 @@ void RimProject::close() fileName = ""; + m_globalPathList = ""; + mainWindowCurrentModelIndexPaths = ""; mainWindowTreeViewStates = ""; plotWindowCurrentModelIndexPaths = ""; @@ -340,6 +350,9 @@ void RimProject::initAfterRead() RimOilField* oilField = oilFields[oilFieldIdx]; if ( oilField == nullptr || oilField->wellPathCollection == nullptr ) continue; } + + if ( m_subWindowsTiled3DWindow_OBSOLETE ) m_subWindowsTileMode3DWindow = RiaDefines::WindowTileMode::DEFAULT; + if ( m_subWindowsTiledPlotWindow_OBSOLETE ) m_subWindowsTileModePlotWindow = RiaDefines::WindowTileMode::DEFAULT; } //-------------------------------------------------------------------------------------------------- @@ -739,15 +752,15 @@ RimSummaryCaseMainCollection* RimProject::firstSummaryCaseMainCollection() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimProject::allNotLinkedViews( std::vector& views ) +void RimProject::allNotLinkedViews( std::vector& views ) { std::vector cases; allCases( cases ); - std::vector alreadyLinkedViews; + std::vector alreadyLinkedViews; if ( viewLinkerCollection->viewLinker() ) { - viewLinkerCollection->viewLinker()->allViews( alreadyLinkedViews ); + alreadyLinkedViews = viewLinkerCollection->viewLinker()->allViews(); } for ( size_t caseIdx = 0; caseIdx < cases.size(); caseIdx++ ) @@ -969,33 +982,33 @@ bool RimProject::showPlotWindow() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RimProject::subWindowsTiled3DWindow() const +RiaDefines::WindowTileMode RimProject::subWindowsTileMode3DWindow() const { - return m_subWindowsTiled3DWindow; + return m_subWindowsTileMode3DWindow(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RimProject::subWindowsTiledPlotWindow() const +RiaDefines::WindowTileMode RimProject::subWindowsTileModePlotWindow() const { - return m_subWindowsTiledPlotWindow; + return m_subWindowsTileModePlotWindow(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimProject::setSubWindowsTiledIn3DWindow( bool tiled ) +void RimProject::setSubWindowsTileMode3DWindow( RiaDefines::WindowTileMode tileMode ) { - m_subWindowsTiled3DWindow = tiled; + m_subWindowsTileMode3DWindow = tileMode; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimProject::setSubWindowsTiledInPlotWindow( bool tiled ) +void RimProject::setSubWindowsTileModePlotWindow( RiaDefines::WindowTileMode tileMode ) { - m_subWindowsTiledPlotWindow = tiled; + m_subWindowsTileModePlotWindow = tileMode; } //-------------------------------------------------------------------------------------------------- @@ -1362,7 +1375,7 @@ void RimProject::reloadCompletionTypeResultsForEclipseCase( RimEclipseCase* ecli views[viewIdx]->scheduleCreateDisplayModelAndRedraw(); } - RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews( eclipseCase ); + RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews( { eclipseCase } ); } //-------------------------------------------------------------------------------------------------- @@ -1511,168 +1524,67 @@ void RimProject::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, Q uiTreeOrdering.skipRemainingChildren( true ); } -#define PATHIDCHAR "$" - -class GlobalPathListMapper +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimProject::transferPathsToGlobalPathList() { - const QString pathIdBaseString = "PathId_"; + RiaVariableMapper variableMapper( m_globalPathList() ); -public: - GlobalPathListMapper( const QString& globalPathListTable ) + std::vector filePaths = allFilePaths(); + for ( caf::FilePath* filePath : filePaths ) { - m_maxUsedIdNumber = 0; - QStringList pathPairs = RiaTextStringTools::splitSkipEmptyParts( globalPathListTable, ";" ); - - for ( const QString& pathIdPathPair : pathPairs ) + QString path = filePath->path(); + if ( !path.isEmpty() ) { - QStringList pathIdPathComponents = pathIdPathPair.trimmed().split( PATHIDCHAR ); - - if ( pathIdPathComponents.size() == 3 && pathIdPathComponents[0].size() == 0 ) - { - QString pathIdCore = pathIdPathComponents[1]; - QString pathId = PATHIDCHAR + pathIdCore + PATHIDCHAR; - QString path = pathIdPathComponents[2].trimmed(); - - // Check if we have a standard id, and store the max number - - if ( pathIdCore.startsWith( pathIdBaseString ) ) - { - bool isOk = false; - QString numberText = pathIdCore.right( pathIdCore.size() - pathIdBaseString.size() ); - size_t idNumber = numberText.toUInt( &isOk ); - - if ( isOk ) - { - m_maxUsedIdNumber = std::max( m_maxUsedIdNumber, idNumber ); - } - } - - // Check for unique pathId - { - auto pathIdPathPairIt = m_oldPathIdToPathMap.find( pathId ); - - if ( pathIdPathPairIt != m_oldPathIdToPathMap.end() ) - { - // Error: pathID is already used - } - } - - // Check for multiple identical paths - { - auto pathPathIdPairIt = m_oldPathToPathIdMap.find( path ); - - if ( pathPathIdPairIt != m_oldPathToPathIdMap.end() ) - { - // Warning: path has already been assigned a pathId - } - } - - m_oldPathIdToPathMap[pathId] = path; - m_oldPathToPathIdMap[path] = pathId; - } - else - { - // Error: The text is ill formatted - } + QString pathId = variableMapper.addPathAndGetId( path ); + filePath->setPath( pathId ); } } - QString addPathAndGetId( const QString& path ) + for ( auto summaryCase : allSummaryCases() ) { - // Want to re-use ids from last save to avoid unnecessary changes and make the behavior predictable - QString pathId; - QString trimmedPath = path.trimmed(); - - auto pathToIdIt = m_oldPathToPathIdMap.find( trimmedPath ); - if ( pathToIdIt != m_oldPathToPathIdMap.end() ) + if ( summaryCase->displayNameType() == RimCaseDisplayNameTools::DisplayName::CUSTOM ) { - pathId = pathToIdIt->second; - } - else - { - auto pathPathIdPairIt = m_newPathToPathIdMap.find( trimmedPath ); - if ( pathPathIdPairIt != m_newPathToPathIdMap.end() ) - { - pathId = pathPathIdPairIt->second; - } - else - { - pathId = createUnusedId(); - } - } - - m_newPathIdToPathMap[pathId] = trimmedPath; - m_newPathToPathIdMap[trimmedPath] = pathId; + // At this point, after the replace of variables into caf::FilePath objects, the variable name is stored in + // the summary case object. Read out the variable name and append "_name" for custom summary variables. - return pathId; - }; - - QString newGlobalPathListTable() const - { - QString pathList; - pathList += "\n"; - for ( const auto& pathIdPathPairIt : m_newPathIdToPathMap ) - { - pathList += " " + pathIdPathPairIt.first + " " + pathIdPathPairIt.second + ";\n"; - } + QString variableName = summaryCase->summaryHeaderFilename(); + variableName = variableName.remove( RiaVariableMapper::variableToken() ); - pathList += " "; + variableName = RiaVariableMapper::variableToken() + variableName + RiaVariableMapper::postfixName() + + RiaVariableMapper::variableToken(); - return pathList; - } + QString variableValue = summaryCase->displayCaseName(); + variableMapper.addVariable( variableName, variableValue ); - QString pathFromPathId( const QString& pathId, bool* isFound ) const - { - auto it = m_oldPathIdToPathMap.find( pathId ); - if ( it != m_oldPathIdToPathMap.end() ) - { - ( *isFound ) = true; - return it->second; + summaryCase->setCustomCaseName( variableName ); } - - ( *isFound ) = false; - return ""; } -private: - QString createUnusedId() + for ( auto gridCase : allGridCases() ) { - m_maxUsedIdNumber++; - - QString numberString = QString( "%1" ).arg( (uint)m_maxUsedIdNumber, 3, 10, QChar( '0' ) ); - QString pathIdentifier = PATHIDCHAR + pathIdBaseString + numberString + PATHIDCHAR; - - return pathIdentifier; - } - - size_t m_maxUsedIdNumber; // Set when parsing the globalPathListTable. Increment while creating new id's + if ( gridCase->displayNameType() == RimCaseDisplayNameTools::DisplayName::CUSTOM ) + { + // At this point, after the replace of variables into caf::FilePath objects, the variable name is stored in + // the summary case object. Read out the variable name and append "_name" for custom summary variables. - std::map m_newPathIdToPathMap; - std::map m_newPathToPathIdMap; + QString variableName = gridCase->gridFileName(); + variableName = variableName.remove( RiaVariableMapper::variableToken() ); - std::map m_oldPathIdToPathMap; - std::map m_oldPathToPathIdMap; -}; + variableName = RiaVariableMapper::variableToken() + variableName + RiaVariableMapper::postfixName() + + RiaVariableMapper::variableToken(); -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimProject::transferPathsToGlobalPathList() -{ - GlobalPathListMapper pathListMapper( m_globalPathList() ); + QString variableValue = gridCase->caseUserDescription(); + variableMapper.addVariable( variableName, variableValue ); - std::vector filePaths = allFilePaths(); - for ( caf::FilePath* filePath : filePaths ) - { - QString path = filePath->path(); - if ( !path.isEmpty() ) - { - QString pathId = pathListMapper.addPathAndGetId( path ); - filePath->setPath( pathId ); + gridCase->setCustomCaseName( variableName ); } } - m_globalPathList = pathListMapper.newGlobalPathListTable(); + variableMapper.replaceVariablesInValues(); + + m_globalPathList = variableMapper.variableTableAsText(); } //-------------------------------------------------------------------------------------------------- @@ -1680,31 +1592,65 @@ void RimProject::transferPathsToGlobalPathList() //-------------------------------------------------------------------------------------------------- void RimProject::distributePathsFromGlobalPathList() { - GlobalPathListMapper pathListMapper( m_globalPathList() ); + RiaVariableMapper pathListMapper( m_globalPathList() ); std::vector filePaths = allFilePaths(); for ( caf::FilePath* filePath : filePaths ) { QString pathIdCandidate = filePath->path().trimmed(); - QStringList pathIdComponents = pathIdCandidate.split( PATHIDCHAR ); + QStringList pathIdComponents = pathIdCandidate.split( RiaVariableMapper::variableToken() ); if ( pathIdComponents.size() == 3 && pathIdComponents[0].size() == 0 && pathIdComponents[1].size() > 0 && pathIdComponents[2].size() == 0 ) { bool isFound = false; - QString path = pathListMapper.pathFromPathId( pathIdCandidate, &isFound ); + QString path = pathListMapper.valueForVariable( pathIdCandidate, &isFound ); if ( isFound ) { filePath->setPath( path ); } - else + } + } + + for ( auto summaryCase : allSummaryCases() ) + { + if ( summaryCase->displayNameType() == RimCaseDisplayNameTools::DisplayName::CUSTOM ) + { + auto variableName = summaryCase->displayCaseName(); + + bool isFound = false; + QString variableValue = pathListMapper.valueForVariable( variableName, &isFound ); + if ( isFound ) + { + summaryCase->setCustomCaseName( variableValue ); + } + else if ( variableName.contains( RiaVariableMapper::postfixName() + RiaVariableMapper::variableToken() ) ) { - // The pathId can not be found in the path list + // The variable name is not found in the variable list, but the name indicates a variable. Reset to full + // case name. + summaryCase->setDisplayNameOption( RimCaseDisplayNameTools::DisplayName::FULL_CASE_NAME ); } } - else + } + + for ( auto gridCase : allGridCases() ) + { + if ( gridCase->displayNameType() == RimCaseDisplayNameTools::DisplayName::CUSTOM ) { - // The pathIdCandidate is probably a real path. Leave alone. + auto variableName = gridCase->caseUserDescription(); + + bool isFound = false; + QString variableValue = pathListMapper.valueForVariable( variableName, &isFound ); + if ( isFound ) + { + gridCase->setCustomCaseName( variableValue ); + } + else if ( variableName.contains( RiaVariableMapper::postfixName() + RiaVariableMapper::variableToken() ) ) + { + // The variable name is not found in the variable list, but the name indicates a variable. Reset to full + // case name. + gridCase->setDisplayNameType( RimCaseDisplayNameTools::DisplayName::FULL_CASE_NAME ); + } } } } diff --git a/ApplicationLibCode/ProjectDataModel/RimProject.h b/ApplicationLibCode/ProjectDataModel/RimProject.h index 1cb50af490..65d47d31d4 100644 --- a/ApplicationLibCode/ProjectDataModel/RimProject.h +++ b/ApplicationLibCode/ProjectDataModel/RimProject.h @@ -21,6 +21,7 @@ #pragma once #include "RiaDefines.h" +#include "RiaPlotDefines.h" #include "cafPdmChildArrayField.h" #include "cafPdmChildField.h" @@ -140,7 +141,7 @@ class RimProject : public caf::PdmDocument void allViews( std::vector& views ) const; void allVisibleViews( std::vector& views ) const; void allVisibleGridViews( std::vector& views ) const; - void allNotLinkedViews( std::vector& views ); + void allNotLinkedViews( std::vector& views ); void scheduleCreateDisplayModelAndRedrawAllViews(); @@ -155,11 +156,10 @@ class RimProject : public caf::PdmDocument bool show3DWindow() const; bool showPlotWindow() const; - bool subWindowsTiled3DWindow() const; - bool subWindowsTiledPlotWindow() const; - - void setSubWindowsTiledIn3DWindow( bool tiled ); - void setSubWindowsTiledInPlotWindow( bool tiled ); + RiaDefines::WindowTileMode subWindowsTileMode3DWindow() const; + RiaDefines::WindowTileMode subWindowsTileModePlotWindow() const; + void setSubWindowsTileMode3DWindow( RiaDefines::WindowTileMode tileMode ); + void setSubWindowsTileModePlotWindow( RiaDefines::WindowTileMode tileMode ); void reloadCompletionTypeResultsInAllViews(); void reloadCompletionTypeResultsForEclipseCase( RimEclipseCase* eclipseCase ); @@ -220,8 +220,11 @@ class RimProject : public caf::PdmDocument caf::PdmField m_show3DWindow; caf::PdmField m_showPlotWindow; - caf::PdmField m_subWindowsTiled3DWindow; - caf::PdmField m_subWindowsTiledPlotWindow; + caf::PdmField m_subWindowsTiled3DWindow_OBSOLETE; + caf::PdmField m_subWindowsTiledPlotWindow_OBSOLETE; + + caf::PdmField> m_subWindowsTileMode3DWindow; + caf::PdmField> m_subWindowsTileModePlotWindow; int m_nextValidCaseId; int m_nextValidCaseGroupId; diff --git a/ApplicationLibCode/ProjectDataModel/RimRegularLegendConfig.cpp b/ApplicationLibCode/ProjectDataModel/RimRegularLegendConfig.cpp index 7dd2f753eb..0bcc183eb2 100644 --- a/ApplicationLibCode/ProjectDataModel/RimRegularLegendConfig.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimRegularLegendConfig.cpp @@ -23,6 +23,7 @@ #include "RiaApplication.h" #include "RiaColorTables.h" #include "RiaNumberFormat.h" +#include "RiaNumericalTools.h" #include "RiaPreferences.h" #include "RimCellEdgeColors.h" @@ -266,11 +267,11 @@ void RimRegularLegendConfig::fieldChangedByUi( const caf::PdmFieldHandle* change { if ( m_userDefinedMaxValue == m_userDefinedMaxValue.defaultValue() && m_globalAutoMax != cvf::UNDEFINED_DOUBLE ) { - m_userDefinedMaxValue = roundToNumSignificantDigits( m_globalAutoMax, m_precision ); + m_userDefinedMaxValue = RiaNumericalTools::roundToNumSignificantDigits( m_globalAutoMax, m_precision ); } if ( m_userDefinedMinValue == m_userDefinedMinValue.defaultValue() && m_globalAutoMin != cvf::UNDEFINED_DOUBLE ) { - m_userDefinedMinValue = roundToNumSignificantDigits( m_globalAutoMin, m_precision ); + m_userDefinedMinValue = RiaNumericalTools::roundToNumSignificantDigits( m_globalAutoMin, m_precision ); } } updateFieldVisibility(); @@ -417,24 +418,24 @@ void RimRegularLegendConfig::updateLegend() if ( m_rangeMode == RangeModeType::AUTOMATIC_ALLTIMESTEPS ) { - adjustedMin = roundToNumSignificantDigits( m_globalAutoMin, m_precision ); - adjustedMax = roundToNumSignificantDigits( m_globalAutoMax, m_precision ); + adjustedMin = RiaNumericalTools::roundToNumSignificantDigits( m_globalAutoMin, m_precision ); + adjustedMax = RiaNumericalTools::roundToNumSignificantDigits( m_globalAutoMax, m_precision ); posClosestToZero = m_globalAutoPosClosestToZero; negClosestToZero = m_globalAutoNegClosestToZero; } else if ( m_rangeMode == RangeModeType::AUTOMATIC_CURRENT_TIMESTEP ) { - adjustedMin = roundToNumSignificantDigits( m_localAutoMin, m_precision ); - adjustedMax = roundToNumSignificantDigits( m_localAutoMax, m_precision ); + adjustedMin = RiaNumericalTools::roundToNumSignificantDigits( m_localAutoMin, m_precision ); + adjustedMax = RiaNumericalTools::roundToNumSignificantDigits( m_localAutoMax, m_precision ); posClosestToZero = m_localAutoPosClosestToZero; negClosestToZero = m_localAutoNegClosestToZero; } else { - adjustedMin = roundToNumSignificantDigits( m_userDefinedMinValue, m_precision ); - adjustedMax = roundToNumSignificantDigits( m_userDefinedMaxValue, m_precision ); + adjustedMin = RiaNumericalTools::roundToNumSignificantDigits( m_userDefinedMinValue, m_precision ); + adjustedMax = RiaNumericalTools::roundToNumSignificantDigits( m_userDefinedMaxValue, m_precision ); posClosestToZero = m_globalAutoPosClosestToZero; negClosestToZero = m_globalAutoNegClosestToZero; @@ -632,11 +633,11 @@ void RimRegularLegendConfig::disableAllTimeStepsRange( bool doDisable ) //-------------------------------------------------------------------------------------------------- void RimRegularLegendConfig::setAutomaticRanges( double globalMin, double globalMax, double localMin, double localMax ) { - double candidateGlobalAutoMin = roundToNumSignificantDigits( globalMin, m_precision ); - double candidateGlobalAutoMax = roundToNumSignificantDigits( globalMax, m_precision ); + double candidateGlobalAutoMin = RiaNumericalTools::roundToNumSignificantDigits( globalMin, m_precision ); + double candidateGlobalAutoMax = RiaNumericalTools::roundToNumSignificantDigits( globalMax, m_precision ); - double candidateLocalAutoMin = roundToNumSignificantDigits( localMin, m_precision ); - double candidateLocalAutoMax = roundToNumSignificantDigits( localMax, m_precision ); + double candidateLocalAutoMin = RiaNumericalTools::roundToNumSignificantDigits( localMin, m_precision ); + double candidateLocalAutoMax = RiaNumericalTools::roundToNumSignificantDigits( localMax, m_precision ); m_globalAutoMin = candidateGlobalAutoMin; m_globalAutoMax = candidateGlobalAutoMax; @@ -770,33 +771,6 @@ void RimRegularLegendConfig::onRecreateLegend() updateLegend(); } -//-------------------------------------------------------------------------------------------------- -/// Rounding the double value to given number of significant digits -//-------------------------------------------------------------------------------------------------- -double RimRegularLegendConfig::roundToNumSignificantDigits( double domainValue, double numSignificantDigits ) -{ - double absDomainValue = cvf::Math::abs( domainValue ); - if ( absDomainValue == 0.0 ) - { - return 0.0; - } - - double logDecValue = log10( absDomainValue ); - logDecValue = cvf::Math::ceil( logDecValue ); - - double factor = pow( 10.0, numSignificantDigits - logDecValue ); - - double tmp = domainValue * factor; - double integerPart; - double fraction = modf( tmp, &integerPart ); - - if ( cvf::Math::abs( fraction ) >= 0.5 ) ( integerPart >= 0 ) ? integerPart++ : integerPart--; - - double newDomainValue = integerPart / factor; - - return newDomainValue; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -872,8 +846,8 @@ void RimRegularLegendConfig::updateTickCountAndUserDefinedRange() { if ( m_mappingMode() == MappingType::LOG10_CONTINUOUS || m_mappingMode() == MappingType::LOG10_DISCRETE ) { - double exponentMax = computeTenExponentCeil( m_globalAutoMax ); - double exponentMin = computeTenExponentFloor( m_globalAutoPosClosestToZero ); + double exponentMax = RiaNumericalTools::computeTenExponentCeil( m_globalAutoMax ); + double exponentMin = RiaNumericalTools::computeTenExponentFloor( m_globalAutoPosClosestToZero ); m_userDefinedMaxValue = pow( 10, exponentMax ); m_userDefinedMinValue = pow( 10, exponentMin ); @@ -1171,32 +1145,6 @@ RimColorLegend* RimRegularLegendConfig::mapToColorLegend( ColorRangesType colorT return project->colorLegendCollection()->findByName( RimRegularLegendConfig::ColorRangeEnum::uiText( colorType ) ); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -double RimRegularLegendConfig::computeTenExponentCeil( double value ) -{ - if ( value < 0.0 ) return 0.0; - - double logDecValueMax = log10( value ); - logDecValueMax = cvf::Math::ceil( logDecValueMax ); - - return logDecValueMax; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -double RimRegularLegendConfig::computeTenExponentFloor( double value ) -{ - if ( value < 0.0 ) return 0.0; - - double logDecValueMin = log10( value ); - logDecValueMin = cvf::Math::floor( logDecValueMin ); - - return logDecValueMin; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimRegularLegendConfig.h b/ApplicationLibCode/ProjectDataModel/RimRegularLegendConfig.h index 19cbb1fbcc..2d6c458d8d 100644 --- a/ApplicationLibCode/ProjectDataModel/RimRegularLegendConfig.h +++ b/ApplicationLibCode/ProjectDataModel/RimRegularLegendConfig.h @@ -163,9 +163,6 @@ class RimRegularLegendConfig : public RimLegendConfig static cvf::Color3ubArray colorArrayFromColorType( ColorRangesType colorType ); static RimColorLegend* mapToColorLegend( ColorRangesType colorType ); - static double computeTenExponentCeil( double value ); - static double computeTenExponentFloor( double value ); - void updateFonts() override; QString valueToText( double value ) const; @@ -184,9 +181,8 @@ class RimRegularLegendConfig : public RimLegendConfig void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; - void updateLegend(); - void updateFieldVisibility(); - double roundToNumSignificantDigits( double value, double precision ); + void updateLegend(); + void updateFieldVisibility(); void updateCategoryItems(); void configureCategoryMapper(); diff --git a/ApplicationLibCode/ProjectDataModel/RimReloadCaseTools.cpp b/ApplicationLibCode/ProjectDataModel/RimReloadCaseTools.cpp index 9b7cfb6b44..621905d23a 100644 --- a/ApplicationLibCode/ProjectDataModel/RimReloadCaseTools.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimReloadCaseTools.cpp @@ -27,10 +27,15 @@ #include "Rim2dIntersectionView.h" #include "Rim2dIntersectionViewCollection.h" #include "RimEclipseCase.h" +#include "RimEclipseCellColors.h" +#include "RimEclipseContourMapProjection.h" #include "RimEclipseContourMapView.h" #include "RimEclipseContourMapViewCollection.h" #include "RimEclipseView.h" +#include "RimGridCalculation.h" +#include "RimGridCalculationCollection.h" #include "RimMainPlotCollection.h" +#include "RimProject.h" #include "RimSummaryCaseMainCollection.h" //-------------------------------------------------------------------------------------------------- @@ -63,6 +68,20 @@ void RimReloadCaseTools::reloadAllEclipseData( RimEclipseCase* eclipseCase, bool eclipseCase->reloadEclipseGridFile(); + std::vector gridCalculations = + RimProject::current()->gridCalculationCollection()->sortedGridCalculations(); + + for ( auto gridCalculation : gridCalculations ) + { + bool recalculate = false; + for ( auto inputCase : gridCalculation->inputCases() ) + { + if ( inputCase == eclipseCase ) recalculate = true; + } + + if ( recalculate ) gridCalculation->calculate(); + } + updateAll3dViews( eclipseCase ); if ( reloadSummaryData ) @@ -117,6 +136,16 @@ void RimReloadCaseTools::updateAll3dViews( RimEclipseCase* eclipseCase ) for ( RimEclipseContourMapView* contourMap : eclipseCase->contourMapCollection()->views() ) { CVF_ASSERT( contourMap ); + + if ( contourMap->cellResult()->resultType() == RiaDefines::ResultCatType::GENERATED ) + { + // When a generated result is selected, the data might come from a calculation. Make sure that all + // computations are updated based on new data. + // See RimEclipseContourMapProjection::generateResults() + contourMap->contourMapProjection()->clearGeometry(); + contourMap->contourMapProjection()->clearGridMappingAndRedraw(); + } + contourMap->loadDataAndUpdate(); contourMap->updateGridBoxData(); contourMap->updateAnnotationItems(); diff --git a/ApplicationLibCode/ProjectDataModel/RimRoffCase.cpp b/ApplicationLibCode/ProjectDataModel/RimRoffCase.cpp new file mode 100644 index 0000000000..06eb8acf0c --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/RimRoffCase.cpp @@ -0,0 +1,161 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022- Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimRoffCase.h" + +#include "RiaDefines.h" +#include "RiaLogging.h" +#include "RiaPreferences.h" + +#include "RifInputPropertyLoader.h" +#include "RifRoffFileTools.h" + +#include "RigActiveCellInfo.h" +#include "RigCaseCellResultsData.h" +#include "RigEclipseCaseData.h" +#include "RigMainGrid.h" + +#include "RimEclipseInputProperty.h" +#include "RimEclipseInputPropertyCollection.h" +#include "RimReservoirCellResultsStorage.h" + +#include "cafProgressInfo.h" + +#include +#include + +CAF_PDM_SOURCE_INIT( RimRoffCase, "RimRoffCase" ); +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimRoffCase::RimRoffCase() + : RimEclipseCase() +{ + CAF_PDM_InitObject( "RimRoffCase", ":/EclipseInput48x48.png" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimRoffCase::~RimRoffCase() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimRoffCase::openEclipseGridFile() +{ + if ( eclipseCaseData() ) + { + // Early exit if reservoir data is created + return true; + } + + setReservoirData( new RigEclipseCaseData( this ) ); + + QString fileName = gridFileName(); + + // First find and read the grid data + if ( eclipseCaseData()->mainGrid()->gridPointDimensions() == cvf::Vec3st( 0, 0, 0 ) ) + { + QString errorMessages; + if ( RifRoffFileTools::openGridFile( fileName, this->eclipseCaseData(), &errorMessages ) ) + { + QFileInfo gridFileInfo( fileName ); + QString caseName = gridFileInfo.completeBaseName(); + + setCaseUserDescription( caseName ); + eclipseCaseData()->mainGrid()->setFlipAxis( m_flipXAxis, m_flipYAxis ); + computeCachedData(); + } + else + { + RiaLogging::error( errorMessages ); + return false; + } + } + + results( RiaDefines::PorosityModelType::MATRIX_MODEL )->createPlaceholderResultEntries(); + + if ( RiaPreferences::current()->autocomputeDepthRelatedProperties ) + { + results( RiaDefines::PorosityModelType::MATRIX_MODEL )->computeDepthRelatedResults(); + results( RiaDefines::PorosityModelType::FRACTURE_MODEL )->computeDepthRelatedResults(); + } + + results( RiaDefines::PorosityModelType::MATRIX_MODEL )->computeCellVolumes(); + + // Read properties from grid file + RifRoffFileTools::createInputProperties( fileName, eclipseCaseData() ); + + // Read properties from input property collection + loadAndSynchronizeInputProperties( false ); + + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimRoffCase::reloadEclipseGridFile() +{ + setReservoirData( nullptr ); + openReserviorCase(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimRoffCase::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) +{ + uiOrdering.add( &m_caseUserDescription ); + uiOrdering.add( &m_displayNameOption ); + uiOrdering.add( &m_caseId ); + uiOrdering.add( &m_caseFileName ); + + auto group = uiOrdering.addNewGroup( "Case Options" ); + group->add( &m_activeFormationNames ); + group->add( &m_flipXAxis ); + group->add( &m_flipYAxis ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimRoffCase::locationOnDisc() const +{ + if ( gridFileName().isEmpty() ) return QString(); + + QFileInfo fi( gridFileName() ); + return fi.absolutePath(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimRoffCase::importAsciiInputProperties( const QStringList& fileNames ) +{ + bool importFaults = false; + RifInputPropertyLoader::loadAndSynchronizeInputProperties( m_inputPropertyCollection, + this->eclipseCaseData(), + std::vector( fileNames.begin(), fileNames.end() ), + importFaults ); + + return true; +} diff --git a/ApplicationLibCode/ProjectDataModel/RimRoffCase.h b/ApplicationLibCode/ProjectDataModel/RimRoffCase.h new file mode 100644 index 0000000000..da670d38af --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/RimRoffCase.h @@ -0,0 +1,48 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022- Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RimEclipseCase.h" + +#include "cafPdmChildField.h" +#include "cafPdmField.h" +#include "cafPdmObject.h" + +//================================================================================================== +// +// +// +//================================================================================================== +class RimRoffCase : public RimEclipseCase +{ + CAF_PDM_HEADER_INIT; + +public: + RimRoffCase(); + ~RimRoffCase() override; + + bool openEclipseGridFile() override; + void reloadEclipseGridFile() override; + bool importAsciiInputProperties( const QStringList& fileNames ) override; + + QString locationOnDisc() const override; + +protected: + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; +}; diff --git a/ApplicationLibCode/ProjectDataModel/RimStackablePlotCurve.cpp b/ApplicationLibCode/ProjectDataModel/RimStackablePlotCurve.cpp index f6bf53e6bb..cb0d8b747a 100644 --- a/ApplicationLibCode/ProjectDataModel/RimStackablePlotCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimStackablePlotCurve.cpp @@ -157,3 +157,22 @@ void RimStackablePlotCurve::stackingUiOrdering( caf::PdmUiOrdering& uiOrdering ) uiOrdering.add( &m_isStacked ); if ( m_isStacked() ) uiOrdering.add( &m_isStackedWithPhaseColors ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimStackablePlotCurve::defaultUiOrdering( caf::PdmUiOrdering& uiOrdering ) +{ + RimPlotCurve::additionalDataSourcesUiOrdering( uiOrdering ); + + caf::PdmUiGroup* stackingGroup = uiOrdering.addNewGroup( "Stacking" ); + RimStackablePlotCurve::stackingUiOrdering( *stackingGroup ); + + caf::PdmUiGroup* appearanceGroup = uiOrdering.addNewGroup( RiaDefines::appearanceGroupName() ); + RimPlotCurve::appearanceUiOrdering( *appearanceGroup ); + + caf::PdmUiGroup* nameGroup = uiOrdering.addNewGroup( RiaDefines::curveNameGroupName() ); + nameGroup->setCollapsedByDefault(); + nameGroup->add( &m_showLegend ); + RimPlotCurve::curveNameUiOrdering( *nameGroup ); +} diff --git a/ApplicationLibCode/ProjectDataModel/RimStackablePlotCurve.h b/ApplicationLibCode/ProjectDataModel/RimStackablePlotCurve.h index 735ab524f0..c7aafbfb73 100644 --- a/ApplicationLibCode/ProjectDataModel/RimStackablePlotCurve.h +++ b/ApplicationLibCode/ProjectDataModel/RimStackablePlotCurve.h @@ -37,7 +37,9 @@ class RimStackablePlotCurve : public RimPlotCurve protected: void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; + void stackingUiOrdering( caf::PdmUiOrdering& uiOrdering ); + void defaultUiOrdering( caf::PdmUiOrdering& uiOrdering ); void onFillColorChanged( const caf::SignalEmitter* emitter ) override; diff --git a/ApplicationLibCode/ProjectDataModel/RimSummaryCalculation.cpp b/ApplicationLibCode/ProjectDataModel/RimSummaryCalculation.cpp index 255312d0a9..46c1a84f1e 100644 --- a/ApplicationLibCode/ProjectDataModel/RimSummaryCalculation.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimSummaryCalculation.cpp @@ -54,7 +54,7 @@ RimSummaryCalculation::RimSummaryCalculation() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimSummaryCalculationVariable* RimSummaryCalculation::createVariable() const +RimSummaryCalculationVariable* RimSummaryCalculation::createVariable() { return new RimSummaryCalculationVariable; } diff --git a/ApplicationLibCode/ProjectDataModel/RimSummaryCalculation.h b/ApplicationLibCode/ProjectDataModel/RimSummaryCalculation.h index 5869fc5087..0767d0fdc5 100644 --- a/ApplicationLibCode/ProjectDataModel/RimSummaryCalculation.h +++ b/ApplicationLibCode/ProjectDataModel/RimSummaryCalculation.h @@ -37,5 +37,5 @@ class RimSummaryCalculation : public RimUserDefinedCalculation void removeDependentObjects() override; protected: - RimSummaryCalculationVariable* createVariable() const override; + RimSummaryCalculationVariable* createVariable() override; }; diff --git a/ApplicationLibCode/ProjectDataModel/RimTernaryLegendConfig.cpp b/ApplicationLibCode/ProjectDataModel/RimTernaryLegendConfig.cpp index 9c05d725fe..1f57107a15 100644 --- a/ApplicationLibCode/ProjectDataModel/RimTernaryLegendConfig.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimTernaryLegendConfig.cpp @@ -21,6 +21,7 @@ #include "RiaApplication.h" #include "RiaColorTables.h" +#include "RiaNumericalTools.h" #include "RiaPreferences.h" #include "RiaResultNames.h" @@ -221,11 +222,11 @@ void RimTernaryLegendConfig::setAutomaticRanges( TernaryArrayIndex ternaryIndex, double localMin, double localMax ) { - double candidateGlobalAutoMin = roundToNumSignificantDigits( globalMin, precision ); - double candidateGlobalAutoMax = roundToNumSignificantDigits( globalMax, precision ); + double candidateGlobalAutoMin = RiaNumericalTools::roundToNumSignificantDigits( globalMin, precision ); + double candidateGlobalAutoMax = RiaNumericalTools::roundToNumSignificantDigits( globalMax, precision ); - double candidateLocalAutoMin = roundToNumSignificantDigits( localMin, precision ); - double candidateLocalAutoMax = roundToNumSignificantDigits( localMax, precision ); + double candidateLocalAutoMin = RiaNumericalTools::roundToNumSignificantDigits( localMin, precision ); + double candidateLocalAutoMax = RiaNumericalTools::roundToNumSignificantDigits( localMax, precision ); m_globalAutoMin[ternaryIndex] = candidateGlobalAutoMin; m_globalAutoMax[ternaryIndex] = candidateGlobalAutoMax; @@ -262,33 +263,6 @@ void RimTernaryLegendConfig::setUiValuesFromLegendConfig( const RimTernaryLegend this->updateLegend(); } -//-------------------------------------------------------------------------------------------------- -/// Rounding the double value to given number of significant digits -//-------------------------------------------------------------------------------------------------- -double RimTernaryLegendConfig::roundToNumSignificantDigits( double domainValue, double numSignificantDigits ) -{ - double absDomainValue = cvf::Math::abs( domainValue ); - if ( absDomainValue == 0.0 ) - { - return 0.0; - } - - double logDecValue = log10( absDomainValue ); - logDecValue = cvf::Math::ceil( logDecValue ); - - double factor = pow( 10.0, numSignificantDigits - logDecValue ); - - double tmp = domainValue * factor; - double integerPart; - double fraction = modf( tmp, &integerPart ); - - if ( cvf::Math::abs( fraction ) >= 0.5 ) ( integerPart >= 0 ) ? integerPart++ : integerPart--; - - double newDomainValue = integerPart / factor; - - return newDomainValue; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimTernaryLegendConfig.h b/ApplicationLibCode/ProjectDataModel/RimTernaryLegendConfig.h index 1ad9f469d1..12f8628916 100644 --- a/ApplicationLibCode/ProjectDataModel/RimTernaryLegendConfig.h +++ b/ApplicationLibCode/ProjectDataModel/RimTernaryLegendConfig.h @@ -73,9 +73,8 @@ class RimTernaryLegendConfig : public RimLegendConfig caf::PdmUiEditorAttribute* attribute ) override; caf::PdmFieldHandle* objectToggleField() override; - void updateLegend(); - void updateLabelText(); - double roundToNumSignificantDigits( double value, double precision ); + void updateLegend(); + void updateLabelText(); void ternaryRanges( double& soilLower, double& soilUpper, diff --git a/ApplicationLibCode/ProjectDataModel/RimUserDefinedCalculation.cpp b/ApplicationLibCode/ProjectDataModel/RimUserDefinedCalculation.cpp index ed65791696..6ba3610ad3 100644 --- a/ApplicationLibCode/ProjectDataModel/RimUserDefinedCalculation.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimUserDefinedCalculation.cpp @@ -21,13 +21,16 @@ #include "expressionparser/ExpressionParser.h" #include "RiaLogging.h" +#include "RiaNetworkTools.h" #include "RimProject.h" #include "RimUserDefinedCalculationVariable.h" #include "RiuExpressionContextMenuManager.h" +#include "cafPdmUiLabelEditor.h" #include "cafPdmUiLineEditor.h" +#include "cafPdmUiPushButtonEditor.h" #include "cafPdmUiTableViewEditor.h" #include "cafPdmUiTextEditor.h" @@ -45,9 +48,21 @@ RimUserDefinedCalculation::RimUserDefinedCalculation() CAF_PDM_InitFieldNoDefault( &m_description, "Description", "Description" ); m_description.uiCapability()->setUiReadOnly( true ); - CAF_PDM_InitField( &m_expression, "Expression", QString( "" ), "Expression" ); + CAF_PDM_InitField( &m_expression, "Expression", QString( "" ), "" ); m_expression.uiCapability()->setUiEditorTypeName( caf::PdmUiTextEditor::uiEditorTypeName() ); + CAF_PDM_InitFieldNoDefault( &m_helpButton, "HelpButton", "" ); + caf::PdmUiPushButtonEditor::configureEditorForField( &m_helpButton ); + m_helpButton.xmlCapability()->disableIO(); + + CAF_PDM_InitFieldNoDefault( &m_helpText, + "Label", + "Use the right-click menu inside the text area for quick access to operators and " + "functions." ); + m_helpText.uiCapability()->setUiEditorTypeName( caf::PdmUiLabelEditor::uiEditorTypeName() ); + m_helpText.xmlCapability()->disableIO(); + m_helpText = "Use the right-click menu inside the text area for quick access to operators and functions."; + CAF_PDM_InitField( &m_unit, "Unit", QString( "" ), "Unit" ); m_unit.uiCapability()->setUiEditorTypeName( caf::PdmUiLineEditor::uiEditorTypeName() ); @@ -293,11 +308,33 @@ void RimUserDefinedCalculation::fieldChangedByUi( const caf::PdmFieldHandle* cha const QVariant& oldValue, const QVariant& newValue ) { + if ( changedField == &m_helpButton ) + { + m_helpButton = false; + + QString urlString = "https://resinsight.org/calculated-data/calculatorexpressions/"; + RiaNetworkTools::openUrl( urlString ); + + return; + } + m_isDirty = true; PdmObject::fieldChangedByUi( changedField, oldValue, newValue ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimUserDefinedCalculation::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) +{ + uiOrdering.add( &m_helpButton ); + uiOrdering.add( &m_description ); + uiOrdering.add( &m_expression ); + uiOrdering.add( &m_helpText ); + uiOrdering.add( &m_unit ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -367,6 +404,14 @@ void RimUserDefinedCalculation::defineEditorAttribute( const caf::PdmFieldHandle myAttr->enableDropTarget = true; } } + else if ( field == &m_helpButton ) + { + auto* attrib = dynamic_cast( attribute ); + if ( attrib ) + { + attrib->m_buttonText = "Open Help Page"; + } + } } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimUserDefinedCalculation.h b/ApplicationLibCode/ProjectDataModel/RimUserDefinedCalculation.h index 6fdfc0b864..50e6093191 100644 --- a/ApplicationLibCode/ProjectDataModel/RimUserDefinedCalculation.h +++ b/ApplicationLibCode/ProjectDataModel/RimUserDefinedCalculation.h @@ -69,9 +69,10 @@ class RimUserDefinedCalculation : public caf::PdmObject void attachToWidget(); protected: - virtual RimUserDefinedCalculationVariable* createVariable() const = 0; + virtual RimUserDefinedCalculationVariable* createVariable() = 0; void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; void defineEditorAttribute( const caf::PdmFieldHandle* field, QString uiConfigName, @@ -85,6 +86,8 @@ class RimUserDefinedCalculation : public caf::PdmObject protected: caf::PdmField m_description; caf::PdmField m_expression; + caf::PdmField m_helpButton; + caf::PdmField m_helpText; caf::PdmField m_unit; caf::PdmChildArrayField m_variables; diff --git a/ApplicationLibCode/ProjectDataModel/RimVfpPlot.cpp b/ApplicationLibCode/ProjectDataModel/RimVfpPlot.cpp index 7159f751cd..f83383261f 100644 --- a/ApplicationLibCode/ProjectDataModel/RimVfpPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimVfpPlot.cpp @@ -561,7 +561,7 @@ void RimVfpPlot::populatePlotWidgetWithPlotData( RiuPlotWidget* plotWidget, cons for ( auto idx = 0u; idx < plotData.size(); idx++ ) { QColor qtClr = RiaColorTables::summaryCurveDefaultPaletteColors().cycledQColor( idx ); - RiuPlotCurve* curve = m_plotWidget->createPlotCurve( nullptr, plotData.curveTitle( idx ), qtClr ); + RiuPlotCurve* curve = m_plotWidget->createPlotCurve( nullptr, plotData.curveTitle( idx ) ); curve->setAppearance( RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_SOLID, RiuQwtPlotCurveDefines::CurveInterpolationEnum::INTERPOLATION_POINT_TO_POINT, diff --git a/ApplicationLibCode/ProjectDataModel/RimViewController.cpp b/ApplicationLibCode/ProjectDataModel/RimViewController.cpp index f9ee4ccda0..b4c692b814 100644 --- a/ApplicationLibCode/ProjectDataModel/RimViewController.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimViewController.cpp @@ -60,34 +60,29 @@ CAF_PDM_SOURCE_INIT( RimViewController, "ViewController" ); //-------------------------------------------------------------------------------------------------- RimViewController::RimViewController() { - // clang-format off + CAF_PDM_InitObject( "View Link" ); - CAF_PDM_InitObject("View Link"); - - CAF_PDM_InitField(&m_isActive, "Active", true, "Active"); - m_isActive.uiCapability()->setUiHidden(true); + CAF_PDM_InitField( &m_isActive, "Active", true, "Active" ); + m_isActive.uiCapability()->setUiHidden( true ); QString defaultName = "View Config: Empty view"; - CAF_PDM_InitField(&m_name, "Name", defaultName, "Managed View Name"); - m_name.uiCapability()->setUiHidden(true); - - CAF_PDM_InitFieldNoDefault(&m_managedView, "ManagedView", "Linked View"); - m_managedView.uiCapability()->setUiTreeChildrenHidden(true); - - CAF_PDM_InitField(&m_syncCamera, "SyncCamera", true, "Camera"); - CAF_PDM_InitField(&m_showCursor, "ShowCursor", true, " Show Cursor"); - CAF_PDM_InitField(&m_syncTimeStep, "SyncTimeStep", true, "Time Step"); - CAF_PDM_InitField(&m_syncCellResult, "SyncCellResult", false, "Cell Result"); - CAF_PDM_InitField(&m_syncLegendDefinitions, "SyncLegendDefinitions", true, " Color Legend"); - - CAF_PDM_InitField(&m_syncVisibleCells, "SyncVisibleCells", false, "Visible Cells"); - /// We do not support this. Consider to remove sometime - m_syncVisibleCells.uiCapability()->setUiHidden(true); - m_syncVisibleCells.xmlCapability()->disableIO(); - - CAF_PDM_InitField(&m_syncCellFilters, "SyncRangeFilters", false, "Cell Filters"); - CAF_PDM_InitField(&m_syncPropertyFilters, "SyncPropertyFilters", false,"Property Filters"); - // clang-format on + CAF_PDM_InitField( &m_name, "Name", defaultName, "Managed View Name" ); + m_name.uiCapability()->setUiHidden( true ); + + CAF_PDM_InitFieldNoDefault( &m_managedView, "ManagedView", "Linked View" ); + m_managedView.uiCapability()->setUiTreeChildrenHidden( true ); + + CAF_PDM_InitField( &m_syncCamera, "SyncCamera", true, "Camera" ); + CAF_PDM_InitField( &m_showCursor, "ShowCursor", true, " Show Cursor" ); + CAF_PDM_InitField( &m_syncTimeStep, "SyncTimeStep", true, "Time Step" ); + CAF_PDM_InitField( &m_syncCellResult, "SyncCellResult", false, "Cell Result" ); + CAF_PDM_InitField( &m_syncLegendDefinitions, "SyncLegendDefinitions", true, " Color Legend" ); + + CAF_PDM_InitField( &m_syncCellFilters, "SyncRangeFilters", false, "Cell Filters" ); + CAF_PDM_InitField( &m_syncPropertyFilters, "SyncPropertyFilters", false, "Property Filters" ); + m_syncPropertyFilters.uiCapability()->setUiHidden( true ); + + CAF_PDM_InitField( &m_duplicatePropertyFilters, "DuplicatePropertyFilters", false, "Property Filters" ); setDeletable( true ); } @@ -98,8 +93,8 @@ RimViewController::RimViewController() RimViewController::~RimViewController() { this->removeOverrides(); - RimGridView* managedView = m_managedView; - m_managedView = nullptr; + auto managedView = m_managedView(); + m_managedView = nullptr; if ( managedView ) managedView->updateAutoName(); } @@ -113,8 +108,8 @@ QList RimViewController::calculateValueOptions( const ca if ( fieldNeedingOptions == &m_managedView ) { - RimProject* proj = RimProject::current(); - std::vector views; + RimProject* proj = RimProject::current(); + std::vector views; proj->allNotLinkedViews( views ); // Add currently linked view to list @@ -127,7 +122,7 @@ QList RimViewController::calculateValueOptions( const ca this->firstAncestorOrThisOfType( viewLinker ); CVF_ASSERT( viewLinker ); - for ( RimGridView* view : views ) + for ( auto view : views ) { if ( view != viewLinker->masterView() ) { @@ -168,10 +163,13 @@ void RimViewController::fieldChangedByUi( const caf::PdmFieldHandle* changedFiel } updateOverrides(); + updateDuplicatedPropertyFilters(); updateResultColorsControl(); updateCameraLink(); updateDisplayNameAndIcon(); updateTimeStepLink(); + + if ( m_managedView ) m_managedView->updateMdiWindowTitle(); } else if ( changedField == &m_syncCamera ) { @@ -216,23 +214,20 @@ void RimViewController::fieldChangedByUi( const caf::PdmFieldHandle* changedFiel { updateOverrides(); } + else if ( changedField == &m_duplicatePropertyFilters ) + { + updateDuplicatedPropertyFilters(); + } else if ( changedField == &m_managedView ) { PdmObjectHandle* prevValue = oldValue.value>().rawPtr(); - RimGridView* previousManagedView = dynamic_cast( prevValue ); + auto* previousManagedView = dynamic_cast( prevValue ); RimViewController::removeOverrides( previousManagedView ); - ownerViewLinker()->notifyManagedViewChange( previousManagedView, m_managedView() ); - setManagedView( m_managedView() ); m_name.uiCapability()->updateConnectedEditors(); } - else if ( &m_syncVisibleCells == changedField ) - { - updateOptionSensitivity(); - updateOverrides(); - } } //-------------------------------------------------------------------------------------------------- @@ -240,9 +235,7 @@ void RimViewController::fieldChangedByUi( const caf::PdmFieldHandle* changedFiel //-------------------------------------------------------------------------------------------------- RimEclipseView* RimViewController::managedEclipseView() const { - RimGridView* rimView = m_managedView; - - return dynamic_cast( rimView ); + return dynamic_cast( m_managedView() ); } //-------------------------------------------------------------------------------------------------- @@ -250,9 +243,7 @@ RimEclipseView* RimViewController::managedEclipseView() const //-------------------------------------------------------------------------------------------------- RimGeoMechView* RimViewController::managedGeoView() const { - RimGridView* rimView = m_managedView; - - return dynamic_cast( rimView ); + return dynamic_cast( m_managedView() ); } //-------------------------------------------------------------------------------------------------- @@ -262,7 +253,7 @@ void RimViewController::updateOverrides() { RimViewLinker* viewLinker = ownerViewLinker(); - RimGridView* masterView = viewLinker->masterView(); + auto masterView = viewLinker->masterView(); CVF_ASSERT( masterView ); @@ -280,7 +271,7 @@ void RimViewController::updateOverrides() } else { - RimEclipseView* masterEclipseView = dynamic_cast( masterView ); + auto* masterEclipseView = dynamic_cast( masterView ); if ( masterEclipseView ) { if ( manEclView ) @@ -297,7 +288,7 @@ void RimViewController::updateOverrides() } } - RimGeoMechView* masterGeoView = dynamic_cast( masterView ); + auto* masterGeoView = dynamic_cast( masterView ); if ( masterGeoView ) { if ( manGeoView ) @@ -333,7 +324,7 @@ void RimViewController::updateOverrides() //-------------------------------------------------------------------------------------------------- void RimViewController::removeOverrides() { - removeOverrides( m_managedView ); + removeOverrides( dynamic_cast( m_managedView() ) ); RimEclipseView* manEclView = managedEclipseView(); RimGeoMechView* manGeoView = managedGeoView(); @@ -355,8 +346,8 @@ void RimViewController::removeOverrides( RimGridView* view ) { if ( view ) { - RimEclipseView* manEclView = dynamic_cast( view ); - RimGeoMechView* manGeoView = dynamic_cast( view ); + auto* manEclView = dynamic_cast( view ); + auto* manGeoView = dynamic_cast( view ); if ( manEclView ) manEclView->setOverridePropertyFilterCollection( nullptr ); if ( manGeoView ) manGeoView->setOverridePropertyFilterCollection( nullptr ); @@ -370,7 +361,7 @@ void RimViewController::removeOverrides( RimGridView* view ) //-------------------------------------------------------------------------------------------------- void RimViewController::updateOptionSensitivity() { - RimGridView* mainView = nullptr; + Rim3dView* mainView = nullptr; { RimViewLinker* linkedViews = nullptr; @@ -384,8 +375,8 @@ void RimViewController::updateOptionSensitivity() CVF_ASSERT( mainView ); } - RimEclipseView* eclipseMasterView = dynamic_cast( mainView ); - RimGeoMechView* geoMasterView = dynamic_cast( mainView ); + auto* eclipseMasterView = dynamic_cast( mainView ); + auto* geoMasterView = dynamic_cast( mainView ); bool isMasterAndDependentViewDifferentType = false; if ( eclipseMasterView && !managedEclipseView() ) @@ -420,16 +411,6 @@ void RimViewController::updateOptionSensitivity() } } - if ( isCameraControlPossible() ) - { - this->m_syncCamera.uiCapability()->setUiReadOnly( false ); - } - else - { - this->m_syncCamera.uiCapability()->setUiReadOnly( true ); - this->m_syncCamera = false; - } - if ( isPropertyFilterControlPossible() ) { this->m_syncPropertyFilters.uiCapability()->setUiReadOnly( false ); @@ -449,14 +430,12 @@ void RimViewController::updateOptionSensitivity() this->m_showCursor.uiCapability()->setUiReadOnly( true ); this->m_showCursor = false; } - - m_syncVisibleCells.uiCapability()->setUiReadOnly( !this->isMasterAndDepViewDifferentType() ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimGridView* RimViewController::managedView() const +Rim3dView* RimViewController::managedView() const { return m_managedView; } @@ -464,18 +443,13 @@ RimGridView* RimViewController::managedView() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimViewController::setManagedView( RimGridView* view ) +void RimViewController::setManagedView( Rim3dView* view ) { - if ( m_managedView != view ) - { - ownerViewLinker()->notifyManagedViewChange( m_managedView(), view ); - } - m_managedView = view; updateOptionSensitivity(); - updateDefaultOptions(); updateOverrides(); + updateDuplicatedPropertyFilters(); updateResultColorsControl(); updateCameraLink(); updateDisplayNameAndIcon(); @@ -504,9 +478,9 @@ void RimViewController::defineUiOrdering( QString uiConfigName, caf::PdmUiOrderi scriptGroup->add( &m_syncLegendDefinitions ); caf::PdmUiGroup* visibleCells = uiOrdering.addNewGroup( "Link Cell Filters" ); - visibleCells->add( &m_syncVisibleCells ); visibleCells->add( &m_syncCellFilters ); visibleCells->add( &m_syncPropertyFilters ); + visibleCells->add( &m_duplicatePropertyFilters ); } //-------------------------------------------------------------------------------------------------- @@ -520,6 +494,73 @@ void RimViewController::updateDisplayNameAndIcon() setUiIcon( iconProvider ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimViewController::updateDuplicatedPropertyFilters() +{ + if ( !m_duplicatePropertyFilters ) + { + // A chain icon is used to indicate that a property filter is linked. If a property filter is unlinked, update + // the property filters to make sure the chain icon is removed + + std::vector eclipsePropertyFilters; + + RimProject::current()->descendantsIncludingThisOfType( eclipsePropertyFilters ); + for ( auto p : eclipsePropertyFilters ) + { + p->updateConnectedEditors(); + } + + std::vector geoMechPropertyFilters; + RimProject::current()->descendantsIncludingThisOfType( geoMechPropertyFilters ); + for ( auto p : geoMechPropertyFilters ) + { + p->updateConnectedEditors(); + } + + return; + } + + RimViewLinker* viewLinker = ownerViewLinker(); + + auto masterView = viewLinker->masterView(); + CVF_ASSERT( masterView ); + + if ( m_managedView ) + { + RimEclipseView* manEclView = managedEclipseView(); + auto* masterEclipseView = dynamic_cast( masterView ); + + if ( masterEclipseView && manEclView ) + { + auto propertyString = masterEclipseView->eclipsePropertyFilterCollection()->writeObjectToXmlString(); + manEclView->eclipsePropertyFilterCollection()->readObjectFromXmlString( propertyString, + caf::PdmDefaultObjectFactory::instance() ); + manEclView->eclipsePropertyFilterCollection()->loadAndInitializePropertyFilters(); + manEclView->eclipsePropertyFilterCollection()->setIsDuplicatedFromLinkedView(); + manEclView->eclipsePropertyFilterCollection()->updateAllRequiredEditors(); + + manEclView->scheduleGeometryRegen( PROPERTY_FILTERED ); + manEclView->scheduleCreateDisplayModelAndRedraw(); + } + + auto* masterGeoView = dynamic_cast( masterView ); + RimGeoMechView* manGeoView = managedGeoView(); + if ( masterGeoView && manGeoView ) + { + auto propertyString = masterGeoView->geoMechPropertyFilterCollection()->writeObjectToXmlString(); + manGeoView->geoMechPropertyFilterCollection()->readObjectFromXmlString( propertyString, + caf::PdmDefaultObjectFactory::instance() ); + manGeoView->geoMechPropertyFilterCollection()->loadAndInitializePropertyFilters(); + manGeoView->geoMechPropertyFilterCollection()->updateAllRequiredEditors(); + + manGeoView->scheduleGeometryRegen( PROPERTY_FILTERED ); + manGeoView->scheduleCreateDisplayModelAndRedraw(); + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -572,16 +613,6 @@ void RimViewController::updateLegendDefinitions() viewLinker->updateCellResult(); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimViewController::updateDefaultOptions() -{ - m_syncCellResult = isCellResultControlAdvisable(); - m_syncCellFilters = isCellFilterControlAdvisable(); - m_syncPropertyFilters = isPropertyFilterControlAdvisable(); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -598,9 +629,9 @@ RimViewLinker* RimViewController::ownerViewLinker() const //-------------------------------------------------------------------------------------------------- const RigCaseToCaseCellMapper* RimViewController::cellMapper() { - RimEclipseView* masterEclipseView = dynamic_cast( masterView() ); + auto* masterEclipseView = dynamic_cast( masterView() ); RimEclipseView* dependEclipseView = managedEclipseView(); - RimGeoMechView* masterGeomechView = dynamic_cast( masterView() ); + auto* masterGeomechView = dynamic_cast( masterView() ); RimGeoMechView* dependGeomechView = managedGeoView(); RigMainGrid* masterEclGrid = nullptr; @@ -638,10 +669,8 @@ const RigCaseToCaseCellMapper* RimViewController::cellMapper() { return m_caseToCaseCellMapper.p(); } - else - { - m_caseToCaseCellMapper = nullptr; - } + + m_caseToCaseCellMapper = nullptr; } // Create the mapping if needed @@ -672,28 +701,18 @@ const RigCaseToCaseCellMapper* RimViewController::cellMapper() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimGridView* RimViewController::masterView() const +Rim3dView* RimViewController::masterView() const { return ownerViewLinker()->masterView(); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RimViewController::isCameraControlPossible() const -{ - RimEclipseContourMapView* contourMapMasterView = dynamic_cast( masterView() ); - RimEclipseContourMapView* contourMapManagedView = dynamic_cast( managedEclipseView() ); - return !( contourMapMasterView || contourMapManagedView ); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool RimViewController::isMasterAndDepViewDifferentType() const { - RimEclipseView* eclipseMasterView = dynamic_cast( masterView() ); - RimGeoMechView* geoMasterView = dynamic_cast( masterView() ); + auto* eclipseMasterView = dynamic_cast( masterView() ); + auto* geoMasterView = dynamic_cast( masterView() ); bool isMasterAndDependentViewDifferentType = false; if ( eclipseMasterView && !managedEclipseView() ) @@ -726,7 +745,8 @@ void RimViewController::scheduleCreateDisplayModelAndRedrawForDependentView() co if ( this->isResultColorControlled() && this->managedView() ) { - this->managedView()->intersectionCollection()->scheduleCreateDisplayModelAndRedraw2dIntersectionViews(); + auto gridView = dynamic_cast( this->managedView() ); + if ( gridView ) gridView->intersectionCollection()->scheduleCreateDisplayModelAndRedraw2dIntersectionViews(); } } @@ -769,10 +789,8 @@ bool RimViewController::isCameraLinked() const { return m_syncCamera; } - else - { - return false; - } + + return false; } //-------------------------------------------------------------------------------------------------- @@ -792,10 +810,8 @@ bool RimViewController::isTimeStepLinked() const { return m_syncTimeStep; } - else - { - return false; - } + + return false; } //-------------------------------------------------------------------------------------------------- @@ -807,10 +823,8 @@ bool RimViewController::isResultColorControlled() const { return m_syncCellResult; } - else - { - return false; - } + + return false; } //-------------------------------------------------------------------------------------------------- @@ -822,10 +836,8 @@ bool RimViewController::isLegendDefinitionsControlled() const { return m_syncLegendDefinitions; } - else - { - return false; - } + + return false; } //-------------------------------------------------------------------------------------------------- @@ -833,21 +845,7 @@ bool RimViewController::isLegendDefinitionsControlled() const //-------------------------------------------------------------------------------------------------- bool RimViewController::isVisibleCellsOveridden() const { - if ( isMasterAndDepViewDifferentType() ) - { - if ( ownerViewLinker()->isActive() && this->m_isActive() ) - { - return m_syncVisibleCells(); - } - else - { - return false; - } - } - else - { - return false; - } + return false; } //-------------------------------------------------------------------------------------------------- @@ -858,8 +856,8 @@ bool RimViewController::isCellFilterMappingApplicable() const if ( !isMasterAndDepViewDifferentType() ) return false; // Make sure the cases are in the same domain - RimEclipseView* eclipseView = dynamic_cast( masterView() ); - RimGeoMechView* geomView = dynamic_cast( masterView() ); + auto* eclipseView = dynamic_cast( masterView() ); + auto* geomView = dynamic_cast( masterView() ); if ( !geomView ) geomView = managedGeoView(); if ( !eclipseView ) eclipseView = managedEclipseView(); @@ -890,7 +888,7 @@ bool RimViewController::isCellResultControlAdvisable() const { bool contourMapMasterView = dynamic_cast( masterView() ) != nullptr; bool contourMapManagedView = dynamic_cast( managedEclipseView() ) != nullptr; - return !isMasterAndDepViewDifferentType() && contourMapMasterView != contourMapManagedView; + return !isMasterAndDepViewDifferentType() && ( contourMapMasterView != contourMapManagedView ); } //-------------------------------------------------------------------------------------------------- @@ -910,7 +908,7 @@ bool RimViewController::isPropertyFilterControlAdvisable() const { bool contourMapMasterView = dynamic_cast( masterView() ) != nullptr; bool contourMapManagedView = dynamic_cast( managedEclipseView() ) != nullptr; - return isPropertyFilterControlPossible() && contourMapMasterView != contourMapManagedView; + return isPropertyFilterControlPossible() && ( contourMapMasterView != contourMapManagedView ); } //-------------------------------------------------------------------------------------------------- @@ -922,10 +920,8 @@ bool RimViewController::isCellFiltersControlled() const { return m_syncCellFilters; } - else - { - return false; - } + + return false; } //-------------------------------------------------------------------------------------------------- /// @@ -933,7 +929,7 @@ bool RimViewController::isCellFiltersControlled() const bool RimViewController::isPropertyFilterControlPossible() const { // The cases need to be the same - RimGeoMechView* geomView = dynamic_cast( masterView() ); + auto* geomView = dynamic_cast( masterView() ); if ( geomView ) { @@ -944,12 +940,12 @@ bool RimViewController::isPropertyFilterControlPossible() const } } - RimEclipseView* eclipseView = dynamic_cast( masterView() ); - + auto* eclipseView = dynamic_cast( masterView() ); if ( eclipseView ) { RimEclipseView* depEclipseView = managedEclipseView(); - if ( depEclipseView && eclipseView->eclipseCase() == depEclipseView->eclipseCase() ) + if ( depEclipseView && eclipseView->eclipseCase() && depEclipseView->eclipseCase() && + eclipseView->eclipseCase() == depEclipseView->eclipseCase() ) { return true; } @@ -969,10 +965,16 @@ bool RimViewController::isPropertyFilterOveridden() const { return m_syncPropertyFilters; } - else - { - return false; - } + + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimViewController::isPropertyFilterDuplicationActive() const +{ + return m_duplicatePropertyFilters; } //-------------------------------------------------------------------------------------------------- @@ -980,22 +982,25 @@ bool RimViewController::isPropertyFilterOveridden() const //-------------------------------------------------------------------------------------------------- void RimViewController::updateCellFilterOverrides( const RimCellFilter* changedFilter ) { - if ( !m_managedView ) return; + auto controlledGridView = dynamic_cast( m_managedView() ); + if ( !controlledGridView ) return; if ( !isCellFiltersControlled() ) { - m_managedView->setOverrideCellFilterCollection( nullptr ); + controlledGridView->setOverrideCellFilterCollection( nullptr ); return; } // Copy the rangeFilterCollection + auto masterGridView = dynamic_cast( masterView() ); + if ( !masterGridView ) return; - RimCellFilterCollection* sourceFilterCollection = masterView()->cellFilterCollection(); + RimCellFilterCollection* sourceFilterCollection = masterGridView->cellFilterCollection(); QString xmlFilterCollCopy = sourceFilterCollection->writeObjectToXmlString(); PdmObjectHandle* objectCopy = PdmXmlObjectHandle::readUnknownObjectFromXmlString( xmlFilterCollCopy, caf::PdmDefaultObjectFactory::instance(), true ); - RimCellFilterCollection* overrideFilterColl = dynamic_cast( objectCopy ); + auto* overrideFilterColl = dynamic_cast( objectCopy ); std::vector srcFilters = sourceFilterCollection->filters(); std::vector dstFilters = overrideFilterColl->filters(); @@ -1005,8 +1010,8 @@ void RimViewController::updateCellFilterOverrides( const RimCellFilter* changedF // Convert the cell filter to fit in the managed view if needed if ( isCellFilterMappingApplicable() ) { - RimEclipseView* eclipseMasterView = dynamic_cast( masterView() ); - RimGeoMechView* geoMasterView = dynamic_cast( masterView() ); + auto* eclipseMasterView = dynamic_cast( masterView() ); + auto* geoMasterView = dynamic_cast( masterView() ); if ( eclipseMasterView && depGeomView ) { @@ -1019,8 +1024,8 @@ void RimViewController::updateCellFilterOverrides( const RimCellFilter* changedF { overrideFilterColl->connectToFilterUpdates( dstFilters[rfIdx] ); - RimCellRangeFilter* srcRFilter = dynamic_cast( srcFilters[rfIdx] ); - RimCellRangeFilter* dstRFilter = dynamic_cast( dstFilters[rfIdx] ); + auto* srcRFilter = dynamic_cast( srcFilters[rfIdx] ); + auto* dstRFilter = dynamic_cast( dstFilters[rfIdx] ); if ( ( srcRFilter != nullptr ) && ( dstRFilter != nullptr ) ) { @@ -1076,11 +1081,11 @@ void RimViewController::updateCellFilterOverrides( const RimCellFilter* changedF } else { - for ( size_t rfIdx = 0; rfIdx < dstFilters.size(); ++rfIdx ) + for ( auto& dstFilter : dstFilters ) { - overrideFilterColl->connectToFilterUpdates( dstFilters[rfIdx] ); + overrideFilterColl->connectToFilterUpdates( dstFilter ); - RimPolygonFilter* polyDstFilter = dynamic_cast( dstFilters[rfIdx] ); + RimPolygonFilter* polyDstFilter = dynamic_cast( dstFilter ); if ( polyDstFilter != nullptr ) { RimCase* theCase = nullptr; @@ -1091,7 +1096,7 @@ void RimViewController::updateCellFilterOverrides( const RimCellFilter* changedF } } - m_managedView->setOverrideCellFilterCollection( overrideFilterColl ); + controlledGridView->setOverrideCellFilterCollection( overrideFilterColl ); } //-------------------------------------------------------------------------------------------------- @@ -1100,6 +1105,7 @@ void RimViewController::updateCellFilterOverrides( const RimCellFilter* changedF void RimViewController::updatePropertyFilterOverrides( RimPropertyFilter* changedPropertyFilter ) { updateOverrides(); + updateDuplicatedPropertyFilters(); } //-------------------------------------------------------------------------------------------------- @@ -1107,21 +1113,32 @@ void RimViewController::updatePropertyFilterOverrides( RimPropertyFilter* change //-------------------------------------------------------------------------------------------------- void RimViewController::applyCellFilterCollectionByUserChoice() { - if ( !m_managedView ) return; + auto managedGridView = dynamic_cast( m_managedView() ); + + if ( !managedGridView ) return; - if ( !m_managedView->hasOverriddenCellFilterCollection() ) + if ( !managedGridView->hasOverriddenCellFilterCollection() ) { return; } - bool restoreOriginal = askUserToRestoreOriginalCellFilterCollection( m_managedView->name() ); - if ( restoreOriginal ) + RimViewLinker* viewLinker = ownerViewLinker(); + auto* masterView = dynamic_cast( viewLinker->masterView() ); + + bool anyActiveCellFilter = false; + + if ( masterView ) + { + anyActiveCellFilter = !masterView->cellFilterCollection()->filters().empty(); + } + + if ( anyActiveCellFilter && askUserToRestoreOriginalCellFilterCollection( m_managedView->name() ) ) { - m_managedView->setOverrideCellFilterCollection( nullptr ); + managedGridView->setOverrideCellFilterCollection( nullptr ); } else { - m_managedView->replaceCellFilterCollectionWithOverride(); + managedGridView->replaceCellFilterCollectionWithOverride(); } } @@ -1147,8 +1164,6 @@ bool RimViewController::askUserToRestoreOriginalCellFilterCollection( const QStr { return false; } - else - { - return true; - } + + return true; } diff --git a/ApplicationLibCode/ProjectDataModel/RimViewController.h b/ApplicationLibCode/ProjectDataModel/RimViewController.h index 5e65cf8e0f..40b8b625c1 100644 --- a/ApplicationLibCode/ProjectDataModel/RimViewController.h +++ b/ApplicationLibCode/ProjectDataModel/RimViewController.h @@ -29,6 +29,7 @@ #include "RivCellSetEnum.h" class RimGridView; +class Rim3dView; class RimEclipseView; class RimGeoMechView; class RimViewLinker; @@ -50,10 +51,10 @@ class RimViewController : public caf::PdmObject bool isActive() const; - RimGridView* managedView() const; - void setManagedView( RimGridView* view ); + Rim3dView* managedView() const; + void setManagedView( Rim3dView* view ); - RimGridView* masterView() const; + Rim3dView* masterView() const; RimViewLinker* ownerViewLinker() const; const RigCaseToCaseCellMapper* cellMapper(); @@ -68,6 +69,7 @@ class RimViewController : public caf::PdmObject bool isVisibleCellsOveridden() const; bool isPropertyFilterOveridden() const; + bool isPropertyFilterDuplicationActive() const; void scheduleCreateDisplayModelAndRedrawForDependentView() const; void scheduleGeometryRegenForDepViews( RivCellSetEnum geometryType ) const; @@ -75,6 +77,7 @@ class RimViewController : public caf::PdmObject void updateOptionSensitivity(); void removeOverrides(); void updateDisplayNameAndIcon(); + void updateDuplicatedPropertyFilters(); void updateCellFilterOverrides( const RimCellFilter* changedFilter ); void applyCellFilterCollectionByUserChoice(); @@ -95,9 +98,6 @@ class RimViewController : public caf::PdmObject void updateResultColorsControl(); void updateLegendDefinitions(); - void updateDefaultOptions(); - - bool isCameraControlPossible() const; bool isMasterAndDepViewDifferentType() const; bool isPropertyFilterControlPossible() const; bool isCellFilterMappingApplicable() const; @@ -112,21 +112,20 @@ class RimViewController : public caf::PdmObject static bool askUserToRestoreOriginalCellFilterCollection( const QString& viewName ); private: - caf::PdmField m_name; - caf::PdmPtrField m_managedView; + caf::PdmField m_name; + caf::PdmPtrField m_managedView; caf::PdmField m_isActive; caf::PdmField m_syncCamera; caf::PdmField m_showCursor; caf::PdmField m_syncTimeStep; - // Overridden properties caf::PdmField m_syncCellResult; caf::PdmField m_syncLegendDefinitions; caf::PdmField m_syncCellFilters; - caf::PdmField m_syncVisibleCells; caf::PdmField m_syncPropertyFilters; + caf::PdmField m_duplicatePropertyFilters; cvf::ref m_caseToCaseCellMapper; }; diff --git a/ApplicationLibCode/ProjectDataModel/RimViewLinker.cpp b/ApplicationLibCode/ProjectDataModel/RimViewLinker.cpp index dc31bc5b50..4682d1b018 100644 --- a/ApplicationLibCode/ProjectDataModel/RimViewLinker.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimViewLinker.cpp @@ -19,6 +19,8 @@ #include "RimViewLinker.h" +#include "RiaOptionItemFactory.h" + #include "RigFemResultAddress.h" #include "RigMainGrid.h" @@ -43,7 +45,6 @@ #include "RiuViewer.h" -#include "RiaOptionItemFactory.h" #include "cafIconProvider.h" #include "cafPdmUiTreeOrdering.h" #include "cvfCamera.h" @@ -56,25 +57,21 @@ CAF_PDM_SOURCE_INIT( RimViewLinker, "ViewLinker" ); //-------------------------------------------------------------------------------------------------- RimViewLinker::RimViewLinker() { - // clang-format off - CAF_PDM_InitObject("Linked Views"); + CAF_PDM_InitObject( "Linked Views" ); - CAF_PDM_InitField(&m_name, "Name", QString("View Group Name"), "View Group Name"); - m_name.uiCapability()->setUiHidden(true); + CAF_PDM_InitField( &m_name, "Name", QString( "View Group Name" ), "View Group Name" ); + m_name.uiCapability()->setUiHidden( true ); - CAF_PDM_InitFieldNoDefault(&m_masterView, "MainView", "Main View"); - m_masterView.uiCapability()->setUiTreeChildrenHidden(true); - m_masterView.uiCapability()->setUiTreeHidden(true); - m_masterView.uiCapability()->setUiHidden(true); + CAF_PDM_InitFieldNoDefault( &m_masterView, "MainView", "Main View" ); + m_masterView.uiCapability()->setUiTreeChildrenHidden( true ); + m_masterView.uiCapability()->setUiTreeHidden( true ); + m_masterView.uiCapability()->setUiHidden( true ); - CAF_PDM_InitFieldNoDefault(&m_viewControllers, "ManagedViews", "Managed Views"); - m_viewControllers.uiCapability()->setUiTreeHidden(true); - m_viewControllers.uiCapability()->setUiTreeChildrenHidden(true); + CAF_PDM_InitFieldNoDefault( &m_viewControllers, "ManagedViews", "Managed Views" ); + m_viewControllers.uiCapability()->setUiTreeHidden( true ); + m_viewControllers.uiCapability()->setUiTreeChildrenHidden( true ); - CAF_PDM_InitFieldNoDefault(&m_comparisonView, "LinkedComparisonView", "Comparison View"); - m_comparisonView.xmlCapability()->disableIO(); - - // clang-format on + setDeletable( true ); } //-------------------------------------------------------------------------------------------------- @@ -85,15 +82,15 @@ RimViewLinker::~RimViewLinker() removeOverrides(); m_viewControllers.deleteChildren(); - RimGridView* masterView = m_masterView; - m_masterView = nullptr; + auto masterView = m_masterView(); + m_masterView = nullptr; if ( masterView ) masterView->updateAutoName(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimViewLinker::updateTimeStep( RimGridView* sourceView, int timeStep ) +void RimViewLinker::updateTimeStep( Rim3dView* sourceView, int timeStep ) { CVF_ASSERT( sourceView ); @@ -115,13 +112,14 @@ void RimViewLinker::updateTimeStep( RimGridView* sourceView, int timeStep ) m_masterView->viewer()->setCurrentFrame( timeStep ); } - for ( RimViewController* viewLink : m_viewControllers ) + for ( RimViewController* viewController : m_viewControllers ) { - if ( !viewLink->isTimeStepLinked() ) continue; + if ( !viewController->isTimeStepLinked() ) continue; - if ( viewLink->managedView() && viewLink->managedView() != sourceView && viewLink->managedView()->viewer() ) + if ( viewController->managedView() && viewController->managedView() != sourceView && + viewController->managedView()->viewer() ) { - viewLink->managedView()->viewer()->setCurrentFrame( timeStep ); + viewController->managedView()->viewer()->setCurrentFrame( timeStep ); } } } @@ -137,20 +135,20 @@ void RimViewLinker::updateCellResult() { RimEclipseResultDefinition* eclipseCellResultDefinition = masterEclipseView->cellResult(); - for ( RimViewController* viewLink : m_viewControllers ) + for ( RimViewController* viewController : m_viewControllers ) { - if ( viewLink->managedView() ) + if ( viewController->managedView() ) { - Rim3dView* managedView = viewLink->managedView(); + Rim3dView* managedView = viewController->managedView(); RimEclipseView* eclipseView = dynamic_cast( managedView ); if ( eclipseView ) { - if ( viewLink->isResultColorControlled() ) + if ( viewController->isResultColorControlled() ) { eclipseView->cellResult()->simpleCopy( eclipseCellResultDefinition ); eclipseView->cellResult()->loadResult(); - if ( viewLink->isLegendDefinitionsControlled() ) + if ( viewController->isLegendDefinitionsControlled() ) { eclipseView->cellResult()->legendConfig()->setUiValuesFromLegendConfig( masterEclipseView->cellResult()->legendConfig() ); @@ -175,19 +173,19 @@ void RimViewLinker::updateCellResult() { RimGeoMechResultDefinition* geoMechResultDefinition = masterGeoView->cellResult(); - for ( RimViewController* viewLink : m_viewControllers ) + for ( RimViewController* viewController : m_viewControllers ) { - if ( viewLink->managedView() ) + if ( viewController->managedView() ) { - Rim3dView* managedView = viewLink->managedView(); + Rim3dView* managedView = viewController->managedView(); RimGeoMechView* geoView = dynamic_cast( managedView ); if ( geoView ) { - if ( viewLink->isResultColorControlled() ) + if ( viewController->isResultColorControlled() ) { geoView->cellResult()->setResultAddress( geoMechResultDefinition->resultAddress() ); - if ( viewLink->isLegendDefinitionsControlled() ) + if ( viewController->isLegendDefinitionsControlled() ) { geoView->cellResult()->legendConfig()->setUiValuesFromLegendConfig( masterGeoView->cellResult()->legendConfig() ); @@ -210,9 +208,9 @@ void RimViewLinker::updateCellResult() //-------------------------------------------------------------------------------------------------- void RimViewLinker::updateCellFilters( const RimCellFilter* changedFilter ) { - for ( RimViewController* viewLink : m_viewControllers ) + for ( RimViewController* viewController : m_viewControllers ) { - viewLink->updateCellFilterOverrides( changedFilter ); + viewController->updateCellFilterOverrides( changedFilter ); } } @@ -221,19 +219,46 @@ void RimViewLinker::updateCellFilters( const RimCellFilter* changedFilter ) //-------------------------------------------------------------------------------------------------- void RimViewLinker::updateOverrides() { - for ( RimViewController* viewLink : m_viewControllers ) + for ( RimViewController* viewController : m_viewControllers ) { - if ( viewLink->isActive() ) + if ( viewController->isActive() ) { - viewLink->updateOverrides(); + viewController->updateOverrides(); } else { - viewLink->removeOverrides(); + viewController->removeOverrides(); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimViewLinker::updateWindowTitles() +{ + if ( m_masterView ) m_masterView->updateMdiWindowTitle(); + + for ( RimViewController* viewController : m_viewControllers ) + { + if ( auto view = viewController->managedView() ) + { + view->updateMdiWindowTitle(); } } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimViewLinker::updateDuplicatedPropertyFilters() +{ + for ( RimViewController* viewController : m_viewControllers ) + { + viewController->updateDuplicatedPropertyFilters(); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -251,7 +276,26 @@ void RimViewLinker::removeOverrides() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimViewLinker::allViewsForCameraSync( const RimGridView* source, std::vector& views ) const +void RimViewLinker::updateScaleWidgetVisibility() +{ + // Create new display model that will call RimEclipseContourMapView::onUpdateLegends() where the visibility of scale + // widgets is controlled + + if ( masterView() ) masterView()->scheduleCreateDisplayModelAndRedraw(); + + for ( RimViewController* viewController : m_viewControllers ) + { + if ( viewController->managedView() ) + { + viewController->managedView()->scheduleCreateDisplayModelAndRedraw(); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimViewLinker::allViewsForCameraSync( const Rim3dView* source, std::vector& views ) const { if ( !isActive() ) return; @@ -280,6 +324,7 @@ void RimViewLinker::updateDependentViews() if ( m_viewControllers.empty() ) return; updateOverrides(); + updateDuplicatedPropertyFilters(); updateCellResult(); updateScaleZ( m_masterView, m_masterView->scaleZ() ); updateCamera( m_masterView ); @@ -289,7 +334,7 @@ void RimViewLinker::updateDependentViews() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QString RimViewLinker::displayNameForView( RimGridView* view ) +QString RimViewLinker::displayNameForView( Rim3dView* view ) { QString displayName = "None"; @@ -304,7 +349,7 @@ QString RimViewLinker::displayNameForView( RimGridView* view ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimViewLinker::setMasterView( RimGridView* view ) +void RimViewLinker::setMasterView( Rim3dView* view ) { RimViewController* previousViewController = nullptr; if ( view ) previousViewController = view->viewController(); @@ -326,7 +371,7 @@ void RimViewLinker::setMasterView( RimGridView* view ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimGridView* RimViewLinker::masterView() const +Rim3dView* RimViewLinker::masterView() const { return m_masterView; } @@ -334,8 +379,10 @@ RimGridView* RimViewLinker::masterView() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimViewLinker::allViews( std::vector& views ) const +std::vector RimViewLinker::allViews() const { + std::vector views; + views.push_back( m_masterView() ); for ( const auto& viewController : m_viewControllers ) @@ -345,6 +392,8 @@ void RimViewLinker::allViews( std::vector& views ) const views.push_back( viewController->managedView() ); } } + + return views; } //-------------------------------------------------------------------------------------------------- @@ -353,16 +402,12 @@ void RimViewLinker::allViews( std::vector& views ) const void RimViewLinker::initAfterRead() { updateUiNameAndIcon(); - if ( m_masterView() ) - { - m_comparisonView = dynamic_cast( m_masterView->activeComparisonView() ); - } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimViewLinker::updateScaleZ( RimGridView* sourceView, double scaleZ ) +void RimViewLinker::updateScaleZ( Rim3dView* sourceView, double scaleZ ) { if ( !isActive() ) return; @@ -377,7 +422,7 @@ void RimViewLinker::updateScaleZ( RimGridView* sourceView, double scaleZ ) } } - std::vector views; + std::vector views; allViewsForCameraSync( sourceView, views ); // Make sure scale factors are identical @@ -412,7 +457,11 @@ bool RimViewLinker::isActive() const void RimViewLinker::updateUiNameAndIcon() { caf::IconProvider iconProvider; - RimViewLinker::findNameAndIconFromView( &m_name.v(), &iconProvider, m_masterView ); + + QString name; + RimViewLinker::findNameAndIconFromView( &name, &iconProvider, m_masterView ); + name += " (Primary)"; + m_name.v() = name; if ( m_masterView ) m_masterView->updateAutoName(); @@ -444,7 +493,7 @@ void RimViewLinker::scheduleCreateDisplayModelAndRedrawForDependentViews() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimViewLinker::findNameAndIconFromView( QString* name, caf::IconProvider* icon, RimGridView* view ) +void RimViewLinker::findNameAndIconFromView( QString* name, caf::IconProvider* icon, Rim3dView* view ) { CVF_ASSERT( name && icon ); @@ -462,7 +511,7 @@ void RimViewLinker::findNameAndIconFromView( QString* name, caf::IconProvider* i //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimViewLinker::updateCursorPosition( const RimGridView* sourceView, const cvf::Vec3d& domainCoord ) +void RimViewLinker::updateCursorPosition( const Rim3dView* sourceView, const cvf::Vec3d& domainCoord ) { RimViewController* sourceViewLink = sourceView->viewController(); if ( sourceViewLink && !sourceViewLink->showCursor() ) @@ -470,7 +519,7 @@ void RimViewLinker::updateCursorPosition( const RimGridView* sourceView, const c return; } - std::vector viewsToUpdate; + std::vector viewsToUpdate; allViewsForCameraSync( sourceView, viewsToUpdate ); for ( Rim3dView* destinationView : viewsToUpdate ) @@ -496,19 +545,14 @@ void RimViewLinker::updateCursorPosition( const RimGridView* sourceView, const c //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimViewLinker::notifyManagedViewChange( RimGridView* oldManagedView, RimGridView* newManagedView ) +void RimViewLinker::onChildDeleted( caf::PdmChildArrayFieldHandle* childArray, + std::vector& referringObjects ) { - if ( oldManagedView && ( oldManagedView == m_comparisonView ) ) - { - m_comparisonView = newManagedView; - m_comparisonView.uiCapability()->updateConnectedEditors(); + RimViewLinkerCollection* viewLinkerCollection = nullptr; + this->firstAncestorOrThisOfType( viewLinkerCollection ); + if ( viewLinkerCollection ) viewLinkerCollection->updateConnectedEditors(); - if ( masterView() ) - { - masterView()->setComparisonView( m_comparisonView() ); - masterView()->scheduleCreateDisplayModelAndRedraw(); - } - } + updateScaleWidgetVisibility(); } //-------------------------------------------------------------------------------------------------- @@ -518,10 +562,10 @@ QList RimViewLinker::calculateValueOptions( const caf::P { QList options; - RimGridView* actualComparisonView = nullptr; + Rim3dView* actualComparisonView = nullptr; if ( m_masterView() ) { - actualComparisonView = dynamic_cast( m_masterView->activeComparisonView() ); + actualComparisonView = m_masterView->activeComparisonView(); } bool isActiveCompViewInList = false; @@ -554,38 +598,9 @@ QList RimViewLinker::calculateValueOptions( const caf::P //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimViewLinker::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) -{ - // Update the comparison view from the master view - if ( m_masterView() ) - { - m_comparisonView = dynamic_cast( m_masterView->activeComparisonView() ); - } -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimViewLinker::fieldChangedByUi( const caf::PdmFieldHandle* changedField, - const QVariant& oldValue, - const QVariant& newValue ) -{ - if ( changedField == &m_comparisonView ) - { - if ( masterView() ) - { - masterView()->setComparisonView( m_comparisonView() ); - masterView()->scheduleCreateDisplayModelAndRedraw(); - } - } -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimViewLinker::updateCamera( RimGridView* sourceView ) +void RimViewLinker::updateCamera( Rim3dView* sourceView ) { - if ( !sourceView->viewer() ) return; + if ( !sourceView || !sourceView->viewer() ) return; if ( !isActive() ) return; @@ -598,7 +613,7 @@ void RimViewLinker::updateCamera( RimGridView* sourceView ) } } - std::vector viewsToUpdate; + std::vector viewsToUpdate; allViewsForCameraSync( sourceView, viewsToUpdate ); RimViewManipulator::applySourceViewCameraOnDestinationViews( sourceView, viewsToUpdate ); @@ -607,7 +622,7 @@ void RimViewLinker::updateCamera( RimGridView* sourceView ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimViewLinker::addDependentView( RimGridView* view ) +void RimViewLinker::addDependentView( Rim3dView* view ) { CVF_ASSERT( view && view != m_masterView ); @@ -618,12 +633,14 @@ void RimViewLinker::addDependentView( RimGridView* view ) viewContr->setManagedView( view ); } + + updateScaleWidgetVisibility(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RimViewLinker::isFirstViewDependentOnSecondView( const RimGridView* firstView, const RimGridView* secondView ) const +bool RimViewLinker::isFirstViewDependentOnSecondView( const Rim3dView* firstView, const Rim3dView* secondView ) const { for ( const RimViewController* controller : m_viewControllers() ) { @@ -679,7 +696,7 @@ void RimViewLinker::removeViewController( RimViewController* viewController ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimGridView* RimViewLinker::firstControlledView() +Rim3dView* RimViewLinker::firstControlledView() { if ( m_viewControllers.empty() ) return nullptr; diff --git a/ApplicationLibCode/ProjectDataModel/RimViewLinker.h b/ApplicationLibCode/ProjectDataModel/RimViewLinker.h index dacd1fc0e8..d36d624734 100644 --- a/ApplicationLibCode/ProjectDataModel/RimViewLinker.h +++ b/ApplicationLibCode/ProjectDataModel/RimViewLinker.h @@ -40,7 +40,7 @@ class BoundingBox; class RimViewController; class RiuViewer; -class RimGridView; +class Rim3dView; class RimCellFilter; class RimPropertyFilter; @@ -58,19 +58,21 @@ class RimViewLinker : public caf::PdmObject bool isActive() const; - void setMasterView( RimGridView* view ); - RimGridView* masterView() const; - void addDependentView( RimGridView* view ); - bool isFirstViewDependentOnSecondView( const RimGridView* firstView, const RimGridView* secondView ) const; - void updateDependentViews(); - void removeViewController( RimViewController* viewController ); - RimGridView* firstControlledView(); + void setMasterView( Rim3dView* view ); + Rim3dView* masterView() const; + void addDependentView( Rim3dView* view ); + bool isFirstViewDependentOnSecondView( const Rim3dView* firstView, const Rim3dView* secondView ) const; + void updateDependentViews(); + void removeViewController( RimViewController* viewController ); + Rim3dView* firstControlledView(); void updateOverrides(); + void updateWindowTitles(); + void updateDuplicatedPropertyFilters(); - void updateCamera( RimGridView* sourceView ); - void updateTimeStep( RimGridView* sourceView, int timeStep ); - void updateScaleZ( RimGridView* sourceView, double scaleZ ); + void updateCamera( Rim3dView* sourceView ); + void updateTimeStep( Rim3dView* sourceView, int timeStep ); + void updateScaleZ( Rim3dView* sourceView, double scaleZ ); void updateCellResult(); @@ -82,38 +84,35 @@ class RimViewLinker : public caf::PdmObject void scheduleGeometryRegenForDepViews( RivCellSetEnum geometryType ); void scheduleCreateDisplayModelAndRedrawForDependentViews(); - void allViews( std::vector& views ) const; + std::vector allViews() const; void updateUiNameAndIcon(); void addViewControllers( caf::PdmUiTreeOrdering& uiTreeOrdering ) const; - static void findNameAndIconFromView( QString* name, caf::IconProvider* icon, RimGridView* view ); + static void findNameAndIconFromView( QString* name, caf::IconProvider* icon, Rim3dView* view ); - void updateCursorPosition( const RimGridView* sourceView, const cvf::Vec3d& domainCoord ); - - void notifyManagedViewChange( RimGridView* oldManagedView, RimGridView* newManagedView ); + void updateCursorPosition( const Rim3dView* sourceView, const cvf::Vec3d& domainCoord ); protected: caf::PdmFieldHandle* userDescriptionField() override { return &m_name; } void initAfterRead() override; - void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; - - void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + void onChildDeleted( caf::PdmChildArrayFieldHandle* childArray, + std::vector& referringObjects ) override; private: - static QString displayNameForView( RimGridView* view ); + static QString displayNameForView( Rim3dView* view ); - void allViewsForCameraSync( const RimGridView* source, std::vector& views ) const; + void allViewsForCameraSync( const Rim3dView* source, std::vector& views ) const; void removeOverrides(); + void updateScaleWidgetVisibility(); private: caf::PdmChildArrayField m_viewControllers; - caf::PdmPtrField m_masterView; + caf::PdmPtrField m_masterView; caf::PdmField m_name; - caf::PdmPtrField m_comparisonView; }; diff --git a/ApplicationLibCode/ProjectDataModel/RimViewLinkerCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimViewLinkerCollection.cpp index fd9f4d2021..697452b90c 100644 --- a/ApplicationLibCode/ProjectDataModel/RimViewLinkerCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimViewLinkerCollection.cpp @@ -80,6 +80,7 @@ void RimViewLinkerCollection::fieldChangedByUi( const caf::PdmFieldHandle* chang } viewLinker()->updateDependentViews(); + viewLinker()->updateWindowTitles(); } } diff --git a/ApplicationLibCode/ProjectDataModel/RimViewManipulator.cpp b/ApplicationLibCode/ProjectDataModel/RimViewManipulator.cpp index df030f9255..644e88acb4 100644 --- a/ApplicationLibCode/ProjectDataModel/RimViewManipulator.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimViewManipulator.cpp @@ -34,8 +34,8 @@ //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimViewManipulator::applySourceViewCameraOnDestinationViews( RimGridView* sourceView, - const std::vector& destinationViews ) +void RimViewManipulator::applySourceViewCameraOnDestinationViews( Rim3dView* sourceView, + const std::vector& destinationViews ) { bool setPointOfInterest = false; cvf::Vec3d sourceCamUp; @@ -77,7 +77,7 @@ void RimViewManipulator::applySourceViewCameraOnDestinationViews( RimGridView* sourceSceneBB.transform( trans ); } - for ( RimGridView* destinationView : destinationViews ) + for ( auto destinationView : destinationViews ) { if ( !destinationView ) continue; diff --git a/ApplicationLibCode/ProjectDataModel/RimViewManipulator.h b/ApplicationLibCode/ProjectDataModel/RimViewManipulator.h index abaf1bd4e3..e99b3668c3 100644 --- a/ApplicationLibCode/ProjectDataModel/RimViewManipulator.h +++ b/ApplicationLibCode/ProjectDataModel/RimViewManipulator.h @@ -32,8 +32,8 @@ class Rim3dView; class RimViewManipulator { public: - static void applySourceViewCameraOnDestinationViews( RimGridView* sourceView, - const std::vector& destinationViews ); + static void applySourceViewCameraOnDestinationViews( Rim3dView* sourceView, + const std::vector& destinationViews ); static cvf::Vec3d calculateEquivalentCamPosOffset( Rim3dView* sourceView, Rim3dView* destView ); private: diff --git a/ApplicationLibCode/ProjectDataModel/RimViewWindow.h b/ApplicationLibCode/ProjectDataModel/RimViewWindow.h index b2b2c550d3..18d672655c 100644 --- a/ApplicationLibCode/ProjectDataModel/RimViewWindow.h +++ b/ApplicationLibCode/ProjectDataModel/RimViewWindow.h @@ -84,6 +84,8 @@ class RimViewWindow : public caf::PdmObject, public caf::FontHolderInterface void viewNavigationChanged(); + virtual void updateMdiWindowTitle(); + protected: void removeMdiWindowFromMdiArea(); @@ -93,7 +95,6 @@ class RimViewWindow : public caf::PdmObject, public caf::FontHolderInterface QString windowTitle(); virtual QWidget* createViewWidget( QWidget* mainWindowParent = nullptr ) = 0; virtual void updateViewWidgetAfterCreation(){}; - virtual void updateMdiWindowTitle(); // Has real default implementation virtual void deleteViewWidget() = 0; virtual void onLoadDataAndUpdate() = 0; virtual void onViewNavigationChanged(); diff --git a/ApplicationLibCode/ProjectDataModel/RimWellBoreStabilityPlot.cpp b/ApplicationLibCode/ProjectDataModel/RimWellBoreStabilityPlot.cpp index 7b43a813c1..b8e0743add 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellBoreStabilityPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimWellBoreStabilityPlot.cpp @@ -27,8 +27,11 @@ #include "RimGeoMechCase.h" #include "RimTools.h" #include "RimWbsParameters.h" +#include "RimWellLogCurve.h" #include "RimWellLogCurveCommonDataSource.h" #include "RimWellLogFile.h" +#include "RimWellLogPlotNameConfig.h" +#include "RimWellLogTrack.h" #include "cafPdmBase.h" #include "cafPdmFieldScriptingCapability.h" @@ -131,11 +134,17 @@ void RimWellBoreStabilityPlot::defineUiOrdering( QString uiConfigName, caf::PdmU caf::PdmUiGroup* titleGroup = uiOrdering.addNewGroup( "Plot Title" ); RimWellLogPlot::uiOrderingForAutoName( uiConfigName, *titleGroup ); - caf::PdmUiGroup* plotLayoutGroup = uiOrdering.addNewGroup( "Plot Layout" ); - RimPlotWindow::uiOrderingForPlotLayout( uiConfigName, *plotLayoutGroup ); - plotLayoutGroup->add( &m_subTitleFontSize ); - plotLayoutGroup->add( &m_axisTitleFontSize ); - plotLayoutGroup->add( &m_axisValueFontSize ); + caf::PdmUiGroup* legendGroup = uiOrdering.addNewGroup( "Legends" ); + legendGroup->setCollapsedByDefault(); + RimPlotWindow::uiOrderingForLegends( uiConfigName, *legendGroup, true ); + + caf::PdmUiGroup* fontGroup = uiOrdering.addNewGroup( "Fonts" ); + fontGroup->setCollapsedByDefault(); + RimPlotWindow::uiOrderingForFonts( uiConfigName, *fontGroup ); + + fontGroup->add( &m_subTitleFontSize ); + fontGroup->add( &m_axisTitleFontSize ); + fontGroup->add( &m_axisValueFontSize ); uiOrdering.skipRemainingFields( true ); } @@ -176,27 +185,37 @@ void RimWellBoreStabilityPlot::initAfterRead() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimWellBoreStabilityPlot::applyDataSource() +QStringList RimWellBoreStabilityPlot::supportedPlotNameVariables() const { - m_wbsParameters->setGeoMechCase( dynamic_cast( m_commonDataSource->caseToApply() ) ); - m_wbsParameters->setWellPath( m_commonDataSource->wellPathToApply() ); - m_wbsParameters->setTimeStep( m_commonDataSource->timeStepToApply() ); - this->updateConnectedEditors(); + auto variables = RimWellLogPlot::supportedPlotNameVariables(); + + variables.append( RiaDefines::namingVariableWaterDepth() ); + + return variables; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QString RimWellBoreStabilityPlot::createAutoName() const +std::map RimWellBoreStabilityPlot::createNameKeyValueMap() const { - QString name = RimWellLogPlot::createAutoName(); + auto nameKeyValueMap = RimWellLogPlot::createNameKeyValueMap(); - if ( m_nameConfig->addWaterDepth() && m_waterDepth != std::numeric_limits::infinity() ) - { - double tvdmsl = m_waterDepth; - QString waterDepthString = QString( ", Water Depth = %1 m" ).arg( tvdmsl ); - name += waterDepthString; - } + QString waterDepthString = QString( "Water Depth = %1 m" ).arg( m_waterDepth ); + nameKeyValueMap[RiaDefines::namingVariableWaterDepth()] = waterDepthString; - return name; + return nameKeyValueMap; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellBoreStabilityPlot::applyDataSource() +{ + m_wbsParameters->setGeoMechCase( dynamic_cast( m_commonDataSource->caseToApply() ) ); + m_wbsParameters->setWellPath( m_commonDataSource->wellPathToApply() ); + m_wbsParameters->setTimeStep( m_commonDataSource->timeStepToApply() ); + + this->updateReferenceWellPathInCurves(); + this->updateConnectedEditors(); } diff --git a/ApplicationLibCode/ProjectDataModel/RimWellBoreStabilityPlot.h b/ApplicationLibCode/ProjectDataModel/RimWellBoreStabilityPlot.h index 82e81a67d3..55dedb1393 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellBoreStabilityPlot.h +++ b/ApplicationLibCode/ProjectDataModel/RimWellBoreStabilityPlot.h @@ -41,8 +41,6 @@ class RimWellBoreStabilityPlot : public RimWellLogPlot void copyWbsParameters( const RimWbsParameters* wbsParameters ); void setCaseWellPathAndTimeStep( RimGeoMechCase* geoMechCase, RimWellPath* wellPath, int timeStep ); - QString createAutoName() const override; - protected: void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; @@ -50,6 +48,9 @@ class RimWellBoreStabilityPlot : public RimWellLogPlot void childFieldChangedByUi( const caf::PdmFieldHandle* changedChildField ) override; void initAfterRead() override; + QStringList supportedPlotNameVariables() const override; + std::map createNameKeyValueMap() const override; + private: void applyDataSource(); diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModel.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModel.cpp index 30017ee785..6f25d28ce4 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModel.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModel.cpp @@ -167,10 +167,12 @@ RimStimPlanModel::RimStimPlanModel() CAF_PDM_InitScriptableField( &m_extractionDepthTop, "ExtractionDepthTop", -1.0, "Depth" ); m_extractionDepthTop.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleValueEditor::uiEditorTypeName() ); m_extractionDepthTop.uiCapability()->setUiReadOnly( true ); + m_extractionDepthTop.capability()->setIOWriteable( false ); CAF_PDM_InitScriptableField( &m_extractionDepthBottom, "ExtractionDepthBottom", -1.0, "Depth" ); m_extractionDepthBottom.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleValueEditor::uiEditorTypeName() ); m_extractionDepthBottom.uiCapability()->setUiReadOnly( true ); + m_extractionDepthBottom.capability()->setIOWriteable( false ); CAF_PDM_InitScriptableField( &m_extractionType, "ExtractionType", @@ -180,6 +182,7 @@ RimStimPlanModel::RimStimPlanModel() CAF_PDM_InitScriptableFieldNoDefault( &m_anchorPosition, "AnchorPosition", "Anchor Position" ); m_anchorPosition.uiCapability()->setUiReadOnly( true ); m_anchorPosition.xmlCapability()->disableIO(); + m_anchorPosition.capability()->setIOWriteable( false ); CAF_PDM_InitFieldNoDefault( &m_anchorPositionForUi, "AnchorPositionForUi", "Anchor Position" ); m_anchorPositionForUi.registerGetMethod( this, &RimStimPlanModel::anchorPositionForUi ); @@ -189,16 +192,19 @@ RimStimPlanModel::RimStimPlanModel() CAF_PDM_InitScriptableFieldNoDefault( &m_thicknessDirection, "ThicknessDirection", "Thickness Direction" ); m_thicknessDirection.uiCapability()->setUiReadOnly( true ); m_thicknessDirection.xmlCapability()->disableIO(); + m_thicknessDirection.capability()->setIOWriteable( false ); CAF_PDM_InitScriptableFieldNoDefault( &m_originalThicknessDirection, "OriginalThicknessDirection", "Original Thickness Direction" ); m_originalThicknessDirection.uiCapability()->setUiReadOnly( true ); m_originalThicknessDirection.xmlCapability()->disableIO(); + m_originalThicknessDirection.capability()->setIOWriteable( false ); CAF_PDM_InitScriptableFieldNoDefault( &m_thicknessDirectionWellPath, "ThicknessDirectionWellPath", "Thickness Direction Well Path" ); + m_thicknessDirectionWellPath.capability()->setIOWriteable( false ); CAF_PDM_InitScriptableField( &m_boundingBoxHorizontal, "BoundingBoxHorizontal", 50.0, "Bounding Box Horizontal" ); CAF_PDM_InitScriptableField( &m_boundingBoxVertical, "BoundingBoxVertical", 100.0, "Bounding Box Vertical" ); @@ -297,7 +303,7 @@ void RimStimPlanModel::initAfterRead() m_stimPlanModelTemplate->changed.connect( this, &RimStimPlanModel::stimPlanModelTemplateChanged ); } - if ( m_extractionDepthTop() < 0.0 || m_extractionDepthBottom < 0.0 ) + if ( m_extractionDepthTop() < 0.0 || m_extractionDepthBottom() < 0.0 ) { updateExtractionDepthBoundaries(); } @@ -313,10 +319,10 @@ void RimStimPlanModel::fieldChangedByUi( const caf::PdmFieldHandle* changedField if ( changedField == &m_MD ) { updatePositionFromMeasuredDepth(); - updateExtractionDepthBoundaries(); } - if ( changedField == &m_extractionOffsetTop || changedField == &m_extractionOffsetBottom ) + if ( changedField == &m_MD || changedField == &m_extractionOffsetTop || changedField == &m_extractionOffsetBottom || + changedField == &m_extractionDepthTop || changedField == &m_extractionDepthBottom ) { updateExtractionDepthBoundaries(); } @@ -325,8 +331,8 @@ void RimStimPlanModel::fieldChangedByUi( const caf::PdmFieldHandle* changedField changedField == &m_boundingBoxHorizontal || changedField == &m_fractureOrientation || changedField == &m_autoComputeBarrier || changedField == &m_azimuthAngle || changedField == &m_showOnlyBarrierFault || changedField == &m_eclipseCase || - changedField == &m_extractionDepthTop || changedField == &m_extractionDepthBottom || changedField == &m_extractionOffsetTop || changedField == &m_extractionOffsetBottom || + changedField == &m_extractionDepthTop || changedField == &m_extractionDepthBottom || changedField == &m_perforationLength ) { updateThicknessDirection(); @@ -824,31 +830,28 @@ RimAnnotationCollectionBase* RimStimPlanModel::annotationCollection() //-------------------------------------------------------------------------------------------------- void RimStimPlanModel::updatePerforationInterval() { - if ( m_thicknessDirectionWellPath ) - { - if ( !m_perforationInterval ) - { - m_perforationInterval = new RimPerforationInterval; - m_thicknessDirectionWellPath->perforationIntervalCollection()->appendPerforation( m_perforationInterval ); - } - - double halfPerforationLength = m_perforationLength() * 0.5; - if ( m_fractureOrientation == FractureOrientation::ALONG_WELL_PATH ) - { - // Adjust perforation interval for longitudinal fractures to correct TVD depth - CAF_ASSERT( wellPath() ); - CAF_ASSERT( wellPath()->wellPathGeometry() ); + if ( !m_thicknessDirectionWellPath || !wellPath() || !wellPath()->wellPathGeometry() ) return; - cvf::Vec3d wellPathTangent = wellPath()->wellPathGeometry()->tangentAlongWellPath( m_MD() ); - halfPerforationLength = - RigStimPlanModelTools::calculatePerforationLength( wellPathTangent, m_perforationLength() ) * 0.5; - } + if ( !m_perforationInterval ) + { + m_perforationInterval = new RimPerforationInterval; + m_perforationInterval->setUnitSystemSpecificDefaults(); + m_thicknessDirectionWellPath->perforationIntervalCollection()->appendPerforation( m_perforationInterval ); + } - double closestMd = m_thicknessDirectionWellPath->wellPathGeometry()->closestMeasuredDepth( m_anchorPosition ); - m_perforationInterval->setStartAndEndMD( closestMd - halfPerforationLength, closestMd + halfPerforationLength ); - m_perforationInterval->updateConnectedEditors(); - updateViewsAndPlots(); + double halfPerforationLength = m_perforationLength() * 0.5; + if ( m_fractureOrientation == FractureOrientation::ALONG_WELL_PATH ) + { + // Adjust perforation interval for longitudinal fractures to correct TVD depth + cvf::Vec3d wellPathTangent = wellPath()->wellPathGeometry()->tangentAlongWellPath( m_MD() ); + halfPerforationLength = + RigStimPlanModelTools::calculatePerforationLength( wellPathTangent, m_perforationLength() ) * 0.5; } + + double closestMd = m_thicknessDirectionWellPath->wellPathGeometry()->closestMeasuredDepth( m_anchorPosition ); + m_perforationInterval->setStartAndEndMD( closestMd - halfPerforationLength, closestMd + halfPerforationLength ); + m_perforationInterval->updateConnectedEditors(); + updateViewsAndPlots(); } //-------------------------------------------------------------------------------------------------- @@ -1594,7 +1597,8 @@ void RimStimPlanModel::updateViewsAndPlots() this->firstAncestorOrThisOfType( eclipseCase ); if ( eclipseCase ) { - RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews( eclipseCase ); + RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews( + { eclipseCase } ); } else { diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCurve.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCurve.cpp index c4ccf87eb8..da66a10404 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCurve.cpp @@ -139,6 +139,11 @@ void RimStimPlanModelCurve::performDataExtraction( bool* isUsingPseudoLength ) return; } + if ( !eclipseCase->eclipseCaseData() ) + { + return; + } + RiaDefines::EclipseUnitSystem eclipseUnitsType = eclipseCase->eclipseCaseData()->unitsType(); if ( eclipseUnitsType == RiaDefines::EclipseUnitSystem::UNITS_FIELD ) { diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelElasticPropertyCalculator.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelElasticPropertyCalculator.cpp index 1d20513675..7ca1742a2c 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelElasticPropertyCalculator.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelElasticPropertyCalculator.cpp @@ -113,6 +113,12 @@ bool RimStimPlanModelElasticPropertyCalculator::calculate( RiaDefines::CurveProp return false; } + auto eclipseCaseData = eclipseCase->eclipseCaseData(); + if ( !eclipseCaseData ) + { + return false; + } + RigEclipseWellLogExtractor eclExtractor( eclipseCase->eclipseCaseData(), wellPathGeometry, "fracture model" ); measuredDepthValues = eclExtractor.cellIntersectionMDs(); diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelLayerCalculator.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelLayerCalculator.cpp index fa81f7f4ce..b20e6d7ff4 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelLayerCalculator.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelLayerCalculator.cpp @@ -74,6 +74,11 @@ bool RimStimPlanModelLayerCalculator::calculate( RiaDefines::CurveProperty curve return false; } + if ( !eclipseCase->eclipseCaseData() ) + { + return false; + } + if ( !stimPlanModel->thicknessDirectionWellPath() ) { return false; diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelPlot.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelPlot.cpp index f493ff0bcb..471fee86ab 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelPlot.cpp @@ -27,6 +27,7 @@ #include "RimStimPlanModelCurve.h" #include "RimStimPlanModelPropertyCurve.h" #include "RimTools.h" +#include "RimWellLogPlotNameConfig.h" #include "RimWellLogTrack.h" #include "cafPdmBase.h" @@ -95,8 +96,7 @@ void RimStimPlanModelPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrd caf::PdmUiGroup* titleGroup = uiOrdering.addNewGroup( "Plot Title" ); RimDepthTrackPlot::uiOrderingForAutoName( uiConfigName, *titleGroup ); - caf::PdmUiGroup* plotLayoutGroup = uiOrdering.addNewGroup( "Plot Layout" ); - RimPlotWindow::uiOrderingForPlotLayout( uiConfigName, *plotLayoutGroup ); + RimPlotWindow::uiOrderingForLegendsAndFonts( uiConfigName, uiOrdering ); uiOrdering.skipRemainingFields( true ); } @@ -132,6 +132,8 @@ void RimStimPlanModelPlot::fieldChangedByUi( const caf::PdmFieldHandle* changedF const QVariant& oldValue, const QVariant& newValue ) { + RimDepthTrackPlot::fieldChangedByUi( changedField, oldValue, newValue ); + if ( m_stimPlanModel ) { if ( changedField == &m_eclipseCase || changedField == &m_timeStep ) diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelStressCalculator.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelStressCalculator.cpp index 5411f2fc0b..8dd0e62b5b 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelStressCalculator.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelStressCalculator.cpp @@ -114,7 +114,7 @@ bool RimStimPlanModelStressCalculator::calculate( RiaDefines::CurveProperty curv addDatapointsForBottomOfLayers( tvDepthValues, values ); } - if ( eclipseCase ) + if ( eclipseCase && eclipseCase->eclipseCaseData() ) { RigEclipseWellLogExtractor eclExtractor( eclipseCase->eclipseCaseData(), wellPathGeometry, "fracture model" ); diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelWellLogCalculator.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelWellLogCalculator.cpp index d7171dcf95..f912ebc122 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelWellLogCalculator.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelWellLogCalculator.cpp @@ -563,7 +563,15 @@ bool RimStimPlanModelWellLogCalculator::extractValuesForProperty( RiaDefines::Cu RiaLogging::info( QString( "Extracting values for '%1' from grid '%2'." ) .arg( caf::AppEnum( curveProperty ).uiText() ) .arg( eclipseCase->caseUserDescription() ) ); - RigEclipseWellLogExtractor eclExtractor( eclipseCase->eclipseCaseData(), wellPathGeometry, "fracture model" ); + + auto eclipseCaseData = eclipseCase->eclipseCaseData(); + if ( !eclipseCaseData ) + { + RiaLogging::error( "Missing Eclipse case data." ); + return false; + } + + RigEclipseWellLogExtractor eclExtractor( eclipseCaseData, wellPathGeometry, "fracture model" ); measuredDepthValues = eclExtractor.cellIntersectionMDs(); tvDepthValues = eclExtractor.cellIntersectionTVDs(); @@ -584,10 +592,7 @@ bool RimStimPlanModelWellLogCalculator::extractValuesForProperty( RiaDefines::Cu } cvf::ref resAcc = - RigResultAccessorFactory::createFromResultDefinition( eclipseCase->eclipseCaseData(), - 0, - timeStep, - &eclipseResultDefinition ); + RigResultAccessorFactory::createFromResultDefinition( eclipseCaseData, 0, timeStep, &eclipseResultDefinition ); if ( resAcc.notNull() ) { @@ -635,8 +640,15 @@ bool RimStimPlanModelWellLogCalculator::replaceMissingValuesWithDefault( RiaDefi QString resultVariable = stimPlanModel->eclipseResultVariable( curveProperty ); + auto eclipseCaseData = eclipseCase->eclipseCaseData(); + if ( !eclipseCaseData ) + { + RiaLogging::error( "Missing Eclipse case data." ); + return false; + } + // Try to locate a backup accessor (e.g. PORO_1 for PORO) - cvf::ref backupResAcc = findMissingValuesAccessor( eclipseCase->eclipseCaseData(), + cvf::ref backupResAcc = findMissingValuesAccessor( eclipseCaseData, eclipseCase->inputPropertyCollection(), 0, replacementTimeStep, @@ -780,6 +792,11 @@ bool RimStimPlanModelWellLogCalculator::replaceMissingValuesWithOtherKLayer( Ria const RigMainGrid* mainGrid = eclipseCase->mainGrid(); RigEclipseCaseData* caseData = eclipseCase->eclipseCaseData(); + if ( !caseData ) + { + RiaLogging::error( "Missing Eclipse case data." ); + return false; + } RiaDefines::PorosityModelType porosityModel = RiaDefines::PorosityModelType::MATRIX_MODEL; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimAsciiDataCurve.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimAsciiDataCurve.cpp index 6d83094424..e3a7506ebd 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimAsciiDataCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimAsciiDataCurve.cpp @@ -177,7 +177,7 @@ void RimAsciiDataCurve::onLoadDataAndUpdate( bool updateParentPlot ) //-------------------------------------------------------------------------------------------------- void RimAsciiDataCurve::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) { - RimPlotCurve::updateOptionSensitivity(); + RimPlotCurve::updateFieldUiState(); uiOrdering.add( &m_plotAxis ); diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimCalculatedSummaryCase.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimCalculatedSummaryCase.cpp index 3cd314794e..3831a25ce8 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimCalculatedSummaryCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimCalculatedSummaryCase.cpp @@ -18,6 +18,8 @@ #include "RimCalculatedSummaryCase.h" +#include "RiaSummaryDefines.h" + #include "RimSummaryCalculation.h" #include "RimSummaryCalculationCollection.h" @@ -31,7 +33,7 @@ RimCalculatedSummaryCase::RimCalculatedSummaryCase() CAF_PDM_InitObject( "Calculated", ":/SummaryCase.svg" ); m_calculatedCurveReader = nullptr; - m_displayName = "Calculated"; + m_displayName = RiaDefines::summaryCalculated(); } //-------------------------------------------------------------------------------------------------- @@ -46,7 +48,7 @@ RimCalculatedSummaryCase::~RimCalculatedSummaryCase() //-------------------------------------------------------------------------------------------------- QString RimCalculatedSummaryCase::caseName() const { - return "Calculated"; + return RiaDefines::summaryCalculated(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.cpp index ceaef0e107..731c50cca8 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.cpp @@ -28,6 +28,7 @@ #include "RimObjectiveFunctionTools.h" #include "RimSummaryAddress.h" #include "RimSummaryCase.h" +#include "RimSummaryCaseCollection.h" #include "RiuSummaryVectorSelectionDialog.h" @@ -259,7 +260,7 @@ QList RimEnsembleCurveFilter::calculateValueOptions( con auto curveSet = parentCurveSet(); if ( curveSet ) { - auto params = curveSet->correlationSortedEnsembleParameters(); + auto params = curveSet->ensembleParameters( RimEnsembleCurveSet::ParameterSorting::ABSOLUTE_VALUE ); for ( const auto& [param, corr] : params ) { options.push_back( @@ -656,7 +657,7 @@ void RimEnsembleCurveFilter::updateMaxMinAndDefaultValues( bool forceDefault ) { if ( !selectedEnsembleParameter().isValid() ) { - auto ensParams = parentCurveSet()->correlationSortedEnsembleParameters(); + auto ensParams = parentCurveSet()->ensembleParameters( RimEnsembleCurveSet::ParameterSorting::ABSOLUTE_VALUE ); if ( !ensParams.empty() ) { m_ensembleParameterName = ensParams.front().first.name; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp index fba0ee477a..f1bb6282c6 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp @@ -74,6 +74,20 @@ #include +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +namespace caf +{ +template <> +void AppEnum::setUp() +{ + addItem( RimEnsembleCurveSet::ParameterSorting::ABSOLUTE_VALUE, "ABSOLUTE_VALUE", "Absolute Correlation" ); + addItem( RimEnsembleCurveSet::ParameterSorting::ALPHABETICALLY, "ALPHABETICALLY", "Alphabetically" ); + setDefault( RimEnsembleCurveSet::ParameterSorting::ABSOLUTE_VALUE ); +} +} // namespace caf + //-------------------------------------------------------------------------------------------------- /// Internal functions //-------------------------------------------------------------------------------------------------- @@ -123,8 +137,10 @@ RimEnsembleCurveSet::RimEnsembleCurveSet() CAF_PDM_InitField( &m_color, "Color", RiaColorTools::textColor3f(), "Color" ); - CAF_PDM_InitField( &m_ensembleParameter, "EnsembleParameter", QString( "" ), "Ensemble Parameter" ); - m_ensembleParameter.uiCapability()->setUiEditorTypeName( caf::PdmUiListEditor::uiEditorTypeName() ); + CAF_PDM_InitField( &m_ensembleParameter, "EnsembleParameter", QString( "" ), "Parameter" ); + m_ensembleParameter.uiCapability()->setUiEditorTypeName( caf::PdmUiTreeSelectionEditor::uiEditorTypeName() ); + + CAF_PDM_InitFieldNoDefault( &m_ensembleParameterSorting, "EnsembleParameterSorting", "Parameter Sorting" ); CAF_PDM_InitFieldNoDefault( &m_objectiveValuesSummaryAddressesUiField, "SelectedObjectiveSummaryVar", "Vector" ); m_objectiveValuesSummaryAddressesUiField.xmlCapability()->disableIO(); @@ -939,6 +955,7 @@ void RimEnsembleCurveSet::appendColorGroup( caf::PdmUiOrdering& uiOrdering ) else if ( m_colorMode == ColorMode::BY_ENSEMBLE_PARAM ) { m_ensembleParameter.uiCapability()->setUiReadOnly( !m_yValuesSummaryCaseCollection() ); + colorsGroup->add( &m_ensembleParameterSorting ); colorsGroup->add( &m_ensembleParameter ); } else if ( m_colorMode == ColorMode::BY_OBJECTIVE_FUNCTION || m_colorMode == ColorMode::BY_CUSTOM_OBJECTIVE_FUNCTION ) @@ -1107,7 +1124,7 @@ QList RimEnsembleCurveSet::calculateValueOptions( const } else if ( fieldNeedingOptions == &m_ensembleParameter ) { - auto params = correlationSortedEnsembleParameters(); + auto params = ensembleParameters( m_ensembleParameterSorting() ); for ( const auto& paramCorrPair : params ) { QString name = paramCorrPair.first.name; @@ -1723,8 +1740,7 @@ void RimEnsembleCurveSet::updateEnsembleCurves( const std::vectorplotWidget()->createPlotCurve( nullptr, "", RiaColorTools::toQColor( m_color ) ); + m_plotCurveForLegendText = plot->plotWidget()->createPlotCurve( nullptr, "" ); } m_plotCurveForLegendText->attachToPlot( plot->plotWidget() ); updateEnsembleLegendItem(); @@ -1885,17 +1901,29 @@ std::vector RimEnsembleCurveSet::variationSortedEnsemblePa //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector> RimEnsembleCurveSet::correlationSortedEnsembleParameters() const +std::vector> + RimEnsembleCurveSet::ensembleParameters( ParameterSorting sortingMode ) const { RimSummaryCaseCollection* ensemble = m_yValuesSummaryCaseCollection; if ( ensemble ) { - return ensemble->correlationSortedEnsembleParameters( summaryAddress() ); - } - else - { - return std::vector>(); + if ( sortingMode == ParameterSorting::ABSOLUTE_VALUE ) + { + return ensemble->correlationSortedEnsembleParameters( summaryAddress() ); + } + + if ( sortingMode == ParameterSorting::ALPHABETICALLY ) + { + auto parameters = ensemble->parameterCorrelationsAllTimeSteps( summaryAddress() ); + std::sort( parameters.begin(), parameters.end(), []( const auto& lhs, const auto& rhs ) { + return lhs.first.name < rhs.first.name; + } ); + + return parameters; + } } + + return {}; } //-------------------------------------------------------------------------------------------------- @@ -2031,11 +2059,12 @@ QString RimEnsembleCurveSet::createAutoName() const RimSummaryPlot* plot = nullptr; firstAncestorOrThisOfTypeAsserted( plot ); - QString curveSetName = - m_summaryAddressNameTools->curveNameY( m_yValuesSummaryAddress->address(), plot->plotTitleHelper() ); + QString curveSetName = m_summaryAddressNameTools->curveNameY( m_yValuesSummaryAddress->address(), + plot->plotTitleHelper(), + plot->plotTitleHelper() ); if ( curveSetName.isEmpty() ) { - curveSetName = m_summaryAddressNameTools->curveNameY( m_yValuesSummaryAddress->address(), nullptr ); + curveSetName = m_summaryAddressNameTools->curveNameY( m_yValuesSummaryAddress->address(), nullptr, nullptr ); } if ( curveSetName.isEmpty() ) diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h index 8ac2b87b40..641dd67b07 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h @@ -27,9 +27,6 @@ #include "RimEnsembleCurveSetColorManager.h" #include "RimEnsembleCurveSetInterface.h" -#include "RimObjectiveFunction.h" -#include "RimSummaryCase.h" -#include "RimSummaryCaseCollection.h" #include "RimTimeStepFilter.h" #include "RigEnsembleParameter.h" @@ -84,6 +81,12 @@ class RimEnsembleCurveSet : public caf::PdmObject, public RimEnsembleCurveSetInt using ColorModeEnum = RimEnsembleCurveSetColorManager::ColorModeEnum; using TimeStepFilterEnum = caf::AppEnum; + enum class ParameterSorting + { + ABSOLUTE_VALUE, + ALPHABETICALLY + }; + public: RimEnsembleCurveSet(); ~RimEnsembleCurveSet() override; @@ -140,7 +143,7 @@ class RimEnsembleCurveSet : public caf::PdmObject, public RimEnsembleCurveSetInt void updateAllTextInPlot(); std::vector variationSortedEnsembleParameters() const; - std::vector> correlationSortedEnsembleParameters() const; + std::vector> ensembleParameters( ParameterSorting sortingMode ) const; std::vector filterEnsembleCases( const std::vector& sumCases ); void disableStatisticCurves(); @@ -222,9 +225,10 @@ class RimEnsembleCurveSet : public caf::PdmObject, public RimEnsembleCurveSetInt caf::PdmField m_yPushButtonSelectSummaryAddress; caf::PdmField m_resampling; - caf::PdmField m_colorMode; - caf::PdmField m_color; - caf::PdmField m_ensembleParameter; + caf::PdmField m_colorMode; + caf::PdmField m_color; + caf::PdmField m_ensembleParameter; + caf::PdmField> m_ensembleParameterSorting; caf::PdmChildArrayField m_objectiveValuesSummaryAddresses; caf::PdmField m_objectiveValuesSummaryAddressesUiField; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.cpp index e53dffe9bc..32eeff6ce1 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.cpp @@ -19,12 +19,15 @@ #include "RimEnsembleCurveSetColorManager.h" #include "RiaColorTables.h" + #include "RimCustomObjectiveFunction.h" #include "RimEnsembleCurveSet.h" #include "RimEnsembleCurveSetCollection.h" #include "RimObjectiveFunction.h" - #include "RimRegularLegendConfig.h" +#include "RimSummaryCase.h" +#include "RimSummaryCaseCollection.h" + #include "cvfScalarMapper.h" //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.h b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.h index 72af9ff935..d13b43da01 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.h @@ -21,7 +21,6 @@ #include "RiaDefines.h" #include "RimRegularLegendConfig.h" -#include "RimSummaryCaseCollection.h" #include "RigEnsembleParameter.h" @@ -33,6 +32,9 @@ class RimEnsembleCurveSet; class RimEnsembleCurveSetCollection; class RimCustomObjectiveFunction; class RimObjectiveFunction; +class RimSummaryCase; +class RifEclipseSummaryAddress; +class ObjectiveFunctionTimeConfig; //-------------------------------------------------------------------------------------------------- /// diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp index 9b1614291b..332de2f6d3 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp @@ -25,6 +25,7 @@ #include "RigStatisticsMath.h" #include "RimEnsembleCurveSet.h" +#include "RimSummaryCaseCollection.h" #include #include diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimFileSummaryCase.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimFileSummaryCase.cpp index 15ddb24b06..db3de30dfc 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimFileSummaryCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimFileSummaryCase.cpp @@ -139,12 +139,43 @@ void RimFileSummaryCase::createRftReaderInterface() QFileInfo fileInfo( summaryHeaderFilename() ); QString folder = fileInfo.absolutePath(); - QString rftFileName = folder + "/" + fileInfo.completeBaseName() + ".RFT"; - QFileInfo rftFileInfo( rftFileName ); + QString rftFileName = folder + "/" + fileInfo.completeBaseName() + ".RFT"; + { + QFileInfo fi( rftFileName ); + + if ( fi.exists() ) + { + m_rftCase()->setRftFileName( rftFileName ); + } + } - if ( rftFileInfo.exists() ) + if ( m_rftCase->dataDeckFilePath().isEmpty() ) { - m_rftCase()->setRftFileName( rftFileName ); + // Search for *.DATA file in same folder as summary file. If not found, search for a schedule file. + QString validDataDeckFileName; + + QString dataDeckFileName = folder + "/" + fileInfo.completeBaseName() + ".DATA"; + QFileInfo fi( dataDeckFileName ); + + if ( fi.exists() ) + { + validDataDeckFileName = dataDeckFileName; + } + else + { + QString scheduleFileName = folder + "/" + fileInfo.completeBaseName() + ".SCH"; + QFileInfo fi( scheduleFileName ); + + if ( fi.exists() ) + { + validDataDeckFileName = scheduleFileName; + } + } + + if ( !validDataDeckFileName.isEmpty() ) + { + m_rftCase->setDataDeckFileName( dataDeckFileName ); + } } m_summaryEclipseRftReader = @@ -238,7 +269,12 @@ void RimFileSummaryCase::defineEditorAttribute( const caf::PdmFieldHandle* field void RimFileSummaryCase::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName /*= "" */ ) { RimSummaryCase::defineUiTreeOrdering( uiTreeOrdering, uiConfigName ); - uiTreeOrdering.add( m_rftCase() ); + + if ( rftReader() ) + { + uiTreeOrdering.add( m_rftCase() ); + } + uiTreeOrdering.skipRemainingChildren(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimMultipleSummaryPlotNameHelper.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimMultipleSummaryPlotNameHelper.cpp index 854d107a74..82a98de770 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimMultipleSummaryPlotNameHelper.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimMultipleSummaryPlotNameHelper.cpp @@ -132,6 +132,22 @@ bool RimMultiSummaryPlotNameHelper::isCompletionInTitle() const } ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::set RimMultiSummaryPlotNameHelper::vectorNames() const +{ + std::set allNames; + + for ( auto nameHelper : m_nameHelpers ) + { + auto nameHelperVectorNames = nameHelper->vectorNames(); + allNames.insert( nameHelperVectorNames.begin(), nameHelperVectorNames.end() ); + } + + return allNames; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimMultipleSummaryPlotNameHelper.h b/ApplicationLibCode/ProjectDataModel/Summary/RimMultipleSummaryPlotNameHelper.h index 1ac675e2b8..2fcc938cc0 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimMultipleSummaryPlotNameHelper.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimMultipleSummaryPlotNameHelper.h @@ -39,7 +39,8 @@ class RimMultiSummaryPlotNameHelper : public RimSummaryNameHelper bool isSegmentInTitle() const override; bool isCompletionInTitle() const override; - QString caseName() const override; + std::set vectorNames() const override; + QString caseName() const override; std::string titleVectorName() const override; std::string titleWellName() const override; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddress.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddress.cpp index 49146f452c..f454be38ff 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddress.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddress.cpp @@ -18,6 +18,8 @@ #include "RimSummaryAddress.h" +#include "RiaSummaryDefines.h" + #include "RimProject.h" #include "RimSummaryCalculation.h" #include "RimSummaryCalculationCollection.h" @@ -29,24 +31,26 @@ namespace caf template <> void caf::AppEnum::setUp() { - addItem( RifEclipseSummaryAddress::SUMMARY_FIELD, "SUMMARY_FIELD", "Field" ); - addItem( RifEclipseSummaryAddress::SUMMARY_AQUIFER, "SUMMARY_AQUIFER", "Aquifer" ); - addItem( RifEclipseSummaryAddress::SUMMARY_NETWORK, "SUMMARY_NETWORK", "Network" ); - addItem( RifEclipseSummaryAddress::SUMMARY_MISC, "SUMMARY_MISC", "Misc" ); - addItem( RifEclipseSummaryAddress::SUMMARY_REGION, "SUMMARY_REGION", "Region" ); - addItem( RifEclipseSummaryAddress::SUMMARY_REGION_2_REGION, "SUMMARY_REGION_2_REGION", "Region-Region" ); - addItem( RifEclipseSummaryAddress::SUMMARY_GROUP, "SUMMARY_WELL_GROUP", "Group" ); - addItem( RifEclipseSummaryAddress::SUMMARY_WELL, "SUMMARY_WELL", "Well" ); - addItem( RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION, "SUMMARY_WELL_COMPLETION", "Completion" ); - addItem( RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION_LGR, "SUMMARY_WELL_COMPLETION_LGR", "Lgr-Completion" ); - addItem( RifEclipseSummaryAddress::SUMMARY_WELL_LGR, "SUMMARY_WELL_LGR", "Lgr-Well" ); - addItem( RifEclipseSummaryAddress::SUMMARY_WELL_SEGMENT, "SUMMARY_SEGMENT", "Segment" ); - addItem( RifEclipseSummaryAddress::SUMMARY_BLOCK, "SUMMARY_BLOCK", "Block" ); - addItem( RifEclipseSummaryAddress::SUMMARY_BLOCK_LGR, "SUMMARY_BLOCK_LGR", "Lgr-Block" ); - addItem( RifEclipseSummaryAddress::SUMMARY_CALCULATED, "SUMMARY_CALCULATED", "Calculated" ); - addItem( RifEclipseSummaryAddress::SUMMARY_IMPORTED, "SUMMARY_IMPORTED", "Imported" ); - addItem( RifEclipseSummaryAddress::SUMMARY_ENSEMBLE_STATISTICS, "SUMMARY_ENSEMBLE_STATISTICS", "Ensemble Statistics" ); - setDefault( RifEclipseSummaryAddress::SUMMARY_FIELD ); + using RifAdr = RifEclipseSummaryAddress; + + addItem( RifAdr::SUMMARY_FIELD, "SUMMARY_FIELD", RiaDefines::summaryField() ); + addItem( RifAdr::SUMMARY_AQUIFER, "SUMMARY_AQUIFER", RiaDefines::summaryAquifer() ); + addItem( RifAdr::SUMMARY_NETWORK, "SUMMARY_NETWORK", RiaDefines::summaryNetwork() ); + addItem( RifAdr::SUMMARY_MISC, "SUMMARY_MISC", RiaDefines::summaryMisc() ); + addItem( RifAdr::SUMMARY_REGION, "SUMMARY_REGION", RiaDefines::summaryRegion() ); + addItem( RifAdr::SUMMARY_REGION_2_REGION, "SUMMARY_REGION_2_REGION", RiaDefines::summaryRegion2Region() ); + addItem( RifAdr::SUMMARY_GROUP, "SUMMARY_WELL_GROUP", RiaDefines::summaryWellGroup() ); + addItem( RifAdr::SUMMARY_WELL, "SUMMARY_WELL", RiaDefines::summaryWell() ); + addItem( RifAdr::SUMMARY_WELL_COMPLETION, "SUMMARY_WELL_COMPLETION", RiaDefines::summaryCompletion() ); + addItem( RifAdr::SUMMARY_WELL_COMPLETION_LGR, "SUMMARY_WELL_COMPLETION_LGR", RiaDefines::summaryLgrCompletion() ); + addItem( RifAdr::SUMMARY_WELL_LGR, "SUMMARY_WELL_LGR", RiaDefines::summaryLgrWell() ); + addItem( RifAdr::SUMMARY_WELL_SEGMENT, "SUMMARY_SEGMENT", RiaDefines::summarySegment() ); + addItem( RifAdr::SUMMARY_BLOCK, "SUMMARY_BLOCK", RiaDefines::summaryBlock() ); + addItem( RifAdr::SUMMARY_BLOCK_LGR, "SUMMARY_BLOCK_LGR", RiaDefines::summaryLgrBlock() ); + addItem( RifAdr::SUMMARY_CALCULATED, "SUMMARY_CALCULATED", RiaDefines::summaryCalculated() ); + addItem( RifAdr::SUMMARY_IMPORTED, "SUMMARY_IMPORTED", "Imported" ); + addItem( RifAdr::SUMMARY_ENSEMBLE_STATISTICS, "SUMMARY_ENSEMBLE_STATISTICS", "Ensemble Statistics" ); + setDefault( RifAdr::SUMMARY_FIELD ); } } // namespace caf diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddressCollection.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddressCollection.cpp index 304a23c616..d2f76c5da1 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddressCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddressCollection.cpp @@ -18,6 +18,8 @@ #include "RimSummaryAddressCollection.h" +#include "RiaSummaryDefines.h" + #include "RifEclipseSummaryAddress.h" #include "RimSummaryAddress.h" @@ -27,26 +29,29 @@ template <> void caf::AppEnum::setUp() { - addItem( RimSummaryAddressCollection::CollectionContentType::NOT_DEFINED, "NOT_DEFINED", "Not Defined" ); - addItem( RimSummaryAddressCollection::CollectionContentType::FIELD, "FIELD", "Field" ); - addItem( RimSummaryAddressCollection::CollectionContentType::AQUIFER, "AQUIFER", "Aquifer" ); - addItem( RimSummaryAddressCollection::CollectionContentType::NETWORK, "NETWORK", "Network" ); - addItem( RimSummaryAddressCollection::CollectionContentType::MISC, "MISC", "Miscellaneous" ); - addItem( RimSummaryAddressCollection::CollectionContentType::REGION, "REGION", "Region" ); - addItem( RimSummaryAddressCollection::CollectionContentType::REGION_2_REGION, "REGION_2_REGION", "Region-Region" ); - addItem( RimSummaryAddressCollection::CollectionContentType::GROUP, "GROUP", "Group" ); - addItem( RimSummaryAddressCollection::CollectionContentType::WELL, "WELL", "Well" ); - addItem( RimSummaryAddressCollection::CollectionContentType::WELL_COMPLETION, "WELL_COMPLETION", "Completion" ); - addItem( RimSummaryAddressCollection::CollectionContentType::WELL_SEGMENT, "WELL_SEGMENT", "Segment" ); - addItem( RimSummaryAddressCollection::CollectionContentType::BLOCK, "BLOCK", "Block" ); - addItem( RimSummaryAddressCollection::CollectionContentType::WELL_LGR, "WELL_LGR", "Lgr-Well" ); - addItem( RimSummaryAddressCollection::CollectionContentType::WELL_COMPLETION_LGR, - "WELL_COMPLETION_LGR", - "Lgr Completion" ); - addItem( RimSummaryAddressCollection::CollectionContentType::BLOCK_LGR, "BLOCK_LGR", "Lgr-Block" ); - addItem( RimSummaryAddressCollection::CollectionContentType::CALCULATED, "CALCULATED", "Calculated" ); - addItem( RimSummaryAddressCollection::CollectionContentType::IMPORTED, "IMPORTED", "Imported" ); - setDefault( RimSummaryAddressCollection::CollectionContentType::NOT_DEFINED ); + using CollectionContentType = RimSummaryAddressCollection::CollectionContentType; + addItem( CollectionContentType::NOT_DEFINED, "NOT_DEFINED", "Not Defined" ); + addItem( CollectionContentType::WELL, "WELL", RiaDefines::summaryWell() ); + addItem( CollectionContentType::GROUP, "GROUP", RiaDefines::summaryWellGroup() ); + addItem( CollectionContentType::REGION, "REGION", RiaDefines::summaryRegion() ); + addItem( CollectionContentType::FIELD, "FIELD", RiaDefines::summaryField() ); + addItem( CollectionContentType::MISC, "MISC", RiaDefines::summaryMisc() ); + addItem( CollectionContentType::WELL_FOLDER, "WELL_FOLDER", RiaDefines::summaryWell() ); + addItem( CollectionContentType::GROUP_FOLDER, "GROUP_FOLDER", RiaDefines::summaryWellGroup() ); + addItem( CollectionContentType::REGION_FOLDER, "REGION_FOLDER", RiaDefines::summaryRegion() ); + addItem( CollectionContentType::BLOCK, "BLOCK", RiaDefines::summaryBlock() ); + addItem( CollectionContentType::SUMMARY_CASE, "SUMMARY_CASE", "Summary Case" ); + addItem( CollectionContentType::AQUIFER, "AQUIFER", RiaDefines::summaryAquifer() ); + addItem( CollectionContentType::NETWORK, "NETWORK", RiaDefines::summaryNetwork() ); + addItem( CollectionContentType::REGION_2_REGION, "REGION_2_REGION", RiaDefines::summaryRegion2Region() ); + addItem( CollectionContentType::WELL_COMPLETION, "WELL_COMPLETION", RiaDefines::summaryCompletion() ); + addItem( CollectionContentType::WELL_LGR, "WELL_LGR", RiaDefines::summaryLgrWell() ); + addItem( CollectionContentType::WELL_COMPLETION_LGR, "WELL_COMPLETION_LGR", RiaDefines::summaryLgrCompletion() ); + addItem( CollectionContentType::WELL_SEGMENT, "WELL_SEGMENT", RiaDefines::summaryWellSegment() ); + addItem( CollectionContentType::BLOCK_LGR, "BLOCK_LGR", RiaDefines::summaryLgrBlock() ); + addItem( CollectionContentType::CALCULATED, "CALCULATED", RiaDefines::summaryCalculated() ); + addItem( CollectionContentType::IMPORTED, "IMPORTED", "Imported" ); + setDefault( CollectionContentType::NOT_DEFINED ); } CAF_PDM_SOURCE_INIT( RimSummaryAddressCollection, "RimSummaryAddressCollection" ); @@ -159,24 +164,24 @@ void RimSummaryAddressCollection::updateFolderStructure( const std::setsetName( folderName ); newFolder->setContentType( createFolderType ); m_subfolders.push_back( newFolder ); return newFolder; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSummaryAddressCollection* RimSummaryAddressCollection::getOrCreateSubfolder( CollectionContentType createFolderType ) +{ + auto name = caf::AppEnum::uiText( createFolderType ); + + return getOrCreateSubfolder( name, createFolderType ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -345,7 +360,7 @@ void RimSummaryAddressCollection::deleteChildren() //-------------------------------------------------------------------------------------------------- bool RimSummaryAddressCollection::isEmpty() const { - return ( ( m_adresses.size() == 0 ) && ( m_subfolders.size() == 0 ) ); + return ( ( m_adresses.empty() ) && ( m_subfolders.empty() ) ); } //-------------------------------------------------------------------------------------------------- @@ -353,7 +368,7 @@ bool RimSummaryAddressCollection::isEmpty() const //-------------------------------------------------------------------------------------------------- bool RimSummaryAddressCollection::canBeDragged() const { - bool ok = m_subfolders.size() == 0; + bool ok = m_subfolders.empty(); ok = ok && ( m_contentType == CollectionContentType::WELL || m_contentType == CollectionContentType::GROUP || m_contentType == CollectionContentType::REGION ); diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddressCollection.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddressCollection.h index 168131f088..8e0c43b27c 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddressCollection.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryAddressCollection.h @@ -89,6 +89,8 @@ class RimSummaryAddressCollection : public RimNamedObject getOrCreateSubfolder( const QString folderName, CollectionContentType createFolderType = CollectionContentType::NOT_DEFINED ); + RimSummaryAddressCollection* getOrCreateSubfolder( CollectionContentType createFolderType ); + bool hasDataVector( const QString quantityName ) const; bool hasDataVector( const std::string quantityName ) const; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCase.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCase.cpp index 999087ff32..2592971061 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCase.cpp @@ -304,6 +304,14 @@ QString RimSummaryCase::nativeCaseName() const return caseName(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimCaseDisplayNameTools::DisplayName RimSummaryCase::displayNameType() const +{ + return m_displayNameOption(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCase.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCase.h index 7dfbd07501..3f3a1e7871 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCase.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCase.h @@ -54,20 +54,18 @@ class RimSummaryCase : public caf::PdmObject RimSummaryCase(); ~RimSummaryCase() override; - virtual QString summaryHeaderFilename() const; - QString displayCaseName() const; - QString nativeCaseName() const; - void setCaseId( int caseId ); - int caseId() const; + virtual QString summaryHeaderFilename() const; + QString displayCaseName() const; + QString nativeCaseName() const; + void setCustomCaseName( const QString& caseName ); + void updateAutoShortName(); + RimCaseDisplayNameTools::DisplayName displayNameType() const; + void setDisplayNameOption( RimCaseDisplayNameTools::DisplayName displayNameOption ); - void setCustomCaseName( const QString& caseName ); + void setCaseId( int caseId ); + int caseId() const; - caf::AppEnum unitsSystem(); - - void setDisplayNameOption( RimCaseDisplayNameTools::DisplayName displayNameOption ); - void updateAutoShortName(); void updateOptionSensitivity(); - void refreshMetaData(); virtual void createSummaryReaderInterface() = 0; @@ -78,6 +76,8 @@ class RimSummaryCase : public caf::PdmObject void setSummaryHeaderFileName( const QString& fileName ); + caf::AppEnum unitsSystem(); + bool isObservedData() const; bool showRealizationDataSources() const; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp index c4327abba6..4d6a2f6d6f 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp @@ -18,6 +18,7 @@ #include "RimSummaryCaseCollection.h" +#include "RiaEnsembleNameTools.h" #include "RiaFieldHandleTools.h" #include "RiaLogging.h" #include "RiaStatisticsTools.h" @@ -115,6 +116,7 @@ RimSummaryCaseCollection::RimSummaryCaseCollection() m_cases.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitScriptableField( &m_name, "SummaryCollectionName", QString( "Group" ), "Name" ); + CAF_PDM_InitScriptableField( &m_autoName, "CreateAutoName", true, "Auto Name" ); CAF_PDM_InitScriptableFieldNoDefault( &m_nameAndItemCount, "NameCount", "Name" ); m_nameAndItemCount.registerGetMethod( this, &RimSummaryCaseCollection::nameAndItemCount ); @@ -246,6 +248,28 @@ QString RimSummaryCaseCollection::name() const return m_name; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryCaseCollection::ensureNameIsUpdated() +{ + if ( m_autoName ) + { + QStringList fileNames; + for ( const auto& summaryCase : m_cases ) + { + fileNames.push_back( summaryCase->summaryHeaderFilename() ); + } + + RiaEnsembleNameTools::EnsembleGroupingMode groupingMode = + RiaEnsembleNameTools::EnsembleGroupingMode::FMU_FOLDER_STRUCTURE; + + QString ensembleName = RiaEnsembleNameTools::findSuitableEnsembleName( fileNames, groupingMode ); + m_name = ensembleName; + caseNameChanged.send(); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -960,11 +984,11 @@ void RimSummaryCaseCollection::computeMinMax( const RifEclipseSummaryAddress& ad double minimumValue( std::numeric_limits::infinity() ); double maximumValue( -std::numeric_limits::infinity() ); - std::vector values; for ( const auto& s : m_cases() ) { if ( !s->summaryReader() ) continue; + std::vector values; s->summaryReader()->values( address, &values ); if ( values.empty() ) continue; @@ -1036,6 +1060,13 @@ void RimSummaryCaseCollection::initAfterRead() } updateIcon(); + + for ( const auto& summaryCase : m_cases ) + { + summaryCase->nameChanged.connect( this, &RimSummaryCaseCollection::onCaseNameChanged ); + } + + if ( RimProject::current()->isProjectFileVersionEqualOrOlderThan( "2022.06.2" ) ) m_autoName = false; } //-------------------------------------------------------------------------------------------------- @@ -1049,6 +1080,14 @@ void RimSummaryCaseCollection::fieldChangedByUi( const caf::PdmFieldHandle* chan { updateIcon(); } + if ( changedField == &m_autoName ) + { + ensureNameIsUpdated(); + } + if ( changedField == &m_name ) + { + caseNameChanged.send(); + } } //-------------------------------------------------------------------------------------------------- @@ -1064,7 +1103,9 @@ void RimSummaryCaseCollection::onCaseNameChanged( const SignalEmitter* emitter ) //-------------------------------------------------------------------------------------------------- void RimSummaryCaseCollection::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) { + uiOrdering.add( &m_autoName ); uiOrdering.add( &m_name ); + m_name.uiCapability()->setUiReadOnly( m_autoName() ); if ( m_isEnsemble() ) { uiOrdering.add( &m_ensembleId ); diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h index 56457714b5..ac4ecd8d50 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h @@ -67,6 +67,7 @@ class RimSummaryCaseCollection : public caf::PdmObject void setName( const QString& name ); QString name() const; + void ensureNameIsUpdated(); bool isEnsemble() const; void setAsEnsemble( bool isEnsemble ); @@ -145,6 +146,7 @@ class RimSummaryCaseCollection : public caf::PdmObject private: caf::PdmField m_name; + caf::PdmField m_autoName; caf::PdmProxyValueField m_nameAndItemCount; caf::PdmField m_isEnsemble; caf::PdmChildField m_dataVectorFolders; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp index 99ed50a838..1b95aa22c3 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp @@ -47,10 +47,6 @@ #include "cafProgressInfo.h" -#ifdef USE_OPENMP -#include -#endif - #include CAF_PDM_SOURCE_INIT( RimSummaryCaseMainCollection, "SummaryCaseCollection" ); @@ -424,6 +420,22 @@ void RimSummaryCaseMainCollection::loadAllSummaryCaseData() RimSummaryCaseMainCollection::loadSummaryCaseData( sumCases ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryCaseMainCollection::initAfterRead() +{ + for ( auto sumCase : topLevelSummaryCases() ) + { + sumCase->nameChanged.connect( this, &RimSummaryCaseMainCollection::onCaseNameChanged ); + } + + for ( auto caseCollection : summaryCaseCollections() ) + { + caseCollection->caseNameChanged.connect( this, &RimSummaryCaseMainCollection::onCaseNameChanged ); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.h index 74d76a2465..ecb90e168b 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.h @@ -79,6 +79,8 @@ class RimSummaryCaseMainCollection : public caf::PdmObject void onProjectBeingSaved(); private: + void initAfterRead() override; + static void loadSummaryCaseData( std::vector summaryCases ); static void loadFileSummaryCaseData( std::vector fileSummaryCases ); static void reassignSummaryCurves( const RimGridSummaryCase* fromGridCase, RimFileSummaryCase* toFileCase ); diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.cpp index 1ba89a948d..e65dde697b 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.cpp @@ -521,14 +521,15 @@ QList RimSummaryCurve::calculateValueOptions( const caf: //-------------------------------------------------------------------------------------------------- QString RimSummaryCurve::createCurveAutoName() { - std::vector nameHelpers; + const RimSummaryNameHelper* currentPlotNameHelper = nullptr; + std::vector plotNameHelpers; { RimSummaryPlot* plot = nullptr; firstAncestorOrThisOfType( plot ); if ( plot ) { - auto nameHelper = plot->plotTitleHelper(); - if ( nameHelper ) nameHelpers.push_back( nameHelper ); + currentPlotNameHelper = plot->plotTitleHelper(); + if ( currentPlotNameHelper ) plotNameHelpers.push_back( currentPlotNameHelper ); } } { @@ -537,23 +538,25 @@ QString RimSummaryCurve::createCurveAutoName() if ( summaryMultiPlot ) { auto nameHelper = summaryMultiPlot->nameHelper(); - if ( nameHelper ) nameHelpers.push_back( nameHelper ); + if ( nameHelper ) plotNameHelpers.push_back( nameHelper ); } } - RimMultiSummaryPlotNameHelper multiNameHelper( nameHelpers ); - QString curveName = m_curveNameConfig->curveNameY( m_yValuesSummaryAddress->address(), &multiNameHelper ); + RimMultiSummaryPlotNameHelper multiNameHelper( plotNameHelpers ); + QString curveName = + m_curveNameConfig->curveNameY( m_yValuesSummaryAddress->address(), currentPlotNameHelper, &multiNameHelper ); if ( curveName.isEmpty() ) { - curveName = m_curveNameConfig->curveNameY( m_yValuesSummaryAddress->address(), nullptr ); + curveName = m_curveNameConfig->curveNameY( m_yValuesSummaryAddress->address(), nullptr, nullptr ); } if ( isCrossPlotCurve() ) { - QString curveNameX = m_curveNameConfig->curveNameX( m_xValuesSummaryAddress->address(), &multiNameHelper ); + QString curveNameX = + m_curveNameConfig->curveNameX( m_xValuesSummaryAddress->address(), currentPlotNameHelper, &multiNameHelper ); if ( curveNameX.isEmpty() ) { - curveNameX = m_curveNameConfig->curveNameX( m_xValuesSummaryAddress->address(), nullptr ); + curveNameX = m_curveNameConfig->curveNameX( m_xValuesSummaryAddress->address(), nullptr, nullptr ); } if ( !curveName.isEmpty() || !curveNameX.isEmpty() ) @@ -846,7 +849,7 @@ void RimSummaryCurve::defineEditorAttribute( const caf::PdmFieldHandle* field, //-------------------------------------------------------------------------------------------------- void RimSummaryCurve::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) { - RimPlotCurve::updateOptionSensitivity(); + RimPlotCurve::updateFieldUiState(); { QString curveDataGroupName = "Summary Vector"; @@ -883,7 +886,7 @@ void RimSummaryCurve::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering nameGroup->add( &m_showLegend ); RimPlotCurve::curveNameUiOrdering( *nameGroup ); - if ( m_isUsingAutoName ) + if ( m_namingMethod == RiaDefines::ObjectNamingMethod::AUTO ) { m_curveNameConfig->uiOrdering( uiConfigName, *nameGroup ); } @@ -1095,10 +1098,6 @@ void RimSummaryCurve::fieldChangedByUi( const caf::PdmFieldHandle* changedField, RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); mainPlotWindow->updateMultiPlotToolBar(); - - // If no plot collection is found, we assume that we are inside a curve creator - // Update the summary curve collection to make sure the curve names are updated in curve creator UI - visibilityChanged.send( m_showCurve() ); } else if ( changedField == &m_plotAxisProperties ) { diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveAutoName.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveAutoName.cpp index bfa7a55184..85c07af969 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveAutoName.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveAutoName.cpp @@ -65,7 +65,8 @@ RimSummaryCurveAutoName::RimSummaryCurveAutoName() /// //-------------------------------------------------------------------------------------------------- QString RimSummaryCurveAutoName::curveNameY( const RifEclipseSummaryAddress& summaryAddress, - const RimSummaryNameHelper* nameHelper ) const + const RimSummaryNameHelper* currentNameHelper, + const RimSummaryNameHelper* plotNameHelper ) const { RimSummaryCurve* summaryCurve = nullptr; this->firstAncestorOrThisOfType( summaryCurve ); @@ -91,7 +92,7 @@ QString RimSummaryCurveAutoName::curveNameY( const RifEclipseSummaryAddress& sum } } - QString curveName = buildCurveName( summaryAddress, nameHelper, unitNameY, caseNameY ); + QString curveName = buildCurveName( summaryAddress, currentNameHelper, plotNameHelper, unitNameY, caseNameY ); return curveName; } @@ -100,7 +101,8 @@ QString RimSummaryCurveAutoName::curveNameY( const RifEclipseSummaryAddress& sum /// //-------------------------------------------------------------------------------------------------- QString RimSummaryCurveAutoName::curveNameX( const RifEclipseSummaryAddress& summaryAddress, - const RimSummaryNameHelper* nameHelper ) const + const RimSummaryNameHelper* currentNameHelper, + const RimSummaryNameHelper* plotNameHelper ) const { RimSummaryCurve* summaryCurve = nullptr; this->firstAncestorOrThisOfType( summaryCurve ); @@ -126,7 +128,7 @@ QString RimSummaryCurveAutoName::curveNameX( const RifEclipseSummaryAddress& sum } } - QString curveName = buildCurveName( summaryAddress, nameHelper, unitNameX, caseNameX ); + QString curveName = buildCurveName( summaryAddress, currentNameHelper, plotNameHelper, unitNameX, caseNameX ); return curveName; } @@ -182,7 +184,8 @@ void RimSummaryCurveAutoName::appendLgrName( std::string& text, const RifEclipse /// //-------------------------------------------------------------------------------------------------- QString RimSummaryCurveAutoName::buildCurveName( const RifEclipseSummaryAddress& summaryAddress, - const RimSummaryNameHelper* nameHelper, + const RimSummaryNameHelper* currentNameHelper, + const RimSummaryNameHelper* plotNameHelper, const std::string& unitText, const std::string& caseName ) const { @@ -190,7 +193,7 @@ QString RimSummaryCurveAutoName::buildCurveName( const RifEclipseSummaryAddress& if ( m_vectorName ) { - bool skipSubString = nameHelper && nameHelper->isPlotDisplayingSingleVectorName(); + bool skipSubString = currentNameHelper && currentNameHelper->vectorNames().size() == 1; if ( !skipSubString ) { if ( m_longVectorName() ) @@ -230,11 +233,11 @@ QString RimSummaryCurveAutoName::buildCurveName( const RifEclipseSummaryAddress& } } - appendAddressDetails( text, summaryAddress, nameHelper ); + appendAddressDetails( text, summaryAddress, plotNameHelper ); if ( !caseName.empty() ) { - bool skipSubString = nameHelper && nameHelper->isCaseInTitle(); + bool skipSubString = plotNameHelper && plotNameHelper->isCaseInTitle(); if ( m_caseName && !skipSubString ) { diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveAutoName.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveAutoName.h index 786320caf1..2ff8dfaade 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveAutoName.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveAutoName.h @@ -31,8 +31,12 @@ class RimSummaryCurveAutoName : public caf::PdmObject public: RimSummaryCurveAutoName(); - QString curveNameY( const RifEclipseSummaryAddress& summaryAddress, const RimSummaryNameHelper* nameHelper ) const; - QString curveNameX( const RifEclipseSummaryAddress& summaryAddress, const RimSummaryNameHelper* nameHelper ) const; + QString curveNameY( const RifEclipseSummaryAddress& summaryAddress, + const RimSummaryNameHelper* currentNameHelper, + const RimSummaryNameHelper* plotNameHelper ) const; + QString curveNameX( const RifEclipseSummaryAddress& summaryAddress, + const RimSummaryNameHelper* currentNameHelper, + const RimSummaryNameHelper* plotNameHelper ) const; void applySettings( const RimSummaryCurveAutoName& other ); @@ -51,7 +55,8 @@ class RimSummaryCurveAutoName : public caf::PdmObject void appendLgrName( std::string& text, const RifEclipseSummaryAddress& summaryAddress ) const; QString buildCurveName( const RifEclipseSummaryAddress& summaryAddress, - const RimSummaryNameHelper* nameHelper, + const RimSummaryNameHelper* currentNameHelper, + const RimSummaryNameHelper* plotNameHelper, const std::string& unitText, const std::string& caseName ) const; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryDataSourceStepping.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryDataSourceStepping.cpp index b5490334ab..6181493c8a 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryDataSourceStepping.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryDataSourceStepping.cpp @@ -18,6 +18,8 @@ #include "RimSummaryDataSourceStepping.h" +#include "RiaSummaryDefines.h" + #include "cafAppEnum.h" namespace caf @@ -26,13 +28,13 @@ template <> void AppEnum::setUp() { addItem( RimSummaryDataSourceStepping::SourceSteppingDimension::VECTOR, "VECTOR", "Vector" ); - addItem( RimSummaryDataSourceStepping::SourceSteppingDimension::WELL, "WELL", "Well" ); + addItem( RimSummaryDataSourceStepping::SourceSteppingDimension::WELL, "WELL", RiaDefines::summaryWell() ); addItem( RimSummaryDataSourceStepping::SourceSteppingDimension::SUMMARY_CASE, "SUMMARY_CASE", "Summary Case" ); addItem( RimSummaryDataSourceStepping::SourceSteppingDimension::ENSEMBLE, "ENSEMBLE", "Ensemble" ); - addItem( RimSummaryDataSourceStepping::SourceSteppingDimension::GROUP, "GROUP", "Group" ); - addItem( RimSummaryDataSourceStepping::SourceSteppingDimension::REGION, "REGION", "Region" ); - addItem( RimSummaryDataSourceStepping::SourceSteppingDimension::BLOCK, "BLOCK", "Block" ); - addItem( RimSummaryDataSourceStepping::SourceSteppingDimension::AQUIFER, "AQUIFER", "Aquifer" ); + addItem( RimSummaryDataSourceStepping::SourceSteppingDimension::GROUP, "GROUP", RiaDefines::summaryWellGroup() ); + addItem( RimSummaryDataSourceStepping::SourceSteppingDimension::REGION, "REGION", RiaDefines::summaryRegion() ); + addItem( RimSummaryDataSourceStepping::SourceSteppingDimension::BLOCK, "BLOCK", RiaDefines::summaryBlock() ); + addItem( RimSummaryDataSourceStepping::SourceSteppingDimension::AQUIFER, "AQUIFER", RiaDefines::summaryAquifer() ); setDefault( RimSummaryDataSourceStepping::SourceSteppingDimension::VECTOR ); } } // namespace caf diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.cpp index 4a5dfdf117..8b171cbf0b 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.cpp @@ -19,6 +19,7 @@ #include "RimSummaryMultiPlot.h" #include "RiaApplication.h" +#include "RiaNumericalTools.h" #include "RiaPlotDefines.h" #include "RiaSummaryAddressAnalyzer.h" #include "RiaSummaryStringTools.h" @@ -173,6 +174,8 @@ RimSummaryMultiPlot::RimSummaryMultiPlot() m_defaultStepDimension.uiCapability()->setUiHidden( true ); m_nameHelper = std::make_unique(); + + setBottomMargin( 40 ); } //-------------------------------------------------------------------------------------------------- @@ -207,10 +210,18 @@ void RimSummaryMultiPlot::insertPlot( RimPlot* plot, size_t index ) sumPlot->axisChanged.connect( this, &RimSummaryMultiPlot::onSubPlotAxisChanged ); sumPlot->curvesChanged.connect( this, &RimSummaryMultiPlot::onSubPlotChanged ); sumPlot->plotZoomedByUser.connect( this, &RimSummaryMultiPlot::onSubPlotZoomed ); + sumPlot->titleChanged.connect( this, &RimSummaryMultiPlot::onSubPlotChanged ); + sumPlot->axisChangedReloadRequired.connect( this, &RimSummaryMultiPlot::onSubPlotAxisReloadRequired ); bool isMinMaxOverridden = m_axisRangeAggregation() != AxisRangeAggregation::NONE; setAutoValueStatesForPlot( sumPlot, isMinMaxOverridden, m_autoAdjustAppearance() ); + auto plots = summaryPlots(); + if ( !plots.empty() && m_linkTimeAxis ) + { + sumPlot->copyAxisPropertiesFromOther( RiaDefines::PlotAxis::PLOT_AXIS_BOTTOM, *plots.front() ); + } + RimMultiPlot::insertPlot( plot, index ); } @@ -444,11 +455,7 @@ void RimSummaryMultiPlot::fieldChangedByUi( const caf::PdmFieldHandle* changedFi } else if ( changedField == &m_linkTimeAxis ) { - auto plots = summaryPlots(); - if ( !plots.empty() ) - { - syncTimeAxisRanges( plots.front() ); - } + updateTimeAxisRangesFromFirstPlot(); } else if ( changedField == &m_linkSubPlotAxes || changedField == &m_axisRangeAggregation || changedField == &m_linkTimeAxis ) @@ -523,7 +530,7 @@ void RimSummaryMultiPlot::defineEditorAttribute( const caf::PdmFieldHandle* fiel //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimSummaryMultiPlot::updatePlotWindowTitle() +void RimSummaryMultiPlot::updatePlotTitles() { if ( m_autoPlotTitle ) { @@ -548,9 +555,9 @@ void RimSummaryMultiPlot::updatePlotWindowTitle() setMultiPlotTitle( title ); } - if ( m_autoSubPlotTitle ) + for ( auto plot : summaryPlots() ) { - for ( auto plot : summaryPlots() ) + if ( m_autoSubPlotTitle ) { auto subPlotNameHelper = plot->plotTitleHelper(); @@ -561,11 +568,11 @@ void RimSummaryMultiPlot::updatePlotWindowTitle() auto plotName = subPlotNameHelper->aggregatedPlotTitle( *m_nameHelper ); plot->setPlotTitleVisible( true ); plot->setDescription( plotName ); - plot->updatePlotTitle(); } - - if ( !m_viewer.isNull() ) m_viewer->scheduleTitleUpdate(); + plot->updatePlotTitle(); } + + if ( !m_viewer.isNull() ) m_viewer->scheduleTitleUpdate(); } //-------------------------------------------------------------------------------------------------- @@ -713,6 +720,8 @@ void RimSummaryMultiPlot::initAfterRead() plot->axisChanged.connect( this, &RimSummaryMultiPlot::onSubPlotAxisChanged ); plot->curvesChanged.connect( this, &RimSummaryMultiPlot::onSubPlotChanged ); plot->plotZoomedByUser.connect( this, &RimSummaryMultiPlot::onSubPlotZoomed ); + plot->titleChanged.connect( this, &RimSummaryMultiPlot::onSubPlotChanged ); + plot->axisChangedReloadRequired.connect( this, &RimSummaryMultiPlot::onSubPlotAxisReloadRequired ); } updateStepDimensionFromDefault(); } @@ -723,7 +732,7 @@ void RimSummaryMultiPlot::initAfterRead() void RimSummaryMultiPlot::onLoadDataAndUpdate() { RimMultiPlot::onLoadDataAndUpdate(); - updatePlotWindowTitle(); + updatePlotTitles(); analyzePlotsAndAdjustAppearanceSettings(); } @@ -747,6 +756,8 @@ void RimSummaryMultiPlot::zoomAll() updateZoom(); + updateTimeAxisRangesFromFirstPlot(); + return; } @@ -754,6 +765,20 @@ void RimSummaryMultiPlot::zoomAll() RimMultiPlot::zoomAll(); syncAxisRanges(); + + updateTimeAxisRangesFromFirstPlot(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryMultiPlot::updateTimeAxisRangesFromFirstPlot() +{ + if ( m_linkTimeAxis && !summaryPlots().empty() ) + { + setAutoScaleXEnabled( false ); + syncTimeAxisRanges( summaryPlots().front() ); + } } //-------------------------------------------------------------------------------------------------- @@ -890,15 +915,15 @@ void RimSummaryMultiPlot::syncAxisRanges() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimSummaryMultiPlot::syncTimeAxisRanges( RimSummaryPlot* summaryPlot ) +void RimSummaryMultiPlot::syncTimeAxisRanges( RimSummaryPlot* sourceSummaryPlot ) { - if ( m_linkTimeAxis ) + if ( sourceSummaryPlot && m_linkTimeAxis() ) { for ( auto plot : summaryPlots() ) { - if ( plot != summaryPlot ) + if ( plot != sourceSummaryPlot ) { - plot->copyAxisPropertiesFromOther( RiaDefines::PlotAxis::PLOT_AXIS_BOTTOM, *summaryPlot ); + plot->copyAxisPropertiesFromOther( RiaDefines::PlotAxis::PLOT_AXIS_BOTTOM, *sourceSummaryPlot ); plot->updateAll(); } } @@ -921,16 +946,28 @@ void RimSummaryMultiPlot::computeAggregatedAxisRange() return values; }; - auto findMinMaxForSummaryCase = [readValues]( RimSummaryCase* summaryCase, RifEclipseSummaryAddress addr ) { - auto values = readValues( summaryCase, addr ); - if ( values.empty() ) return std::make_pair( HUGE_VAL, -HUGE_VAL ); + auto findMinMaxForSummaryCase = + [readValues]( RimSummaryCase* summaryCase, RifEclipseSummaryAddress addr, bool onlyPositiveValues ) { + auto values = readValues( summaryCase, addr ); + if ( onlyPositiveValues ) + { + std::vector positiveValues; + + for ( const auto& v : values ) + { + if ( v > 0.0 ) positiveValues.push_back( v ); + } + + values = positiveValues; + } + if ( values.empty() ) return std::make_pair( HUGE_VAL, -HUGE_VAL ); - auto minMaxPair = std::minmax_element( values.begin(), values.end() ); - double caseMinimum = *minMaxPair.first; - double caseMaximum = *minMaxPair.second; + auto minMaxPair = std::minmax_element( values.begin(), values.end() ); + double caseMinimum = *minMaxPair.first; + double caseMaximum = *minMaxPair.second; - return std::make_pair( caseMinimum, caseMaximum ); - }; + return std::make_pair( caseMinimum, caseMaximum ); + }; auto summaryCasesForCurve = []( RimSummaryCurve* curve, AxisRangeAggregation axisRangeAggregation ) { std::vector summaryCases; @@ -1015,14 +1052,15 @@ void RimSummaryMultiPlot::computeAggregatedAxisRange() auto findMinMaxForAddressesInSummaryCases = [findMinMaxForSummaryCase]( const std::vector& addresses, - const std::vector& summaryCases ) { + const std::vector& summaryCases, + bool onlyPositiveValues ) { double minimum = HUGE_VAL; double maximum = -HUGE_VAL; for ( auto summaryCase : summaryCases ) { for ( const auto& addr : addresses ) { - auto [caseMinimum, caseMaximum] = findMinMaxForSummaryCase( summaryCase, addr ); + auto [caseMinimum, caseMaximum] = findMinMaxForSummaryCase( summaryCase, addr, onlyPositiveValues ); minimum = std::min( minimum, caseMinimum ); maximum = std::max( maximum, caseMaximum ); } @@ -1045,7 +1083,10 @@ void RimSummaryMultiPlot::computeAggregatedAxisRange() std::vector summaryCases = summaryCasesForCurve( curve, m_axisRangeAggregation() ); std::vector addresses = addressesForCurve( curve, m_axisRangeAggregation() ); - auto [minimum, maximum] = findMinMaxForAddressesInSummaryCases( addresses, summaryCases ); + bool onlyPositiveValues = axis->isLogarithmicScaleEnabled(); + + auto [minimum, maximum] = + findMinMaxForAddressesInSummaryCases( addresses, summaryCases, onlyPositiveValues ); if ( axisRanges.count( axis->plotAxisType() ) == 0 ) { @@ -1340,7 +1381,7 @@ std::pair RimSummaryMultiPlot::gridLayoutInfoForSubPlot( RimSummaryPlo //-------------------------------------------------------------------------------------------------- void RimSummaryMultiPlot::onSubPlotChanged( const caf::SignalEmitter* emitter ) { - updatePlotWindowTitle(); + updatePlotTitles(); applyPlotWindowTitleToWidgets(); } @@ -1377,6 +1418,28 @@ void RimSummaryMultiPlot::onSubPlotAxisChanged( const caf::SignalEmitter* emitte syncAxisRanges(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryMultiPlot::onSubPlotAxisReloadRequired( const caf::SignalEmitter* emitter, RimSummaryPlot* summaryPlot ) +{ + if ( !summaryPlot ) return; + + if ( m_linkTimeAxis() ) + { + syncTimeAxisRanges( summaryPlot ); + + for ( auto plot : summaryPlots() ) + { + plot->loadDataAndUpdate(); + } + } + else + { + summaryPlot->loadDataAndUpdate(); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1407,7 +1470,10 @@ std::pair RimSummaryMultiPlot::adjustedMinMax( const RimPlotAxis return { adjustedMin, adjustedMax }; } - return { min, max }; + auto adjustedMin = RiaNumericalTools::roundToClosestPowerOfTenFloor( min ); + auto adjustedMax = RiaNumericalTools::roundToClosestPowerOfTenCeil( max ); + + return { adjustedMin, adjustedMax }; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.h index d097ebb622..d0e70e92a1 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlot.h @@ -79,12 +79,12 @@ class RimSummaryMultiPlot : public RimMultiPlot, public RimSummaryDataSourceStep void removePlotNoUpdate( RimPlot* plot ) override; void updateAfterPlotRemove() override; - void updatePlotWindowTitle() override; + void updatePlotTitles() override; std::vector fieldsToShowInToolbar() override; void syncAxisRanges(); - void syncTimeAxisRanges( RimSummaryPlot* summaryPlot ); + void syncTimeAxisRanges( RimSummaryPlot* sourceSummaryPlot ); void handleDroppedObjects( const std::vector& objects ); @@ -148,6 +148,9 @@ class RimSummaryMultiPlot : public RimMultiPlot, public RimSummaryDataSourceStep void onSubPlotChanged( const caf::SignalEmitter* emitter ); void onSubPlotZoomed( const caf::SignalEmitter* emitter ); void onSubPlotAxisChanged( const caf::SignalEmitter* emitter, RimSummaryPlot* summaryPlot ); + void onSubPlotAxisReloadRequired( const caf::SignalEmitter* emitter, RimSummaryPlot* summaryPlot ); + + void updateTimeAxisRangesFromFirstPlot(); void updateReadOnlyState(); diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlotCollection.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlotCollection.cpp index 5f5eed054f..e92a0531fa 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryMultiPlotCollection.cpp @@ -188,5 +188,7 @@ void RimSummaryMultiPlotCollection::updateSummaryNameHasChanged() { plot->updateCaseNameHasChanged(); } + + multiPlot->updatePlotTitles(); } } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryNameHelper.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryNameHelper.h index 9343c23ba2..eb4f1c577b 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryNameHelper.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryNameHelper.h @@ -18,6 +18,7 @@ #pragma once +#include #include #include @@ -46,7 +47,8 @@ class RimSummaryNameHelper virtual bool isSegmentInTitle() const = 0; virtual bool isCompletionInTitle() const = 0; - virtual QString caseName() const = 0; + virtual std::set vectorNames() const = 0; + virtual QString caseName() const = 0; virtual std::string titleVectorName() const = 0; virtual std::string titleWellName() const = 0; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp index 1a4dede349..10eca3971c 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp @@ -51,6 +51,7 @@ #include "RimSummaryAddress.h" #include "RimSummaryAddressCollection.h" #include "RimSummaryCase.h" +#include "RimSummaryCaseCollection.h" #include "RimSummaryCurve.h" #include "RimSummaryCurveCollection.h" #include "RimSummaryCurvesData.h" @@ -105,7 +106,9 @@ RimSummaryPlot::RimSummaryPlot( bool isCrossPlot ) , curvesChanged( this ) , axisChanged( this ) , plotZoomedByUser( this ) + , titleChanged( this ) , m_isValid( true ) + , axisChangedReloadRequired( this ) { CAF_PDM_InitScriptableObject( "Summary Plot", ":/SummaryPlotLight16x16.png", "", "A Summary Plot" ); @@ -142,6 +145,7 @@ RimSummaryPlot::RimSummaryPlot( bool isCrossPlot ) { auto* timeAxisProperties = new RimSummaryTimeAxisProperties; timeAxisProperties->settingsChanged.connect( this, &RimSummaryPlot::axisSettingsChanged ); + timeAxisProperties->requestLoadDataAndUpdate.connect( this, &RimSummaryPlot::axisSettingsChangedReloadRequired ); m_axisProperties.push_back( timeAxisProperties ); } @@ -1485,6 +1489,8 @@ void RimSummaryPlot::fieldChangedByUi( const caf::PdmFieldHandle* changedField, c->updateCurveNameNoLegendUpdate(); } } + + titleChanged.send(); } if ( changedField == &m_showPlotLegends ) updateLegend(); @@ -1736,24 +1742,20 @@ void RimSummaryPlot::updateZoomFromParentPlot() for ( RimPlotAxisPropertiesInterface* axisProperties : m_axisProperties ) { + if ( !axisProperties ) continue; + auto [axisMin, axisMax] = plotWidget()->axisRange( axisProperties->plotAxisType() ); if ( axisProperties->isAxisInverted() ) std::swap( axisMin, axisMax ); - auto propertyAxis = dynamic_cast( axisProperties ); - - if ( propertyAxis ) + if ( auto propertyAxis = dynamic_cast( axisProperties ) ) { propertyAxis->setAutoValueVisibleRangeMax( axisMax ); propertyAxis->setAutoValueVisibleRangeMin( axisMin ); - axisProperties->setVisibleRangeMax( axisMax ); - axisProperties->setVisibleRangeMin( axisMin ); - } - else - { - axisProperties->setVisibleRangeMax( axisMax ); - axisProperties->setVisibleRangeMin( axisMin ); } + axisProperties->setVisibleRangeMax( axisMax ); + axisProperties->setVisibleRangeMin( axisMin ); + axisProperties->updateConnectedEditors(); } } @@ -1864,6 +1866,14 @@ void RimSummaryPlot::axisSettingsChanged( const caf::SignalEmitter* emitter ) updateAxes(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryPlot::axisSettingsChangedReloadRequired( const caf::SignalEmitter* emitter ) +{ + axisChangedReloadRequired.send( this ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -2423,13 +2433,13 @@ void RimSummaryPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& } m_description.uiCapability()->setUiReadOnly( m_useAutoPlotTitle ); + mainOptions->add( &m_normalizeCurveYValues ); + if ( isMdiWindow() ) { - uiOrderingForPlotLayout( uiConfigName, *mainOptions ); + RimPlotWindow::uiOrderingForLegendsAndFonts( uiConfigName, uiOrdering ); } - mainOptions->add( &m_normalizeCurveYValues ); - uiOrdering.skipRemainingFields( true ); } @@ -2564,6 +2574,7 @@ void RimSummaryPlot::initAfterRead() if ( timeAxis ) { timeAxis->settingsChanged.connect( this, &RimSummaryPlot::axisSettingsChanged ); + timeAxis->requestLoadDataAndUpdate.connect( this, &RimSummaryPlot::axisSettingsChangedReloadRequired ); } } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.h index 075dd2f611..c46e98b8de 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.h @@ -82,6 +82,8 @@ class RimSummaryPlot : public RimPlot, public RimSummaryDataSourceStepping caf::Signal<> curvesChanged; caf::Signal axisChanged; caf::Signal<> plotZoomedByUser; + caf::Signal<> titleChanged; + caf::Signal axisChangedReloadRequired; public: RimSummaryPlot( bool isCrossPlot = false ); @@ -281,6 +283,7 @@ private slots: void connectAxisSignals( RimPlotAxisProperties* axis ); void axisSettingsChanged( const caf::SignalEmitter* emitter ); + void axisSettingsChangedReloadRequired( const caf::SignalEmitter* emitter ); void axisLogarithmicChanged( const caf::SignalEmitter* emitter, bool isLogarithmic ); void axisPositionChanged( const caf::SignalEmitter* emitter, RimPlotAxisProperties* axisProperties, diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotNameHelper.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotNameHelper.cpp index 1e4fe2fe24..9f029eed34 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotNameHelper.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotNameHelper.cpp @@ -175,6 +175,14 @@ bool RimSummaryPlotNameHelper::isCompletionInTitle() const return !m_titleCompletion.empty(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::set RimSummaryPlotNameHelper::vectorNames() const +{ + return m_analyzer->quantities(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotNameHelper.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotNameHelper.h index 514b127398..e81f73105f 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotNameHelper.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotNameHelper.h @@ -60,7 +60,8 @@ class RimSummaryPlotNameHelper : public RimSummaryNameHelper bool isSegmentInTitle() const override; bool isCompletionInTitle() const override; - QString caseName() const override; + std::set vectorNames() const override; + QString caseName() const override; std::string titleVectorName() const override; std::string titleWellName() const override; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp index 50c3d990b4..1e06fdbe51 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp @@ -30,6 +30,7 @@ #include "RimProject.h" #include "RimSummaryAddressModifier.h" #include "RimSummaryCase.h" +#include "RimSummaryCaseCollection.h" #include "RimSummaryCaseMainCollection.h" #include "RimSummaryCrossPlot.h" #include "RimSummaryCurve.h" @@ -93,6 +94,8 @@ RimSummaryPlotSourceStepping::RimSummaryPlotSourceStepping() CAF_PDM_InitField( &m_indexLabel, "IndexLabel", QString( "Step By" ), "Step By" ); m_indexLabel.uiCapability()->setUiEditorTypeName( caf::PdmUiLabelEditor::uiEditorTypeName() ); m_indexLabel.xmlCapability()->disableIO(); + + CAF_PDM_InitField( &m_autoUpdateAppearance, "AutoUpdateAppearance", false, "Update Appearance" ); } //-------------------------------------------------------------------------------------------------- @@ -157,6 +160,8 @@ void RimSummaryPlotSourceStepping::defineUiOrdering( QString uiConfigName, caf:: uiOrdering.add( f ); } + uiOrdering.add( &m_autoUpdateAppearance ); + uiOrdering.skipRemainingFields(); } @@ -166,18 +171,14 @@ void RimSummaryPlotSourceStepping::defineUiOrdering( QString uiConfigName, caf:: QList RimSummaryPlotSourceStepping::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) { - QList options; - - if ( ( fieldNeedingOptions == &m_includeEnsembleCasesForCaseStepping ) || ( fieldNeedingOptions == &m_stepDimension ) ) + if ( ( fieldNeedingOptions == &m_placeholderForLabel ) || ( fieldNeedingOptions == &m_indexLabel ) || + ( fieldNeedingOptions == &m_autoUpdateAppearance ) || + ( fieldNeedingOptions == &m_includeEnsembleCasesForCaseStepping ) || ( fieldNeedingOptions == &m_stepDimension ) ) { - return caf::PdmObject::calculateValueOptions( fieldNeedingOptions ); - } - - if ( ( fieldNeedingOptions == &m_placeholderForLabel ) || ( fieldNeedingOptions == &m_indexLabel ) ) - { - return options; + return {}; } + QList options; if ( fieldNeedingOptions == &m_summaryCase ) { auto summaryCases = RimSummaryPlotSourceStepping::summaryCasesForSourceStepping(); @@ -376,7 +377,11 @@ void RimSummaryPlotSourceStepping::fieldChangedByUi( const caf::PdmFieldHandle* if ( previousCase == curve->summaryCaseY() ) { curve->setSummaryCaseY( m_summaryCase ); - curve->setCurveAppearanceFromCaseType(); + + if ( m_autoUpdateAppearance ) + { + curve->setCurveAppearanceFromCaseType(); + } } } @@ -422,24 +427,7 @@ void RimSummaryPlotSourceStepping::fieldChangedByUi( const caf::PdmFieldHandle* } else if ( changedField == &m_vectorName ) { - for ( auto curve : curves ) - { - if ( isYAxisStepping() ) - { - auto adr = curve->summaryAddressY(); - if ( RimDataSourceSteppingTools::updateQuantityIfMatching( oldValue, newValue, &adr ) ) - curve->setSummaryAddressY( adr ); - } - - if ( isXAxisStepping() ) - { - auto adr = curve->summaryAddressX(); - if ( RimDataSourceSteppingTools::updateQuantityIfMatching( oldValue, newValue, &adr ) ) - curve->setSummaryAddressX( adr ); - } - - curve->setDefaultCurveAppearance(); - } + updateVectorNameInCurves( curves, oldValue, newValue ); if ( dataSourceSteppingObject() ) { @@ -450,6 +438,7 @@ void RimSummaryPlotSourceStepping::fieldChangedByUi( const caf::PdmFieldHandle* curveSet->setSummaryAddress( adr ); } } + m_vectorName.uiCapability()->updateConnectedEditors(); triggerLoadDataAndUpdate = true; isAutoZoomAllowed = true; @@ -529,7 +518,7 @@ void RimSummaryPlotSourceStepping::fieldChangedByUi( const caf::PdmFieldHandle* if ( summaryMultiPlot ) { summaryMultiPlot->updatePlots(); - summaryMultiPlot->updatePlotWindowTitle(); + summaryMultiPlot->updatePlotTitles(); if ( isAutoZoomAllowed ) summaryMultiPlot->zoomAllYAxes(); @@ -952,7 +941,7 @@ void RimSummaryPlotSourceStepping::defineEditorAttribute( const caf::PdmFieldHan QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) { - caf::PdmUiComboBoxEditorAttribute* myAttr = dynamic_cast( attribute ); + auto* myAttr = dynamic_cast( attribute ); if ( myAttr ) { if ( field == &m_stepDimension ) @@ -1283,6 +1272,61 @@ std::map RimSummaryPlotSourceStepping::optionsForQuantity( Ria return displayAndValueStrings; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSummaryPlotSourceStepping::updateVectorNameInCurves( std::vector& curves, + const QVariant& oldValue, + const QVariant& newValue ) +{ + std::map> curvesInPlot; + for ( auto curve : curves ) + { + if ( isYAxisStepping() ) + { + auto adr = curve->summaryAddressY(); + if ( RimDataSourceSteppingTools::updateQuantityIfMatching( oldValue, newValue, &adr ) ) + curve->setSummaryAddressY( adr ); + } + + if ( isXAxisStepping() ) + { + auto adr = curve->summaryAddressX(); + if ( RimDataSourceSteppingTools::updateQuantityIfMatching( oldValue, newValue, &adr ) ) + curve->setSummaryAddressX( adr ); + } + + if ( m_autoUpdateAppearance ) + { + RimSummaryPlot* summaryPlot = nullptr; + curve->firstAncestorOfType( summaryPlot ); + if ( summaryPlot ) + { + if ( curvesInPlot.count( summaryPlot ) ) + { + curvesInPlot[summaryPlot].push_back( curve ); + } + else + { + curvesInPlot[summaryPlot] = { curve }; + } + } + } + } + + if ( m_autoUpdateAppearance ) + { + // Apply the curve appearance for all curves in one go. If appearance of each curve was updated as part of the + // loop, the appearance of curves was based on a mix of old and new curves causing a mix of different curve + // styles + + for ( const auto& [plot, curves] : curvesInPlot ) + { + plot->applyDefaultCurveAppearances( curves ); + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h index 1280b00aec..22348d78e7 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h @@ -106,6 +106,8 @@ class RimSummaryPlotSourceStepping : public caf::PdmObject std::map optionsForQuantity( std::set addresses ); std::map optionsForQuantity( RiaSummaryAddressAnalyzer* analyzser ); + void updateVectorNameInCurves( std::vector& curves, const QVariant& oldValue, const QVariant& newValue ); + private: caf::PdmPointer m_objectForSourceStepping; @@ -129,6 +131,7 @@ class RimSummaryPlotSourceStepping : public caf::PdmObject caf::PdmField m_aquifer; caf::PdmField m_includeEnsembleCasesForCaseStepping; + caf::PdmField m_autoUpdateAppearance; RimSummaryDataSourceStepping::Axis m_sourceSteppingType; std::vector m_cachedIdentifiers; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryTimeAxisProperties.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryTimeAxisProperties.cpp index da2d732e8c..93ab9cf8b3 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryTimeAxisProperties.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryTimeAxisProperties.cpp @@ -71,6 +71,7 @@ CAF_PDM_SOURCE_INIT( RimSummaryTimeAxisProperties, "SummaryTimeAxisProperties" ) /// //-------------------------------------------------------------------------------------------------- RimSummaryTimeAxisProperties::RimSummaryTimeAxisProperties() + : requestLoadDataAndUpdate( this ) { CAF_PDM_InitObject( "Time Axis", ":/BottomAxis16x16.png" ); @@ -472,7 +473,7 @@ void RimSummaryTimeAxisProperties::setTimeMode( TimeModeType val ) } //-------------------------------------------------------------------------------------------------- -/// +/// https://www.unitconverters.net/time-converter.html //-------------------------------------------------------------------------------------------------- double RimSummaryTimeAxisProperties::fromTimeTToDisplayUnitScale() { @@ -490,9 +491,13 @@ double RimSummaryTimeAxisProperties::fromTimeTToDisplayUnitScale() case DAYS: scale = 1.0 / ( 60.0 * 60.0 * 24.0 ); break; + case MONTHS: + scale = 3.805175038E-7; + break; case YEARS: scale = 1.0 / 31556952.0; break; + default: CVF_ASSERT( false ); break; @@ -502,7 +507,7 @@ double RimSummaryTimeAxisProperties::fromTimeTToDisplayUnitScale() } //-------------------------------------------------------------------------------------------------- -/// +/// https://www.unitconverters.net/time-converter.html //-------------------------------------------------------------------------------------------------- double RimSummaryTimeAxisProperties::fromDaysToDisplayUnitScale() { @@ -520,6 +525,9 @@ double RimSummaryTimeAxisProperties::fromDaysToDisplayUnitScale() break; case DAYS: break; + case MONTHS: + scale = 1.0 / 30.416666667; + break; case YEARS: scale = 1.0 / 365.2425; break; @@ -712,21 +720,12 @@ void RimSummaryTimeAxisProperties::fieldChangedByUi( const caf::PdmFieldHandle* updateDateVisibleRange(); m_isAutoZoom = false; } - else if ( changedField == &m_timeMode ) + else if ( changedField == &m_timeMode || changedField == &m_timeUnit || changedField == &m_dateFormat || + changedField == &m_timeFormat ) { - rimSummaryPlot->loadDataAndUpdate(); - } - else if ( changedField == &m_timeUnit ) - { - updateTimeVisibleRange(); // Use the stored max min dates to update the visible time range to new unit - rimSummaryPlot->loadDataAndUpdate(); - updateDateVisibleRange(); - } - else if ( changedField == &m_dateFormat || changedField == &m_timeFormat ) - { - updateTimeVisibleRange(); // Use the stored max min dates to update the visible time range to new unit - rimSummaryPlot->loadDataAndUpdate(); - updateDateVisibleRange(); + // Changing these settings requires a full update of the plot + requestLoadDataAndUpdate.send(); + return; } rimSummaryPlot->updateAxes(); diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryTimeAxisProperties.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryTimeAxisProperties.h index b0d4c3e6fc..f7d18bff03 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryTimeAxisProperties.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryTimeAxisProperties.h @@ -60,6 +60,8 @@ class RimSummaryTimeAxisProperties : public RimPlotAxisPropertiesInterface typedef caf::AppEnum DateFormatEnum; typedef caf::AppEnum TimeFormatEnum; + caf::Signal<> requestLoadDataAndUpdate; + public: RimSummaryTimeAxisProperties(); diff --git a/ApplicationLibCode/ProjectDataModel/Surfaces/RimEnsembleSurface.cpp b/ApplicationLibCode/ProjectDataModel/Surfaces/RimEnsembleSurface.cpp index 0f3e974448..16777f9065 100644 --- a/ApplicationLibCode/ProjectDataModel/Surfaces/RimEnsembleSurface.cpp +++ b/ApplicationLibCode/ProjectDataModel/Surfaces/RimEnsembleSurface.cpp @@ -29,6 +29,8 @@ #include "RimFileSurface.h" #include "RimMainPlotCollection.h" #include "RimProject.h" +#include "RimSummaryCase.h" +#include "RimSummaryCaseCollection.h" #include "RimSurface.h" #include "RimSurfaceCollection.h" diff --git a/ApplicationLibCode/ProjectDataModel/Tools/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/Tools/CMakeLists_files.cmake new file mode 100644 index 0000000000..9bc7ea43e0 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/Tools/CMakeLists_files.cmake @@ -0,0 +1,11 @@ +set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RiaVariableMapper.h) + +set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RiaVariableMapper.cpp) + +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) + +source_group( + "Tools" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/Tools/RiaVariableMapper.cpp b/ApplicationLibCode/ProjectDataModel/Tools/RiaVariableMapper.cpp new file mode 100644 index 0000000000..a4a022d082 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/Tools/RiaVariableMapper.cpp @@ -0,0 +1,228 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022- Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RiaVariableMapper.h" +#include "RiaTextStringTools.h" + +#include +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaVariableMapper::RiaVariableMapper( const QString& variableNameValueTable ) +{ + m_maxUsedIdNumber = 0; + QStringList lines = RiaTextStringTools::splitSkipEmptyParts( variableNameValueTable, ";" ); + + QRegularExpression realizationRe = + QRegularExpression( QString( "[%1]\\w*[%2]" ).arg( variableToken() ).arg( variableToken() ) ); + + for ( const QString& line : lines ) + { + QRegularExpressionMatch match = realizationRe.match( line ); + if ( match.hasMatch() ) + { + QString variableName = match.captured(); + QString variableNameStripped = variableName; + variableNameStripped.replace( variableToken(), "" ); + + QString variableValue = line.right( line.size() - match.capturedEnd() ).trimmed(); + + // Check if we have a standard id, and store the max number + + if ( variableNameStripped.startsWith( pathIdBaseString() ) ) + { + bool isOk = false; + QString numberText = variableNameStripped.right( variableNameStripped.size() - pathIdBaseString().size() ); + size_t idNumber = numberText.toUInt( &isOk ); + + if ( isOk ) + { + m_maxUsedIdNumber = std::max( m_maxUsedIdNumber, idNumber ); + } + } + + m_variableToValueMap[variableName] = variableValue; + m_valueToVariableMap[variableValue] = variableName; + } + } + + resolveVariablesUsedInValues(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaVariableMapper::addPathAndGetId( const QString& path ) +{ + auto computePathId = [this]( const auto& trimmedPath ) -> QString { + QString pathId; + auto pathToIdIt = m_valueToVariableMap.find( trimmedPath ); + if ( pathToIdIt != m_valueToVariableMap.end() ) + { + pathId = pathToIdIt->second; + } + else + { + auto pathPathIdPairIt = m_pathToPathIdMap.find( trimmedPath ); + if ( pathPathIdPairIt != m_pathToPathIdMap.end() ) + { + pathId = pathPathIdPairIt->second; + } + else + { + pathId = createUnusedId(); + } + } + return pathId; + }; + + // Want to re-use ids from last save to avoid unnecessary changes and make the behavior predictable + QString trimmedPath = path.trimmed(); + QString pathId = computePathId( trimmedPath ); + + addVariable( pathId, trimmedPath ); + + m_pathToPathIdMap[trimmedPath] = pathId; + + return pathId; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaVariableMapper::variableTableAsText() const +{ + std::vector> sortedVariables; + for ( const auto& it : m_newVariableToValueMap ) + { + sortedVariables.emplace_back( it ); + } + + const QString pathText = variableToken() + pathIdBaseString(); + + // Put path variables at the end of the list + std::sort( sortedVariables.begin(), sortedVariables.end(), [pathText]( const auto& lhs, const auto& rhs ) { + bool isLhsPath = lhs.first.startsWith( pathText ); + bool isRhsPath = rhs.first.startsWith( pathText ); + + if ( isLhsPath && !isRhsPath ) return false; + if ( !isLhsPath && isRhsPath ) return true; + + return lhs.first < rhs.first; + } ); + + QString textTable; + textTable += "\n"; + + for ( const auto& variableNameValuePair : sortedVariables ) + { + textTable += " " + variableNameValuePair.first + " " + variableNameValuePair.second + ";\n"; + } + + textTable += " "; + + return textTable; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaVariableMapper::addVariable( const QString& variableName, const QString& variableValue ) +{ + m_newVariableToValueMap[variableName] = variableValue; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaVariableMapper::valueForVariable( const QString& variableName, bool* isFound ) const +{ + auto it = m_variableToValueMap.find( variableName ); + if ( it != m_variableToValueMap.end() ) + { + if ( isFound ) *isFound = true; + return it->second; + } + + if ( isFound ) *isFound = false; + return ""; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaVariableMapper::createUnusedId() +{ + m_maxUsedIdNumber++; + + QString numberString = QString( "%1" ).arg( (uint)m_maxUsedIdNumber, 3, 10, QChar( '0' ) ); + QString pathIdentifier = variableToken() + pathIdBaseString() + numberString + variableToken(); + + return pathIdentifier; +} + +//-------------------------------------------------------------------------------------------------- +// Replace all variables with text in variable values +// $MyPath$ = /path/to/my/file +// $MyFile$ = $MyPath$/myFile.txt => $MyFile$ = /path/to/my/file/myFile.txt +//-------------------------------------------------------------------------------------------------- +void RiaVariableMapper::resolveVariablesUsedInValues() +{ + for ( auto& variableValuePair : m_variableToValueMap ) + { + QString variableValue = variableValuePair.second; + + for ( const auto& [otherVariableName, otherVariableValue] : m_variableToValueMap ) + { + variableValue.replace( otherVariableName, otherVariableValue ); + } + + variableValuePair.second = variableValue; + } +} + +//-------------------------------------------------------------------------------------------------- +// Replace text in variable values with variables +// $MyPath$ = /path/to/my/file +// $PathId_001$ = $MyPath$/myFile.txt => $PathId_001$ = $MyPath$/myFile.txt +//-------------------------------------------------------------------------------------------------- +void RiaVariableMapper::replaceVariablesInValues() +{ + // Move all non-path variables from the original map imported from the project file to the new map + for ( auto& [variableName, variableValue] : m_variableToValueMap ) + { + if ( !variableName.startsWith( variableToken() + pathIdBaseString() ) ) + { + m_newVariableToValueMap[variableName] = variableValue; + } + } + + // Replace text with variables + for ( auto& [variableName, variableValue] : m_newVariableToValueMap ) + { + for ( const auto& [otherVariableName, otherVariableValue] : m_newVariableToValueMap ) + { + if ( otherVariableName != variableName && !otherVariableName.contains( postfixName() ) ) + { + variableValue.replace( otherVariableValue, otherVariableName ); + } + } + } +} diff --git a/ApplicationLibCode/ProjectDataModel/Tools/RiaVariableMapper.h b/ApplicationLibCode/ProjectDataModel/Tools/RiaVariableMapper.h new file mode 100644 index 0000000000..e130952906 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/Tools/RiaVariableMapper.h @@ -0,0 +1,54 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022- Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include +#include + +class RiaVariableMapper +{ +public: + static QString variableToken() { return "$"; } + static QString pathIdBaseString() { return "PathId_"; } + static QString postfixName() { return "_Name"; } + +public: + RiaVariableMapper( const QString& variableNameValueTable ); + + QString addPathAndGetId( const QString& path ); + + void addVariable( const QString& variableName, const QString& variableValue ); + QString valueForVariable( const QString& variableName, bool* isFound ) const; + + void replaceVariablesInValues(); + QString variableTableAsText() const; + +private: + QString createUnusedId(); + void resolveVariablesUsedInValues(); + +private: + size_t m_maxUsedIdNumber; + + std::map m_newVariableToValueMap; + std::map m_pathToPathIdMap; + + std::map m_variableToValueMap; + std::map m_valueToVariableMap; +}; diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/WellLog/CMakeLists_files.cmake index 334773ffc9..33a5774067 100644 --- a/ApplicationLibCode/ProjectDataModel/WellLog/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/WellLog/CMakeLists_files.cmake @@ -24,6 +24,7 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RimWellLogRftCurve.h ${CMAKE_CURRENT_LIST_DIR}/RimWellLogWbsCurve.h ${CMAKE_CURRENT_LIST_DIR}/RimRftTools.h + ${CMAKE_CURRENT_LIST_DIR}/RimRftTopologyCurve.h ) set(SOURCE_GROUP_SOURCE_FILES @@ -52,6 +53,7 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleWellLogStatistics.cpp ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleWellLogStatisticsCurve.cpp ${CMAKE_CURRENT_LIST_DIR}/RimRftTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimRftTopologyCurve.cpp ) list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogCurveSet.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogCurveSet.cpp index 80e8f3b716..21d0eec827 100644 --- a/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogCurveSet.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogCurveSet.cpp @@ -36,6 +36,8 @@ #include "RimMainPlotCollection.h" #include "RimOilField.h" #include "RimProject.h" +#include "RimSummaryCase.h" +#include "RimSummaryCaseCollection.h" #include "RimWellLogCurve.h" #include "RimWellLogFile.h" #include "RimWellLogFileChannel.h" diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimRftTools.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimRftTools.cpp index a7fbdeba9b..fdffbe1d85 100644 --- a/ApplicationLibCode/ProjectDataModel/WellLog/RimRftTools.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimRftTools.cpp @@ -24,6 +24,7 @@ #include "RifReaderRftInterface.h" +#include "RifReaderOpmRft.h" #include "cafPdmUiItem.h" //-------------------------------------------------------------------------------------------------- @@ -140,30 +141,69 @@ QList RimRftTools::segmentResultNameOptions( RifReaderRf //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QList RimRftTools::segmentBranchIndexOptions( RifReaderRftInterface* readerRft, - const QString& wellName, - const QDateTime& timeStep ) +QList RimRftTools::segmentBranchIndexOptions( RifReaderRftInterface* readerRft, + const QString& wellName, + const QDateTime& timeStep, + RiaDefines::RftBranchType branchType ) { - QList options; - - options.push_front( caf::PdmOptionItemInfo( RiaDefines::allBranches(), -1 ) ); - - if ( readerRft ) + auto opmReader = dynamic_cast( readerRft ); + if ( opmReader ) { - std::vector values; + QList options; + options.push_front( caf::PdmOptionItemInfo( RiaDefines::allBranches(), -1 ) ); + + auto branchIdIndex = opmReader->branchIdsAndOneBasedIndices( wellName, timeStep, branchType ); - auto adr = RifEclipseRftAddress::createSegmentAddress( wellName, - timeStep, - RiaDefines::segmentOneBasedBranchIndexResultName() ); + std::set indices; + for ( auto b : branchIdIndex ) + { + indices.insert( b.second ); + } - readerRft->values( adr, &values ); - for ( const auto& v : values ) + for ( auto i : indices ) { - int intValue = v; - auto txt = QString::number( intValue ); - options.push_back( caf::PdmOptionItemInfo( txt, intValue ) ); + std::vector branchIds; + for ( auto b : branchIdIndex ) + { + if ( b.second == i ) branchIds.push_back( b.first ); + } + + auto minMax = std::minmax_element( branchIds.begin(), branchIds.end() ); + + auto txt = QString( "%1 (Branch Id %2-%3)" ).arg( i ).arg( *minMax.first ).arg( *minMax.second ); + options.push_back( caf::PdmOptionItemInfo( txt, i ) ); } + + return options; } - return options; + return {}; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimRftTools::seglenstValues( RifReaderRftInterface* readerRft, + const QString& wellName, + const QDateTime& dateTime, + int segmentBranchIndex, + RiaDefines::RftBranchType segmentBranchType ) +{ + std::vector seglenstValues; + + auto resultNameSeglenst = RifEclipseRftAddress::createBranchSegmentAddress( wellName, + dateTime, + RiaDefines::segmentStartDepthResultName(), + segmentBranchIndex, + segmentBranchType ); + readerRft->values( resultNameSeglenst, &seglenstValues ); + + if ( seglenstValues.size() > 2 ) + { + // Segment 1 has zero length, assign seglenst to the start value of segment 2 + // Ref mail dated June 10, 2022, topic "SELENST fix" + seglenstValues[0] = seglenstValues[1]; + } + + return seglenstValues; } diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimRftTools.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimRftTools.h index adb5ac3485..8c617dc1d6 100644 --- a/ApplicationLibCode/ProjectDataModel/WellLog/RimRftTools.h +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimRftTools.h @@ -18,6 +18,7 @@ #pragma once +#include "RiaRftDefines.h" #include "RifEclipseRftAddress.h" #include @@ -40,7 +41,15 @@ class RimRftTools static QList segmentTimeStepOptions( RifReaderRftInterface* readerRft, const QString& wellName ); static QList - segmentResultNameOptions( RifReaderRftInterface* readerRft, const QString& wellName, const QDateTime& timeStep ); - static QList - segmentBranchIndexOptions( RifReaderRftInterface* readerRft, const QString& wellName, const QDateTime& timeStep ); + segmentResultNameOptions( RifReaderRftInterface* readerRft, const QString& wellName, const QDateTime& timeStep ); + static QList segmentBranchIndexOptions( RifReaderRftInterface* readerRft, + const QString& wellName, + const QDateTime& timeStep, + RiaDefines::RftBranchType branchType ); + + static std::vector seglenstValues( RifReaderRftInterface* readerRft, + const QString& wellName, + const QDateTime& dateTime, + int segmentBranchIndex, + RiaDefines::RftBranchType segmentBranchType ); }; diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimRftTopologyCurve.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimRftTopologyCurve.cpp new file mode 100644 index 0000000000..fde9681c43 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimRftTopologyCurve.cpp @@ -0,0 +1,414 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022 Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimRftTopologyCurve.h" + +#include "RiaColorTables.h" +#include "RiaColorTools.h" +#include "RiaSummaryTools.h" + +#include "RifReaderOpmRft.h" + +#include "RigWellLogCurveData.h" + +#include "RimDepthTrackPlot.h" +#include "RimProject.h" +#include "RimRftTools.h" +#include "RimSummaryCase.h" +#include "RimWellLogPlot.h" + +#include "RiuPlotCurve.h" + +CAF_PDM_SOURCE_INIT( RimRftTopologyCurve, "RimRftTopologyCurve" ); + +namespace caf +{ +template <> +void caf::AppEnum::setUp() +{ + addItem( RimRftTopologyCurve::CurveType::PACKER, "PACKER", "Packer" ); + addItem( RimRftTopologyCurve::CurveType::TUBING, "TUBING", "Tubing" ); + addItem( RimRftTopologyCurve::CurveType::ANNULUS, "ANNULUS", "Annulus" ); + addItem( RimRftTopologyCurve::CurveType::DEVICE, "DEVICE", "Device" ); + + setDefault( RimRftTopologyCurve::CurveType::TUBING ); +} + +} // End namespace caf + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimRftTopologyCurve::RimRftTopologyCurve() +{ + CAF_PDM_InitObject( "RFT Topology Curve" ); + + CAF_PDM_InitFieldNoDefault( &m_summaryCase, "SummaryCase", "Summary Case" ); + m_summaryCase.uiCapability()->setUiTreeChildrenHidden( true ); + + CAF_PDM_InitFieldNoDefault( &m_timeStep, "TimeStep", "Time Step" ); + CAF_PDM_InitFieldNoDefault( &m_wellName, "WellName", "Well Name" ); + + CAF_PDM_InitField( &m_segmentBranchIndex, "SegmentBranchIndex", -1, "Branch" ); + CAF_PDM_InitFieldNoDefault( &m_segmentBranchType, "SegmentBranchType", "Completion" ); + + CAF_PDM_InitFieldNoDefault( &m_curveType, "CurveType", "Curve Type" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimRftTopologyCurve* RimRftTopologyCurve::createPackerCurve( RimSummaryCase* summaryCase, + const QDateTime& timeStep, + const QString& wellName, + int segmentBranchIndex ) +{ + auto* curve = new RimRftTopologyCurve(); + curve->setDataSource( summaryCase, timeStep, wellName, segmentBranchIndex ); + curve->m_curveType = CurveType::PACKER; + + return curve; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimRftTopologyCurve* RimRftTopologyCurve::createTopologyCurve( RimSummaryCase* summaryCase, + const QDateTime& timeStep, + const QString& wellName, + int segmentBranchIndex, + RiaDefines::RftBranchType branchType ) +{ + auto* curve = new RimRftTopologyCurve(); + curve->setDataSource( summaryCase, timeStep, wellName, segmentBranchIndex ); + + switch ( branchType ) + { + case RiaDefines::RftBranchType::RFT_TUBING: + curve->m_curveType = CurveType::TUBING; + break; + case RiaDefines::RftBranchType::RFT_DEVICE: + curve->m_curveType = CurveType::DEVICE; + break; + case RiaDefines::RftBranchType::RFT_ANNULUS: + curve->m_curveType = CurveType::ANNULUS; + break; + case RiaDefines::RftBranchType::RFT_UNKNOWN: + break; + default: + break; + } + curve->m_segmentBranchType = branchType; + + return curve; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimRftTopologyCurve::setDataSource( RimSummaryCase* summaryCase, + const QDateTime& timeStep, + const QString& wellName, + int segmentBranchIndex ) +{ + m_summaryCase = summaryCase; + m_timeStep = timeStep; + m_wellName = wellName; + m_segmentBranchIndex = segmentBranchIndex; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimRftTopologyCurve::wellName() const +{ + return m_wellName; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimRftTopologyCurve::wellLogChannelUiName() const +{ + return "Topology curve channel"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimRftTopologyCurve::wellLogChannelUnits() const +{ + return "Topology curve units"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Color3f RimRftTopologyCurve::colorForBranchType( CurveType curveType ) +{ + switch ( curveType ) + { + case RimRftTopologyCurve::CurveType::PACKER: + return RiaColorTools::fromQColorTo3f( QColor( "DarkGoldenRod" ) ); + break; + case RimRftTopologyCurve::CurveType::TUBING: + return colorForRftBranchType( RiaDefines::RftBranchType::RFT_TUBING ); + break; + case RimRftTopologyCurve::CurveType::DEVICE: + return colorForRftBranchType( RiaDefines::RftBranchType::RFT_DEVICE ); + break; + case RimRftTopologyCurve::CurveType::ANNULUS: + return colorForRftBranchType( RiaDefines::RftBranchType::RFT_ANNULUS ); + break; + default: + break; + } + + return RiaColorTools::fromQColorTo3f( QColor( "LightBrown" ) ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Color3f RimRftTopologyCurve::colorForRftBranchType( RiaDefines::RftBranchType branchType ) +{ + switch ( branchType ) + { + case RiaDefines::RftBranchType::RFT_TUBING: + return RiaColorTools::fromQColorTo3f( QColor( "ForestGreen" ) ); + case RiaDefines::RftBranchType::RFT_DEVICE: + return RiaColorTools::fromQColorTo3f( QColor( "IndianRed" ) ); + case RiaDefines::RftBranchType::RFT_ANNULUS: + return RiaColorTools::fromQColorTo3f( QColor( "DeepSkyBlue" ) ); + case RiaDefines::RftBranchType::RFT_UNKNOWN: + break; + default: + break; + } + + return RiaColorTools::fromQColorTo3f( QColor( "LightBrown" ) ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimRftTopologyCurve::createCurveAutoName() +{ + return m_curveType().uiText(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimRftTopologyCurve::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) +{ + RimPlotCurve::updateFieldUiState(); + + caf::PdmUiGroup* curveDataGroup = uiOrdering.addNewGroup( "Data Source" ); + curveDataGroup->add( &m_summaryCase ); + curveDataGroup->add( &m_wellName ); + curveDataGroup->add( &m_timeStep ); + curveDataGroup->add( &m_curveType ); + + curveDataGroup->add( &m_segmentBranchIndex ); + curveDataGroup->add( &m_segmentBranchType ); + + RimStackablePlotCurve::defaultUiOrdering( uiOrdering ); + + uiOrdering.skipRemainingFields( true ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QList RimRftTopologyCurve::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) +{ + if ( !m_summaryCase ) return {}; + + QList options = RimWellLogCurve::calculateValueOptions( fieldNeedingOptions ); + + auto reader = m_summaryCase->rftReader(); + + if ( fieldNeedingOptions == &m_summaryCase ) + { + options = RiaSummaryTools::optionsForSummaryCases( RimProject::current()->allSummaryCases() ); + options.push_front( caf::PdmOptionItemInfo( "None", nullptr ) ); + } + else if ( fieldNeedingOptions == &m_wellName ) + { + options = RimRftTools::wellNameOptions( reader ); + } + else if ( fieldNeedingOptions == &m_timeStep ) + { + options = RimRftTools::segmentTimeStepOptions( reader, m_wellName ); + } + else if ( fieldNeedingOptions == &m_segmentBranchIndex ) + { + options = RimRftTools::segmentBranchIndexOptions( reader, + m_wellName(), + m_timeStep(), + RiaDefines::RftBranchType::RFT_UNKNOWN ); + } + + return options; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimRftTopologyCurve::fieldChangedByUi( const caf::PdmFieldHandle* changedField, + const QVariant& oldValue, + const QVariant& newValue ) +{ + RimWellLogCurve::fieldChangedByUi( changedField, oldValue, newValue ); + + this->loadDataAndUpdate( true ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimRftTopologyCurve::onLoadDataAndUpdate( bool updateParentPlot ) +{ + this->RimPlotCurve::updateCurvePresentation( updateParentPlot ); + + if ( m_summaryCase ) + { + auto rftReader = dynamic_cast( m_summaryCase->rftReader() ); + + // Update well path attributes, packers and casing based on RFT data + if ( rftReader ) + { + std::vector depths; + std::vector propertyValues; + + std::vector seglenstValues = + RimRftTools::seglenstValues( rftReader, m_wellName, m_timeStep, -1, RiaDefines::RftBranchType::RFT_UNKNOWN ); + + auto segment = rftReader->segmentForWell( m_wellName, m_timeStep ); + auto segmentIndices = segment.segmentIndicesForBranchIndex( m_segmentBranchIndex(), m_segmentBranchType() ); + if ( !segmentIndices.empty() ) + { + // Assign a static property value to each type of curve to make sure they all are separated and + // easily visible + double curveValue = 1.0; + if ( m_segmentBranchType() == RiaDefines::RftBranchType::RFT_TUBING ) curveValue = 2.0; + if ( m_segmentBranchType() == RiaDefines::RftBranchType::RFT_DEVICE ) curveValue = 3.0; + if ( m_segmentBranchType() == RiaDefines::RftBranchType::RFT_ANNULUS ) curveValue = 4.0; + + if ( m_curveType() == CurveType::PACKER ) + { + curveValue = 4.0; + } + + // Adjust the location of each branch if multiple branches are visible at the same time + curveValue += m_segmentBranchIndex() * 0.2; + + if ( m_curveType() == RimRftTopologyCurve::CurveType::PACKER ) + { + auto packerSegmentIndices = segment.packerSegmentIndicesOnAnnulus( m_segmentBranchIndex() ); + + for ( auto segmentIndex : packerSegmentIndices ) + { + depths.push_back( seglenstValues[segmentIndex] ); + + propertyValues.push_back( curveValue ); + } + } + else + { + for ( auto segmentIndex : segmentIndices ) + { + depths.push_back( seglenstValues[segmentIndex] ); + + propertyValues.push_back( curveValue ); + } + } + } + + RimDepthTrackPlot* wellLogPlot; + firstAncestorOrThisOfTypeAsserted( wellLogPlot ); + + RimWellLogPlot::DepthTypeEnum depthType = wellLogPlot->depthType(); + RiaDefines::DepthUnitType displayUnit = wellLogPlot->depthUnit(); + bool isExtractionCurve = false; + bool useLogarithmicScale = false; + setPropertyValuesAndDepths( propertyValues, depths, depthType, 0.0, displayUnit, isExtractionCurve, useLogarithmicScale ); + + // Assign curve values based on horizontal or vertical plot + setPropertyAndDepthValuesToPlotCurve( propertyValues, depths ); + + if ( updateParentPlot ) + { + updateZoomInParentPlot(); + } + + if ( m_parentPlot ) + { + m_parentPlot->replot(); + } + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimRftTopologyCurve::setAdditionalDataSources( const std::vector& additionalDataSources ) +{ + m_additionalDataSources.setValue( additionalDataSources ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimRftTopologyCurve::applyDefaultAppearance() +{ + auto color = colorForBranchType( m_curveType() ); + setColor( color ); + + if ( m_curveType() == RimRftTopologyCurve::CurveType::PACKER ) + { + int adjustedSymbolSize = symbolSize() * 2; + + setSymbolSize( adjustedSymbolSize ); + setLineStyle( RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_NONE ); + setSymbol( RiuPlotCurveSymbol::PointSymbolEnum::SYMBOL_RECT ); + } + else + { + if ( m_curveType() == RimRftTopologyCurve::CurveType::TUBING ) + { + setLineThickness( 5.0 ); + } + else if ( m_curveType() == RimRftTopologyCurve::CurveType::DEVICE ) + { + setSymbolEdgeColor( color ); + setLineStyle( RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_NONE ); + } + else if ( m_curveType() == RimRftTopologyCurve::CurveType::ANNULUS ) + { + setSymbolEdgeColor( color ); + setLineStyle( RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_NONE ); + } + + int adjustedSymbolSize = symbolSize() * 1.2; + setSymbolSize( adjustedSymbolSize ); + setSymbol( RiuPlotCurveSymbol::PointSymbolEnum::SYMBOL_ELLIPSE ); + } +} diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimRftTopologyCurve.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimRftTopologyCurve.h new file mode 100644 index 0000000000..8940c24e2c --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimRftTopologyCurve.h @@ -0,0 +1,91 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022 Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RimWellLogCurve.h" + +#include "cafPdmPtrField.h" + +#include "RiaRftDefines.h" +#include + +class RimSummaryCase; + +//================================================================================================== +/// +/// +//================================================================================================== +class RimRftTopologyCurve : public RimWellLogCurve +{ + CAF_PDM_HEADER_INIT; + +public: + enum class CurveType + { + PACKER, + TUBING, + DEVICE, + ANNULUS + }; + +public: + RimRftTopologyCurve(); + + static RimRftTopologyCurve* createPackerCurve( RimSummaryCase* summaryCase, + const QDateTime& timeStep, + const QString& wellName, + int segmentBranchIndex ); + + static RimRftTopologyCurve* createTopologyCurve( RimSummaryCase* summaryCase, + const QDateTime& timeStep, + const QString& wellName, + int segmentBranchIndex, + RiaDefines::RftBranchType branchType ); + + void setDataSource( RimSummaryCase* summaryCase, const QDateTime& timeStep, const QString& wellName, int segmentBranchIndex ); + + void applyDefaultAppearance(); + + QString wellName() const override; + QString wellLogChannelUiName() const override; + QString wellLogChannelUnits() const override; + + static cvf::Color3f colorForBranchType( CurveType curveType ); + static cvf::Color3f colorForRftBranchType( RiaDefines::RftBranchType branchType ); + +protected: + QString createCurveAutoName() override; + + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; + void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; + + void onLoadDataAndUpdate( bool updateParentPlot ) override; + +private: + caf::PdmPtrField m_summaryCase; + caf::PdmField m_timeStep; + caf::PdmField m_wellName; + caf::PdmField m_segmentBranchIndex; + caf::PdmField> m_segmentBranchType; + caf::PdmField> m_curveType; + +public: + void setAdditionalDataSources( const std::vector& additionalDataSources ); +}; diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurve.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurve.cpp index eadf11f853..8b102c5001 100644 --- a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurve.cpp @@ -19,12 +19,17 @@ #include "RimWellLogCurve.h" +#include "RiaApplication.h" #include "RiaCurveDataTools.h" #include "RiaPlotDefines.h" + #include "RigWellLogCurveData.h" #include "RimDepthTrackPlot.h" +#include "RimMainPlotCollection.h" +#include "RimTools.h" #include "RimWellLogTrack.h" +#include "RimWellPath.h" #include "RiuQwtPlotCurve.h" #include "RiuQwtPlotWidget.h" @@ -52,6 +57,15 @@ RimWellLogCurve::RimWellLogCurve() m_curveDataPropertyValueRange = std::make_pair( std::numeric_limits::infinity(), -std::numeric_limits::infinity() ); + // Ref well path as Ui element for debug purpose. If not needed: Remove use of caf::PdmPtrField, + // and replace with regular non-ui ptr. The remove related code in calculateValueOptions() and + // defineUiOrdering(). + CAF_PDM_InitFieldNoDefault( &m_refWellPath, "ReferenceWellPath", "Reference Well Path" ); + m_refWellPath.uiCapability()->setUiHidden( !RiaApplication::enableDevelopmentFeatures() ); + m_refWellPath.uiCapability()->setUiReadOnly( true ); + + CAF_PDM_InitField( &m_useRefWell, "UseReferenceWellPath", true, "Use Reference Well Path" ); + setDeletable( true ); } @@ -220,6 +234,24 @@ const RigWellLogCurveData* RimWellLogCurve::curveData() const return m_curveData.p(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellLogCurve::setReferenceWellPath( RimWellPath* refWellPath ) +{ + m_refWellPath = refWellPath; + + if ( m_refWellPath == nullptr ) + { + m_useRefWell.uiCapability()->setUiHidden( true ); + m_useRefWell = true; + } + else + { + m_useRefWell.uiCapability()->setUiHidden( false ); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -227,7 +259,7 @@ void RimWellLogCurve::updateCurveAppearance() { RimPlotCurve::updateCurveAppearance(); - RimDepthTrackPlot::DepthOrientation orientation = RimDepthTrackPlot::DepthOrientation::VERTICAL; + auto orientation = RiaDefines::Orientation::VERTICAL; RimDepthTrackPlot* wellLogPlot = nullptr; firstAncestorOrThisOfType( wellLogPlot ); @@ -247,7 +279,7 @@ void RimWellLogCurve::updateCurveAppearance() RiuQwtPlotCurve* qwtPlotCurve = dynamic_cast( m_plotCurve ); if ( qwtPlotCurve ) { - if ( orientation == RimDepthTrackPlot::DepthOrientation::VERTICAL ) + if ( orientation == RiaDefines::Orientation::VERTICAL ) { qwtPlotCurve->setOrientation( Qt::Horizontal ); qwtPlotCurve->setBaseline( 0.0 ); @@ -295,6 +327,31 @@ void RimWellLogCurve::setOverrideCurveData( const std::vector& } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RimWellLogCurve::closestYValueForX( double xValue ) const +{ + if ( m_curveData.isNull() ) return std::numeric_limits::infinity(); + + auto depths = m_curveData->depths( RiaDefines::DepthTypeEnum::MEASURED_DEPTH ); + auto values = m_curveData->propertyValues(); + + if ( depths.empty() || values.empty() ) return std::numeric_limits::infinity(); + + auto it = std::upper_bound( depths.begin(), depths.end(), xValue ); + if ( it == depths.begin() ) return values.front(); + if ( it == depths.end() ) return values.back(); + + auto index = std::distance( depths.begin(), it - 1 ); + + double firstDistance = std::abs( xValue - depths[index] ); + double secondDistance = std::abs( xValue - depths[index + 1] ); + + if ( firstDistance < secondDistance ) return values[index]; + return values[index + 1]; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -382,6 +439,37 @@ void RimWellLogCurve::calculateCurveDataPropertyValueRange() } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QList RimWellLogCurve::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) +{ + auto options = RimStackablePlotCurve::calculateValueOptions( fieldNeedingOptions ); + if ( fieldNeedingOptions == &m_refWellPath ) + { + options.push_back( caf::PdmOptionItemInfo( QString( "None" ), nullptr ) ); + RimTools::wellPathOptionItems( &options ); + } + return options; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellLogCurve::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) +{ + RimStackablePlotCurve::defineUiOrdering( uiConfigName, uiOrdering ); + + auto group = uiOrdering.findGroup( "DataSource" ); + if ( group != nullptr ) + { + group->add( &m_refWellPath ); + group->add( &m_useRefWell ); + } + + uiOrdering.skipRemainingFields( true ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -403,6 +491,12 @@ void RimWellLogCurve::fieldChangedByUi( const caf::PdmFieldHandle* changedField, { loadDataAndUpdate( true ); } + + if ( changedField == &m_useRefWell ) + { + loadDataAndUpdate( true ); + updateConnectedEditors(); + } } //-------------------------------------------------------------------------------------------------- @@ -410,13 +504,13 @@ void RimWellLogCurve::fieldChangedByUi( const caf::PdmFieldHandle* changedField, //-------------------------------------------------------------------------------------------------- bool RimWellLogCurve::isVerticalCurve() const { - RimDepthTrackPlot::DepthOrientation orientation = RimDepthTrackPlot::DepthOrientation::VERTICAL; + auto orientation = RiaDefines::Orientation::VERTICAL; RimDepthTrackPlot* depthTrackPlot = nullptr; firstAncestorOrThisOfType( depthTrackPlot ); if ( depthTrackPlot ) orientation = depthTrackPlot->depthOrientation(); - return orientation == RimDepthTrackPlot::DepthOrientation::VERTICAL; + return orientation == RiaDefines::Orientation::VERTICAL; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurve.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurve.h index 19618f0a5d..27969b57af 100644 --- a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurve.h +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurve.h @@ -23,10 +23,12 @@ #include "RiaWellLogUnitTools.h" #include "RimStackablePlotCurve.h" +#include "cafPdmPtrField.h" #include "cafSignal.h" #include "cvfObject.h" class RigWellLogCurveData; +class RimWellPath; //================================================================================================== /// @@ -47,6 +49,7 @@ class RimWellLogCurve : public RimStackablePlotCurve const RigWellLogCurveData* curveData() const; + void setReferenceWellPath( RimWellPath* refWellPath ); void updateCurveAppearance() override; virtual QString wellName() const = 0; @@ -61,12 +64,16 @@ class RimWellLogCurve : public RimStackablePlotCurve const std::vector& depthValues, const RiaCurveDataTools::CurveIntervals& curveIntervals ); + double closestYValueForX( double xValue ) const override; + protected: - void updateZoomInParentPlot() override; - void updateLegendsInPlot() override; - void setOverrideCurveDataPropertyValueRange( double minimumValue, double maximumValue ); - void calculateCurveDataPropertyValueRange(); + void updateZoomInParentPlot() override; + void updateLegendsInPlot() override; + void setOverrideCurveDataPropertyValueRange( double minimumValue, double maximumValue ); + void calculateCurveDataPropertyValueRange(); + QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; void setPropertyValuesAndDepths( const std::vector& propertyValues, @@ -106,6 +113,10 @@ class RimWellLogCurve : public RimStackablePlotCurve RiuPlotAxis depthAxis() const; RiuPlotAxis valueAxis() const; +protected: + caf::PdmPtrField m_refWellPath; + caf::PdmField m_useRefWell; + private: cvf::ref m_curveData; std::pair m_curveDataPropertyValueRange; diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurveCommonDataSource.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurveCommonDataSource.cpp index 989873e24c..07e0156d34 100644 --- a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurveCommonDataSource.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurveCommonDataSource.cpp @@ -29,6 +29,7 @@ #include "RimOilField.h" #include "RimProject.h" #include "RimRftTools.h" +#include "RimRftTopologyCurve.h" #include "RimSummaryCase.h" #include "RimTools.h" #include "RimWellFlowRateCurve.h" @@ -82,6 +83,7 @@ RimWellLogCurveCommonDataSource::RimWellLogCurveCommonDataSource() CAF_PDM_InitFieldNoDefault( &m_trajectoryType, "TrajectoryType", "Trajectory Type" ); CAF_PDM_InitFieldNoDefault( &m_wellPath, "CurveWellPath", "Well Path" ); + CAF_PDM_InitFieldNoDefault( &m_refWellPath, "CurveReferenceWellPath", "Reference Well Path" ); CAF_PDM_InitFieldNoDefault( &m_simWellName, "SimulationWellName", "Well Name" ); CAF_PDM_InitFieldNoDefault( &m_branchDetection, @@ -108,10 +110,11 @@ RimWellLogCurveCommonDataSource::RimWellLogCurveCommonDataSource() CAF_PDM_InitFieldNoDefault( &m_rftTimeStep, "RftTimeStep", "RFT Time Step" ); CAF_PDM_InitFieldNoDefault( &m_rftWellName, "RftWellName", "RFT Well Name" ); CAF_PDM_InitFieldNoDefault( &m_rftSegmentBranchIndex, "SegmentBranchIndex", "RFT Branch" ); - CAF_PDM_InitFieldNoDefault( &m_rftSegmentBranchType, "SegmentBranchType", "RFT Branch Type" ); + CAF_PDM_InitFieldNoDefault( &m_rftSegmentBranchType, "SegmentBranchType", "RFT Completion" ); - m_case = nullptr; - m_wellPath = nullptr; + m_case = nullptr; + m_wellPath = nullptr; + m_refWellPath = nullptr; } //-------------------------------------------------------------------------------------------------- @@ -186,6 +189,14 @@ void RimWellLogCurveCommonDataSource::setWellPathToApply( RimWellPath* val ) m_wellPath = val; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellPath* RimWellLogCurveCommonDataSource::referenceWellPathToApply() const +{ + return m_refWellPath; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -285,7 +296,7 @@ void RimWellLogCurveCommonDataSource::setTimeStepToApply( int val ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimWellLogCurveCommonDataSource::resetDefaultOptions() +void RimWellLogCurveCommonDataSource::resetSourceStepFields() { setCaseToApply( nullptr ); setSummaryCaseToApply( nullptr ); @@ -321,8 +332,8 @@ void RimWellLogCurveCommonDataSource::resetDefaultOptions() void RimWellLogCurveCommonDataSource::analyseCurvesAndTracks( const std::vector& curves, const std::vector& tracks ) { - // Reset all options in the UI - resetDefaultOptions(); + // Reset all source step fields in the UI + resetSourceStepFields(); // Check to see if the parameters are unique for ( RimWellLogCurve* curve : curves ) @@ -531,6 +542,7 @@ void RimWellLogCurveCommonDataSource::applyDataSourceChanges( const std::vector< auto* extractionCurve = dynamic_cast( curve ); auto* measurementCurve = dynamic_cast( curve ); auto* rftCurve = dynamic_cast( curve ); + auto* topologyCurve = dynamic_cast( curve ); if ( fileCurve ) { if ( wellPathToApply() != nullptr ) @@ -638,6 +650,10 @@ void RimWellLogCurveCommonDataSource::applyDataSourceChanges( const std::vector< rftCurve->firstAncestorOrThisOfTypeAsserted( parentPlot ); plots.insert( parentPlot ); } + else if ( topologyCurve ) + { + topologyCurve->setDataSource( m_summaryCase, m_rftTimeStep, m_rftWellName, m_rftSegmentBranchIndex ); + } curve->updateConnectedEditors(); } @@ -832,24 +848,29 @@ void RimWellLogCurveCommonDataSource::fieldChangedByUi( const caf::PdmFieldHandl RimWellLogPlot* parentPlot = nullptr; this->firstAncestorOrThisOfType( parentPlot ); - if ( changedField == &m_branchDetection ) + if ( changedField == &m_wellPath && m_wellPath() == m_refWellPath() ) { - if ( m_branchDetection().isPartiallyTrue() ) - { - // The Tristate is cycled from false -> partially true -> true - // Partially true is used for "Mixed state" and is not settable by the user so cycle on to true. - m_branchDetection.v() = caf::Tristate::State::True; - } + m_refWellPath = nullptr; } - if ( changedField == &m_wbsSmoothing ) + if ( changedField == &m_branchDetection && m_branchDetection().isPartiallyTrue() ) { - if ( m_wbsSmoothing().isPartiallyTrue() ) - { - m_wbsSmoothing.v() = caf::Tristate::State::True; - } + // The Tristate is cycled from false -> partially true -> true + // Partially true is used for "Mixed state" and is not settable by the user so cycle on to true. + m_branchDetection.v() = caf::Tristate::State::True; + } + if ( changedField == &m_wbsSmoothing && m_wbsSmoothing().isPartiallyTrue() ) + { + m_wbsSmoothing.v() = caf::Tristate::State::True; } this->applyDataSourceChanges(); + + if ( changedField == &m_rftWellName ) + { + // The segment branch index is depending on the well name. Make sure that the combo box for branch index is + // updated. + m_rftSegmentBranchIndex.uiCapability()->updateConnectedEditors(); + } } //-------------------------------------------------------------------------------------------------- @@ -923,6 +944,11 @@ QList } } } + else if ( fieldNeedingOptions == &m_refWellPath ) + { + options.push_back( caf::PdmOptionItemInfo( QString( "None" ), nullptr ) ); + RimTools::wellPathOptionItemsSubset( { m_wellPath() }, &options ); + } else if ( fieldNeedingOptions == &m_timeStep ) { if ( m_case() ) @@ -1002,7 +1028,8 @@ QList } else if ( fieldNeedingOptions == &m_rftSegmentBranchIndex ) { - options = RimRftTools::segmentBranchIndexOptions( rftReader(), m_rftWellName(), m_rftTimeStep() ); + options = + RimRftTools::segmentBranchIndexOptions( rftReader(), m_rftWellName(), m_rftTimeStep(), m_rftSegmentBranchType() ); } return options; @@ -1019,13 +1046,14 @@ void RimWellLogCurveCommonDataSource::defineUiOrdering( QString uiConfigName, ca if ( m_case() ) group->add( &m_case ); if ( m_summaryCase() ) group->add( &m_summaryCase ); - auto* eclipseCase = dynamic_cast( m_case() ); + const auto* eclipseCase = dynamic_cast( m_case() ); if ( eclipseCase ) { group->add( &m_trajectoryType ); if ( trajectoryTypeToApply() == RimWellLogExtractionCurve::WELL_PATH ) { group->add( &m_wellPath ); + group->add( &m_refWellPath ); } else if ( trajectoryTypeToApply() == RimWellLogExtractionCurve::SIMULATION_WELL ) { @@ -1052,6 +1080,7 @@ void RimWellLogCurveCommonDataSource::defineUiOrdering( QString uiConfigName, ca else { if ( m_wellPath() ) group->add( &m_wellPath ); + group->add( &m_refWellPath ); } if ( uiConfigName == smoothingUiOrderinglabel() ) @@ -1062,8 +1091,8 @@ void RimWellLogCurveCommonDataSource::defineUiOrdering( QString uiConfigName, ca if ( !m_uniqueRftTimeSteps.empty() ) group->add( &m_rftTimeStep ); if ( !m_uniqueRftWellNames.empty() ) group->add( &m_rftWellName ); - if ( !m_uniqueRftBranchIndices.empty() ) group->add( &m_rftSegmentBranchIndex ); if ( !m_uniqueRftBranchTypes.empty() ) group->add( &m_rftSegmentBranchType ); + if ( !m_uniqueRftBranchIndices.empty() ) group->add( &m_rftSegmentBranchIndex ); uiOrdering.skipRemainingFields( true ); } @@ -1079,8 +1108,8 @@ void RimWellLogCurveCommonDataSource::defineEditorAttribute( const caf::PdmField if ( myAttr ) { if ( field == &m_case || field == &m_summaryCase || field == &m_simWellName || field == &m_wellPath || - field == &m_timeStep || field == &m_rftTimeStep || field == &m_rftSegmentBranchIndex || - field == &m_rftWellName ) + field == &m_refWellPath || field == &m_timeStep || field == &m_rftTimeStep || + field == &m_rftSegmentBranchIndex || field == &m_rftWellName ) { myAttr->showPreviousAndNextButtons = true; myAttr->nextIcon = QIcon( ":/ComboBoxDown.svg" ); @@ -1187,3 +1216,29 @@ void RimWellLogCurveCommonDataSource::selectWell( QString wellName ) } } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimWellLogCurveCommonDataSource::rftWellName() const +{ + return m_rftWellName(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QDateTime RimWellLogCurveCommonDataSource::rftTime() const +{ + return m_rftTimeStep(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RimWellLogCurveCommonDataSource::rftBranchIndex() const +{ + if ( m_uniqueRftBranchIndices.size() == 1 ) return m_rftSegmentBranchIndex(); + + return -1; +} diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurveCommonDataSource.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurveCommonDataSource.h index d10f1a452f..ff13ae7ef3 100644 --- a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurveCommonDataSource.h +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurveCommonDataSource.h @@ -67,6 +67,7 @@ class RimWellLogCurveCommonDataSource : public caf::PdmObject void setTrajectoryTypeToApply( int val ); RimWellPath* wellPathToApply() const; void setWellPathToApply( RimWellPath* val ); + RimWellPath* referenceWellPathToApply() const; int branchIndexToApply() const; void setBranchIndexToApply( int val ); caf::Tristate branchDetectionToApply() const; @@ -83,7 +84,10 @@ class RimWellLogCurveCommonDataSource : public caf::PdmObject void selectWell( QString wellName ); - void resetDefaultOptions(); + QString rftWellName() const; + QDateTime rftTime() const; + int rftBranchIndex() const; + void analyseCurvesAndTracks( const std::vector& curves, const std::vector& tracks ); void analyseCurvesAndTracks(); void applyDataSourceChanges( const std::vector& curves, const std::vector& tracks ); @@ -108,6 +112,7 @@ class RimWellLogCurveCommonDataSource : public caf::PdmObject QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override; void modifyCurrentIndex( caf::PdmValueField* field, int indexOffset ); + void resetSourceStepFields(); RifReaderRftInterface* rftReader(); @@ -118,6 +123,7 @@ class RimWellLogCurveCommonDataSource : public caf::PdmObject caf::PdmPtrField m_summaryCase; caf::PdmField m_trajectoryType; caf::PdmPtrField m_wellPath; + caf::PdmPtrField m_refWellPath; caf::PdmField m_simWellName; caf::PdmField m_allow3DSelectionLink; caf::PdmField m_branchIndex; diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogExtractionCurve.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogExtractionCurve.cpp index 9fb92da788..f95ccb1da6 100644 --- a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogExtractionCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogExtractionCurve.cpp @@ -36,6 +36,7 @@ #include "RigSimulationWellCenterLineCalculator.h" #include "RigSimulationWellCoordsAndMD.h" #include "RigWellLogCurveData.h" +#include "RigWellLogIndexDepthOffset.h" #include "RigWellPath.h" #include "RimEclipseCase.h" @@ -67,6 +68,7 @@ #include "cafPdmUiTreeOrdering.h" #include "cafUtils.h" +#include #include //================================================================================================== @@ -373,7 +375,7 @@ void RimWellLogExtractionCurve::onLoadDataAndUpdate( bool updateParentPlot ) std::vector depthPlotValues = curveData()->depthValuesByIntervals( depthType, displayUnit ); CAF_ASSERT( xPlotValues.size() == depthPlotValues.size() ); - if ( wellLogPlot->depthOrientation() == RimDepthTrackPlot::DepthOrientation::HORIZONTAL ) + if ( wellLogPlot->depthOrientation() == RiaDefines::Orientation::HORIZONTAL ) m_plotCurve->setSamplesFromXValuesAndYValues( depthPlotValues, xPlotValues, useLogarithmicScale ); else @@ -436,67 +438,105 @@ void RimWellLogExtractionCurve::extractData( bool* isUsingPseudoLength, clampBranchIndex(); - RimWellLogPlotCollection* wellLogCollection = RimMainPlotCollection::current()->wellLogPlotCollection(); - - cvf::ref eclExtractor; - cvf::ref geomExtractor; + WellLogExtractionCurveData curveData; if ( eclipseCase ) { - if ( m_trajectoryType == WELL_PATH ) + curveData = extractEclipseData( eclipseCase, isUsingPseudoLength ); + } + else if ( geomCase ) + { + curveData = extractGeomData( geomCase, isUsingPseudoLength, performDataSmoothing, smoothingThreshold ); + } + + if ( !curveData.values.empty() && !curveData.measuredDepthValues.empty() ) + { + bool useLogarithmicScale = false; + + RimWellLogTrack* track = nullptr; + firstAncestorOfType( track ); + if ( track ) + { + useLogarithmicScale = track->isLogarithmicScale(); + } + + if ( curveData.tvDepthValues.empty() ) { - eclExtractor = wellLogCollection->findOrCreateExtractor( m_wellPath, eclipseCase ); + this->setPropertyValuesAndDepths( curveData.values, + curveData.measuredDepthValues, + RiaDefines::DepthTypeEnum::MEASURED_DEPTH, + 0.0, + curveData.depthUnit, + !performDataSmoothing, + useLogarithmicScale, + curveData.xUnits ); } else { - std::vector simWellBranches = - RiaSimWellBranchTools::simulationWellBranches( m_simWellName, m_branchDetection ); - if ( m_branchIndex >= 0 && m_branchIndex < static_cast( simWellBranches.size() ) ) - { - auto wellBranch = simWellBranches[m_branchIndex]; - eclExtractor = wellLogCollection->findOrCreateSimWellExtractor( m_simWellName, - eclipseCase->caseUserDescription(), - wellBranch, - eclipseCase->eclipseCaseData() ); - if ( eclExtractor.notNull() ) - { - m_wellPathsWithExtractors.push_back( wellBranch ); - } - - *isUsingPseudoLength = true; - } + this->setPropertyValuesWithMdAndTVD( curveData.values, + curveData.measuredDepthValues, + curveData.tvDepthValues, + curveData.rkbDiff, + curveData.depthUnit, + !performDataSmoothing, + useLogarithmicScale, + curveData.xUnits ); } } - else if ( geomCase ) +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellLogExtractionCurve::WellLogExtractionCurveData + RimWellLogExtractionCurve::extractEclipseData( RimEclipseCase* eclipseCase, bool* isUsingPseudoLength ) +{ + WellLogExtractionCurveData curveData; + RimWellLogPlotCollection* wellLogCollection = RimMainPlotCollection::current()->wellLogPlotCollection(); + + cvf::ref wellExtractor; + cvf::ref refWellExtractor; + cvf::ref resAcc; + if ( m_trajectoryType == WELL_PATH ) { - geomExtractor = wellLogCollection->findOrCreateExtractor( m_wellPath, geomCase ); + wellExtractor = wellLogCollection->findOrCreateExtractor( m_wellPath, eclipseCase ); + refWellExtractor = wellLogCollection->findOrCreateExtractor( m_refWellPath, eclipseCase ); } + else + { + std::vector simWellBranches = + RiaSimWellBranchTools::simulationWellBranches( m_simWellName, m_branchDetection ); + if ( m_branchIndex >= 0 && m_branchIndex < static_cast( simWellBranches.size() ) ) + { + auto wellBranch = simWellBranches[m_branchIndex]; + wellExtractor = wellLogCollection->findOrCreateSimWellExtractor( m_simWellName, + eclipseCase->caseUserDescription(), + wellBranch, + eclipseCase->eclipseCaseData() ); + if ( wellExtractor.notNull() ) + { + m_wellPathsWithExtractors.push_back( wellBranch ); + } - std::vector values; - std::vector measuredDepthValues; - std::vector tvDepthValues; - double rkbDiff = 0.0; - - RiaDefines::DepthUnitType depthUnit = RiaDefines::DepthUnitType::UNIT_METER; - QString xUnits = RiaWellLogUnitTools::noUnitString(); + *isUsingPseudoLength = true; + } + } - if ( eclExtractor.notNull() ) + if ( wellExtractor.notNull() ) { - measuredDepthValues = eclExtractor->cellIntersectionMDs(); - tvDepthValues = eclExtractor->cellIntersectionTVDs(); - rkbDiff = eclExtractor->wellPathGeometry()->rkbDiff(); + curveData.measuredDepthValues = wellExtractor->cellIntersectionMDs(); + curveData.tvDepthValues = wellExtractor->cellIntersectionTVDs(); + curveData.rkbDiff = wellExtractor->wellPathGeometry()->rkbDiff(); m_eclipseResultDefinition->loadResult(); - cvf::ref resAcc = - RigResultAccessorFactory::createFromResultDefinition( eclipseCase->eclipseCaseData(), - 0, - m_timeStep, - m_eclipseResultDefinition ); - + resAcc = RigResultAccessorFactory::createFromResultDefinition( eclipseCase->eclipseCaseData(), + 0, + m_timeStep, + m_eclipseResultDefinition ); if ( resAcc.notNull() ) { - eclExtractor->curveData( resAcc.p(), &values ); + wellExtractor->curveData( resAcc.p(), &curveData.values ); } RiaDefines::EclipseUnitSystem eclipseUnitsType = eclipseCase->eclipseCaseData()->unitsType(); @@ -504,74 +544,285 @@ void RimWellLogExtractionCurve::extractData( bool* isUsingPseudoLength, { // See https://github.com/OPM/ResInsight/issues/538 - depthUnit = RiaDefines::DepthUnitType::UNIT_FEET; + curveData.depthUnit = RiaDefines::DepthUnitType::UNIT_FEET; + } + } + + // Reference well adjustment does not support simulated wells + if ( m_trajectoryType == WELL_PATH && wellExtractor.notNull() && refWellExtractor.notNull() && m_useRefWell ) + { + RigEclipseResultAddress indexKResAdr( RiaDefines::ResultCatType::STATIC_NATIVE, + RiaResultNames::indexKResultName() ); + eclipseCase->eclipseCaseData()->results( RiaDefines::PorosityModelType::MATRIX_MODEL )->ensureKnownResultLoaded( indexKResAdr ); + + cvf::ref indexKResAcc = + RigResultAccessorFactory::createFromResultAddress( eclipseCase->eclipseCaseData(), + 0, + RiaDefines::PorosityModelType::MATRIX_MODEL, + m_timeStep, + indexKResAdr ); + + std::vector refWellMeasuredDepthValues = refWellExtractor->cellIntersectionMDs(); + std::vector refWellTvDepthValues = refWellExtractor->cellIntersectionTVDs(); + std::vector refWellPropertyValues; + std::vector wellIndexKValues; + std::vector refWellIndexKValues; + if ( indexKResAcc.notNull() ) + { + wellExtractor->curveData( indexKResAcc.p(), &wellIndexKValues ); + refWellExtractor->curveData( indexKResAcc.p(), &refWellIndexKValues ); + } + if ( resAcc.notNull() ) + { + refWellExtractor->curveData( resAcc.p(), &refWellPropertyValues ); + } + if ( !wellIndexKValues.empty() && !refWellIndexKValues.empty() && !refWellPropertyValues.empty() ) + { + mapPropertyValuesFromReferenceWell( curveData.measuredDepthValues, + curveData.tvDepthValues, + curveData.values, + wellIndexKValues, + refWellMeasuredDepthValues, + refWellTvDepthValues, + refWellPropertyValues, + refWellIndexKValues ); } } - else if ( geomExtractor.notNull() ) // geomExtractor + + return curveData; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellLogExtractionCurve::WellLogExtractionCurveData + RimWellLogExtractionCurve::extractGeomData( RimGeoMechCase* geomCase, + bool* isUsingPseudoLength, + bool performDataSmoothing, + double smoothingThreshold ) +{ + WellLogExtractionCurveData curveData; + RimWellLogPlotCollection* wellLogCollection = RimMainPlotCollection::current()->wellLogPlotCollection(); + cvf::ref wellExtractor = wellLogCollection->findOrCreateExtractor( m_wellPath, geomCase ); + cvf::ref refWellExtractor = + wellLogCollection->findOrCreateExtractor( m_refWellPath, geomCase ); + + if ( wellExtractor.notNull() ) { - measuredDepthValues = geomExtractor->cellIntersectionMDs(); - tvDepthValues = geomExtractor->cellIntersectionTVDs(); - rkbDiff = geomExtractor->wellPathGeometry()->rkbDiff(); + curveData.measuredDepthValues = wellExtractor->cellIntersectionMDs(); + curveData.tvDepthValues = wellExtractor->cellIntersectionTVDs(); + curveData.rkbDiff = wellExtractor->wellPathGeometry()->rkbDiff(); - if ( measuredDepthValues.empty() ) + if ( curveData.measuredDepthValues.empty() ) { - return; + return curveData; } - findAndLoadWbsParametersFromLasFiles( m_wellPath(), geomExtractor.p() ); + findAndLoadWbsParametersFromLasFiles( m_wellPath(), wellExtractor.p() ); RimWellBoreStabilityPlot* wbsPlot; this->firstAncestorOrThisOfType( wbsPlot ); if ( wbsPlot ) { - wbsPlot->applyWbsParametersToExtractor( geomExtractor.p() ); + wbsPlot->applyWbsParametersToExtractor( wellExtractor.p() ); } m_geomResultDefinition->loadResult(); - xUnits = geomExtractor->curveData( m_geomResultDefinition->resultAddress(), m_timeStep, &values ); + curveData.xUnits = + wellExtractor->curveData( m_geomResultDefinition->resultAddress(), m_timeStep, &curveData.values ); + } + + // Do not adjust depth values of Azimuth and Inclination as they are dependent + // of the well geometry + const std::string fieldName = m_geomResultDefinition->resultAddress().fieldName; + const bool isNeglectedFieldName = fieldName == RiaResultNames::wbsAzimuthResult().toStdString() || + fieldName == RiaResultNames::wbsInclinationResult().toStdString(); + if ( !isNeglectedFieldName && wellExtractor.notNull() && refWellExtractor.notNull() && m_useRefWell ) + { + RigFemResultAddress indexKResAdr( RigFemResultPosEnum::RIG_ELEMENT_NODAL, "INDEX", "INDEX_K" ); + + const size_t frameIdx = 0; + std::vector refWellMeasuredDepthValues = refWellExtractor->cellIntersectionMDs(); + std::vector refWellTvDepthValues = refWellExtractor->cellIntersectionTVDs(); + std::vector refWellPropertyValues; + std::vector refWellIndexKValues; + std::vector wellIndexKValues; + if ( indexKResAdr.isValid() ) + { + wellExtractor->curveData( indexKResAdr, frameIdx, &wellIndexKValues ); + refWellExtractor->curveData( indexKResAdr, frameIdx, &refWellIndexKValues ); + refWellExtractor->curveData( m_geomResultDefinition->resultAddress(), frameIdx, &refWellPropertyValues ); + } + + if ( !wellIndexKValues.empty() && !refWellIndexKValues.empty() && !refWellPropertyValues.empty() ) + { + mapPropertyValuesFromReferenceWell( curveData.measuredDepthValues, + curveData.tvDepthValues, + curveData.values, + wellIndexKValues, + refWellMeasuredDepthValues, + refWellTvDepthValues, + refWellPropertyValues, + refWellIndexKValues ); + } if ( performDataSmoothing ) { - geomExtractor->performCurveDataSmoothing( m_timeStep, - &measuredDepthValues, - &tvDepthValues, - &values, - smoothingThreshold ); + refWellExtractor->performCurveDataSmoothing( frameIdx, + &curveData.measuredDepthValues, + &curveData.tvDepthValues, + &curveData.values, + smoothingThreshold ); } + return curveData; } - if ( !values.empty() && !measuredDepthValues.empty() ) + if ( wellExtractor.notNull() && performDataSmoothing ) { - bool useLogarithmicScale = false; + wellExtractor->performCurveDataSmoothing( m_timeStep, + &curveData.measuredDepthValues, + &curveData.tvDepthValues, + &curveData.values, + smoothingThreshold ); + } + return curveData; +} - RimWellLogTrack* track = nullptr; - firstAncestorOfType( track ); - if ( track ) +//-------------------------------------------------------------------------------------------------- +/// Utility function to map property values of reference well into curve of selected well, by +/// retrieving the property values and map to corresponding depth values by usage of k-layer index. +/// Match enter and exit values for k-layer and linearize for depth values between enter/exit of k-layer. +/// +/// Performs value mapping from first common k-layer to last common k-layer - i.e common min and +/// max index-k, as long as the k-layers are asymptotically increasing. +//-------------------------------------------------------------------------------------------------- +void RimWellLogExtractionCurve::mapPropertyValuesFromReferenceWell( std::vector& rMeasuredDepthValues, + std::vector& rTvDepthValues, + std::vector& rPropertyValues, + const std::vector& indexKValues, + const std::vector& refWellMeasuredDepthValues, + const std::vector& refWellTvDepthValues, + const std::vector& refWellPropertyValues, + const std::vector& refWellIndexKValues ) +{ + // TODO: Add asserts and checks + CAF_ASSERT( rMeasuredDepthValues.size() == rTvDepthValues.size() && + "Number of depth values must be equal for well!" ); + CAF_ASSERT( rMeasuredDepthValues.size() == rPropertyValues.size() && + "Number of property values must be equal number of depth values for well!" ); + CAF_ASSERT( rMeasuredDepthValues.size() == indexKValues.size() && + "Number of index K values must be equal number of depth values for well!" ); + CAF_ASSERT( refWellMeasuredDepthValues.size() == refWellTvDepthValues.size() && + "Number of depth values must be equal for reference well!" ); + CAF_ASSERT( refWellMeasuredDepthValues.size() == refWellPropertyValues.size() && + "Number of property values must be equal number of depth values for reference well!" ); + CAF_ASSERT( refWellMeasuredDepthValues.size() == refWellIndexKValues.size() && + "Number of index K values must be equal number of depth values for reference well!" ); + CAF_ASSERT( *std::min( indexKValues.cbegin(), indexKValues.cend() ) == + *std::min( refWellIndexKValues.cbegin(), refWellIndexKValues.cend() ) && + "Both index-K value vectors must contain common min index-K layer" ); + + // Find common min and max k-index value for range of depth values to adjust + const auto minLayerK = + static_cast( std::max( *std::min_element( refWellIndexKValues.cbegin(), refWellIndexKValues.cend() ), + *std::min_element( indexKValues.cbegin(), indexKValues.cend() ) ) ); + const auto maxLayerK = + static_cast( std::min( *std::max_element( refWellIndexKValues.cbegin(), refWellIndexKValues.cend() ), + *std::max_element( indexKValues.cbegin(), indexKValues.cend() ) ) ); + if ( minLayerK > maxLayerK ) + { + RiaLogging::error( + QString( "Invalid K layers found. Minimum: %1 > Maximum : %2" ).arg( minLayerK ).arg( maxLayerK ) ); + return; + } + + // Only allow asymptotically increasing k-layers - break at first decreasing k-layer value + auto createKLayerAndIndexMap = []( const std::vector& indexKValues, int minLayerK, int maxLayerK ) { + int prevKLayer = -1; + std::map> kLayerAndIndexesMap = {}; + for ( size_t i = 0; i < indexKValues.size(); ++i ) { - useLogarithmicScale = track->isLogarithmicScale(); + const auto kLayer = static_cast( indexKValues[i] ); + if ( kLayer < minLayerK ) continue; + if ( kLayer < prevKLayer || kLayer > maxLayerK ) break; + + kLayerAndIndexesMap[kLayer].push_back( i ); + prevKLayer = kLayer; } + return kLayerAndIndexesMap; + }; + + RigWellLogIndexDepthOffset wellLogIndexDepthOffset; + std::map> wellKLayerAndIndexesMap = + createKLayerAndIndexMap( indexKValues, minLayerK, maxLayerK ); + for ( const auto& [kLayer, indexes] : wellKLayerAndIndexesMap ) + { + if ( indexes.empty() ) continue; + const auto indexTop = indexes.front(); + const auto indexBottom = indexes.back(); + wellLogIndexDepthOffset.setIndexOffsetDepth( kLayer, + rMeasuredDepthValues[indexTop], + rMeasuredDepthValues[indexBottom], + rTvDepthValues[indexTop], + rTvDepthValues[indexBottom] ); + } - if ( tvDepthValues.empty() ) + std::vector propertyValues = {}; + std::vector measuredDepthValues = {}; + std::vector tvDepthValues = {}; + std::map> refWellKLayerAndIndexesMap = + createKLayerAndIndexMap( refWellIndexKValues, minLayerK, maxLayerK ); + for ( const auto& [kLayer, indexes] : refWellKLayerAndIndexesMap ) + { + if ( indexes.empty() || !wellLogIndexDepthOffset.hasIndex( kLayer ) ) continue; + const auto firstIdx = indexes.front(); + const auto lastIdx = indexes.back(); + + if ( indexes.size() == 2 ) { - this->setPropertyValuesAndDepths( values, - measuredDepthValues, - RiaDefines::DepthTypeEnum::MEASURED_DEPTH, - 0.0, - depthUnit, - !performDataSmoothing, - useLogarithmicScale, - xUnits ); + propertyValues.push_back( refWellPropertyValues[firstIdx] ); + propertyValues.push_back( refWellPropertyValues[lastIdx] ); + measuredDepthValues.push_back( wellLogIndexDepthOffset.getTopMd( kLayer ) ); + measuredDepthValues.push_back( wellLogIndexDepthOffset.getBottomMd( kLayer ) ); + tvDepthValues.push_back( wellLogIndexDepthOffset.getTopTvd( kLayer ) ); + tvDepthValues.push_back( wellLogIndexDepthOffset.getBottomTvd( kLayer ) ); } - else + else if ( indexes.size() > 2 && wellLogIndexDepthOffset.hasIndex( kLayer ) ) { - this->setPropertyValuesWithMdAndTVD( values, - measuredDepthValues, - tvDepthValues, - rkbDiff, - depthUnit, - !performDataSmoothing, - useLogarithmicScale, - xUnits ); + const auto wellTopMd = wellLogIndexDepthOffset.getTopMd( kLayer ); + const auto wellBottomMd = wellLogIndexDepthOffset.getBottomMd( kLayer ); + const auto wellTopTvd = wellLogIndexDepthOffset.getTopTvd( kLayer ); + const auto wellBottomTvd = wellLogIndexDepthOffset.getBottomTvd( kLayer ); + + // Add top/first samples + propertyValues.push_back( refWellPropertyValues[firstIdx] ); + measuredDepthValues.push_back( wellTopMd ); + tvDepthValues.push_back( wellTopTvd ); + + // Linearize depth values between top and bottom values in kLayer and add property value + const auto refTopMd = refWellMeasuredDepthValues[firstIdx]; + const auto refBottomMd = refWellMeasuredDepthValues[lastIdx]; + const auto refTopTvd = refWellTvDepthValues[firstIdx]; + const auto refBottomTvd = refWellTvDepthValues[lastIdx]; + for ( auto it = indexes.cbegin() + 1; it != indexes.cend() - 1; ++it ) + { + const auto idx = *it; + const auto percMd = ( refWellMeasuredDepthValues[idx] - refTopMd ) / ( refBottomMd - refTopMd ); + const auto percTvd = ( refWellTvDepthValues[idx] - refTopTvd ) / ( refBottomTvd - refTopTvd ); + + propertyValues.push_back( refWellPropertyValues[idx] ); + measuredDepthValues.push_back( percMd * ( wellBottomMd - wellTopMd ) + wellTopMd ); + tvDepthValues.push_back( percTvd * ( wellBottomTvd - wellTopTvd ) + wellTopTvd ); + } + + // Add bottom/last samples + propertyValues.push_back( refWellPropertyValues[lastIdx] ); + measuredDepthValues.push_back( wellBottomMd ); + tvDepthValues.push_back( wellBottomTvd ); } } + + rPropertyValues = propertyValues; + rMeasuredDepthValues = measuredDepthValues; + rTvDepthValues = tvDepthValues; } //-------------------------------------------------------------------------------------------------- @@ -701,9 +952,6 @@ void RimWellLogExtractionCurve::clearGeneratedSimWellPaths() m_wellPathsWithExtractors.clear(); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- QList RimWellLogExtractionCurve::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) { @@ -749,10 +997,9 @@ QList //-------------------------------------------------------------------------------------------------- void RimWellLogExtractionCurve::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) { - RimPlotCurve::updateOptionSensitivity(); + RimPlotCurve::updateFieldUiState(); caf::PdmUiGroup* curveDataGroup = uiOrdering.addNewGroupWithKeyword( "Data Source", dataSourceGroupKeyword() ); - curveDataGroup->add( &m_case ); RimGeoMechCase* geomCase = dynamic_cast( m_case.value() ); @@ -764,6 +1011,7 @@ void RimWellLogExtractionCurve::defineUiOrdering( QString uiConfigName, caf::Pdm if ( m_trajectoryType() == WELL_PATH ) { curveDataGroup->add( &m_wellPath ); + RimWellLogCurve::defineUiOrdering( uiConfigName, uiOrdering ); } else { @@ -779,6 +1027,8 @@ void RimWellLogExtractionCurve::defineUiOrdering( QString uiConfigName, caf::Pdm else if ( geomCase ) { curveDataGroup->add( &m_wellPath ); + RimWellLogCurve::defineUiOrdering( uiConfigName, uiOrdering ); + m_geomResultDefinition->uiOrdering( uiConfigName, *curveDataGroup ); } @@ -787,19 +1037,11 @@ void RimWellLogExtractionCurve::defineUiOrdering( QString uiConfigName, caf::Pdm curveDataGroup->add( &m_timeStep ); } - caf::PdmUiGroup* stackingGroup = uiOrdering.addNewGroup( "Stacking" ); - RimStackablePlotCurve::stackingUiOrdering( *stackingGroup ); - - caf::PdmUiGroup* appearanceGroup = uiOrdering.addNewGroup( "Appearance" ); - RimPlotCurve::appearanceUiOrdering( *appearanceGroup ); - - caf::PdmUiGroup* nameGroup = uiOrdering.addNewGroup( "Curve Name" ); - nameGroup->setCollapsedByDefault(); - nameGroup->add( &m_showLegend ); - RimPlotCurve::curveNameUiOrdering( *nameGroup ); + RimStackablePlotCurve::defaultUiOrdering( uiOrdering ); - if ( m_isUsingAutoName ) + if ( m_namingMethod == RiaDefines::ObjectNamingMethod::AUTO ) { + auto nameGroup = uiOrdering.findGroup( RiaDefines::curveNameGroupName() ); nameGroup->add( &m_addWellNameToCurveName ); nameGroup->add( &m_addCaseNameToCurveName ); nameGroup->add( &m_addPropertyToCurveName ); @@ -925,6 +1167,11 @@ QString RimWellLogExtractionCurve::createCurveAutoName() } } + if ( m_useRefWell && m_refWellPath && !m_refWellPath->name().isEmpty() ) + { + generatedCurveName.push_back( QString( "Ref. Well: %1" ).arg( m_refWellPath->name() ) ); + } + return generatedCurveName.join( ", " ); } diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogExtractionCurve.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogExtractionCurve.h index fd96d8af1f..298467e109 100644 --- a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogExtractionCurve.h +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogExtractionCurve.h @@ -20,6 +20,9 @@ #pragma once #include "RigWbsParameter.h" + +#include "RimEclipseCase.h" +#include "RimGeoMechCase.h" #include "RimWellLogCurve.h" #include "cafPdmChildField.h" @@ -137,4 +140,30 @@ class RimWellLogExtractionCurve : public RimWellLogCurve caf::PdmField m_addDateToCurveName; std::vector m_wellPathsWithExtractors; + +private: + struct WellLogExtractionCurveData + { + std::vector values = std::vector(); + std::vector measuredDepthValues = std::vector(); + std::vector tvDepthValues = std::vector(); + double rkbDiff = 0.0; + RiaDefines::DepthUnitType depthUnit = RiaDefines::DepthUnitType::UNIT_METER; + QString xUnits = RiaWellLogUnitTools::noUnitString(); + }; + +private: + WellLogExtractionCurveData extractEclipseData( RimEclipseCase* eclipseCase, bool* isUsingPseudoLength ); + WellLogExtractionCurveData extractGeomData( RimGeoMechCase* geomCase, + bool* isUsingPseudoLength, + bool performDataSmoothing = false, + double smoothingThreshold = -1.0 ); + void mapPropertyValuesFromReferenceWell( std::vector& rMeasuredDepthValues, + std::vector& rTvDepthValues, + std::vector& rPropertyValues, + const std::vector& indexKValues, + const std::vector& refWellMeasuredDepthValues, + const std::vector& refWellTvDepthValues, + const std::vector& refWellPropertyValues, + const std::vector& refWellIndexKValues ); }; diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFileCurve.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFileCurve.cpp index 133d580578..25235b47f2 100644 --- a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFileCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFileCurve.cpp @@ -178,7 +178,7 @@ void RimWellLogFileCurve::onLoadDataAndUpdate( bool updateParentPlot ) } } - if ( m_isUsingAutoName ) + if ( m_namingMethod == RiaDefines::ObjectNamingMethod::AUTO ) { m_plotCurve->setTitle( createCurveAutoName() ); } @@ -330,22 +330,14 @@ void RimWellLogFileCurve::fieldChangedByUi( const caf::PdmFieldHandle* changedFi //-------------------------------------------------------------------------------------------------- void RimWellLogFileCurve::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) { - RimPlotCurve::updateOptionSensitivity(); + RimPlotCurve::updateFieldUiState(); caf::PdmUiGroup* curveDataGroup = uiOrdering.addNewGroup( "Curve Data" ); curveDataGroup->add( &m_wellPath ); curveDataGroup->add( &m_wellLogFile ); curveDataGroup->add( &m_wellLogChannelName ); - caf::PdmUiGroup* stackingGroup = uiOrdering.addNewGroup( "Stacking" ); - RimStackablePlotCurve::stackingUiOrdering( *stackingGroup ); - - caf::PdmUiGroup* appearanceGroup = uiOrdering.addNewGroup( "Appearance" ); - RimPlotCurve::appearanceUiOrdering( *appearanceGroup ); - - caf::PdmUiGroup* nameGroup = uiOrdering.addNewGroup( "Curve Name" ); - nameGroup->add( &m_showLegend ); - RimPlotCurve::curveNameUiOrdering( *nameGroup ); + RimStackablePlotCurve::defaultUiOrdering( uiOrdering ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlotNameConfig.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlotNameConfig.cpp index b41cc6dadb..2ac00f77db 100644 --- a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlotNameConfig.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlotNameConfig.cpp @@ -32,84 +32,6 @@ RimWellLogPlotNameConfig::RimWellLogPlotNameConfig() : RimNameConfig( "Well Log Plot" ) { CAF_PDM_InitObject( "Well Log Plot Name Generator" ); - - CAF_PDM_InitField( &m_addCaseName, "AddCaseName", false, "Show Case Name" ); - CAF_PDM_InitField( &m_addWellName, "AddWellName", false, "Show Well Name" ); - CAF_PDM_InitField( &m_addTimestep, "AddTimeStep", false, "Show Time Step" ); - CAF_PDM_InitField( &m_addAirGap, "AddAirGap", false, "Show Air Gap" ); - CAF_PDM_InitField( &m_addWaterDepth, "AddWaterDepth", false, "Show Water Depth" ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RimWellLogPlotNameConfig::addCaseName() const -{ - return m_addCaseName(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RimWellLogPlotNameConfig::addWellName() const -{ - return m_addWellName(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RimWellLogPlotNameConfig::addTimeStep() const -{ - return m_addTimestep(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RimWellLogPlotNameConfig::addAirGap() const -{ - return m_addAirGap(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RimWellLogPlotNameConfig::addWaterDepth() const -{ - return m_addWaterDepth(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimWellLogPlotNameConfig::setAutoNameTags( bool addCaseName, - bool addWellName, - bool addTimeStep, - bool addAirGap, - bool addWaterDepth ) -{ - m_addCaseName = addCaseName; - m_addWellName = addWellName; - m_addTimestep = addTimeStep; - m_addAirGap = addAirGap; - m_addWaterDepth = addWaterDepth; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimWellLogPlotNameConfig::setFieldVisibility( bool caseNameVisible, - bool wellNameVisible, - bool timeStepVisible, - bool airGapVisible, - bool waterDepthVisible ) -{ - m_addCaseName.uiCapability()->setUiHidden( !caseNameVisible ); - m_addWellName.uiCapability()->setUiHidden( !wellNameVisible ); - m_addTimestep.uiCapability()->setUiHidden( !timeStepVisible ); - m_addAirGap.uiCapability()->setUiHidden( !airGapVisible ); - m_addWaterDepth.uiCapability()->setUiHidden( !waterDepthVisible ); } //-------------------------------------------------------------------------------------------------- @@ -117,19 +39,6 @@ void RimWellLogPlotNameConfig::setFieldVisibility( bool caseNameVisible, //-------------------------------------------------------------------------------------------------- void RimWellLogPlotNameConfig::doEnableAllAutoNameTags( bool enable ) { - setAutoNameTags( enable, enable, enable, enable, enable ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimWellLogPlotNameConfig::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) -{ - RimNameConfig::defineUiOrdering( uiConfigName, uiOrdering ); - - uiOrdering.add( &m_addCaseName ); - uiOrdering.add( &m_addWellName ); - uiOrdering.add( &m_addTimestep ); - uiOrdering.add( &m_addAirGap ); - uiOrdering.add( &m_addWaterDepth ); + // TODO: Dummy implementation to implement the pure abstract method + // To be removed when the plot naming is transferred to use of plot template text string } diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlotNameConfig.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlotNameConfig.h index bc1b2529b3..11eee0c410 100644 --- a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlotNameConfig.h +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlotNameConfig.h @@ -31,29 +31,6 @@ class RimWellLogPlotNameConfig : public RimNameConfig public: RimWellLogPlotNameConfig(); - bool addCaseName() const; - bool addWellName() const; - bool addTimeStep() const; - bool addAirGap() const; - bool addWaterDepth() const; - - void setAutoNameTags( bool addCaseName, bool addWellName, bool addTimeStep, bool addAirGap, bool addWaterDepth ); - void setFieldVisibility( bool caseNameVisible, - bool wellNameVisible, - bool timeStepVisible, - bool airGapVisible, - bool waterDepthVisible ); - -protected: - void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; - private: void doEnableAllAutoNameTags( bool enable ) override; - -private: - caf::PdmField m_addCaseName; - caf::PdmField m_addWellName; - caf::PdmField m_addTimestep; - caf::PdmField m_addAirGap; - caf::PdmField m_addWaterDepth; }; diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogRftCurve.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogRftCurve.cpp index b9353640f1..a2b17438ce 100644 --- a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogRftCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogRftCurve.cpp @@ -18,6 +18,8 @@ #include "RimWellLogRftCurve.h" +#include "RiaColorTables.h" +#include "RiaColorTools.h" #include "RiaDefines.h" #include "RiaEclipseUnitTools.h" #include "RiaQDateTimeTools.h" @@ -25,6 +27,7 @@ #include "RiaRftDefines.h" #include "RiaSimWellBranchTools.h" #include "RiaSummaryTools.h" +#include "RiaTextStringTools.h" #include "RifEclipseRftAddress.h" #include "RifReaderEclipseRft.h" @@ -175,7 +178,11 @@ RimWellLogRftCurve::RimWellLogRftCurve() CAF_PDM_InitField( &m_segmentResultName, "SegmentResultName", RiaResultNames::undefinedResultName(), "Result Name" ); CAF_PDM_InitField( &m_segmentBranchIndex, "SegmentBranchIndex", -1, "Branch" ); - CAF_PDM_InitFieldNoDefault( &m_segmentBranchType, "SegmentBranchType", "Branch Type" ); + CAF_PDM_InitFieldNoDefault( &m_segmentBranchType, "SegmentBranchType", "Completion" ); + + CAF_PDM_InitField( &m_scaleFactor, "ScaleFactor", 1.0, "Scale Factor" ); + + CAF_PDM_InitField( &m_curveColorByPhase, "CurveColorByPhase", false, "Color by Phase" ); } //-------------------------------------------------------------------------------------------------- @@ -441,32 +448,83 @@ void RimWellLogRftCurve::setSimWellBranchData( bool branchDetection, int branchI //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QString RimWellLogRftCurve::createCurveAutoName() +void RimWellLogRftCurve::enableColorFromResultName( bool enable ) +{ + m_curveColorByPhase = enable; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellLogRftCurve::assignColorFromResultName( const QString& resultName ) +{ + cvf::Color3f color = cvf::Color3f::BLACK; + + if ( resultName.startsWith( "SEGO" ) || resultName.startsWith( "CONO" ) || resultName.startsWith( "SOIL" ) ) + { + color = RiaColorTables::summaryCurveGreenPaletteColors().cycledColor3f( 0 ); + } + else if ( resultName.startsWith( "SEGW" ) || resultName.startsWith( "CONW" ) || resultName.startsWith( "SWAT" ) ) + { + color = RiaColorTables::summaryCurveBluePaletteColors().cycledColor3f( 0 ); + } + else if ( resultName.startsWith( "SEGG" ) || resultName.startsWith( "CONG" ) || resultName.startsWith( "SGAS" ) ) + { + color = RiaColorTables::summaryCurveRedPaletteColors().cycledColor3f( 0 ); + } + + // Do nothing if not phase is identified + if ( color == cvf::Color3f::BLACK ) return; + + float scalingFactor = 0.5; + auto fillColor = RiaColorTools::makeLighter( color, scalingFactor ); + setColor( color ); + setFillColor( fillColor ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellLogRftCurve::setScaleFactor( double factor ) +{ + m_scaleFactor = factor; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::map RimWellLogRftCurve::createCurveNameKeyValueMap() const { - QStringList name; + std::map variableValueMap; if ( !wellName().isEmpty() ) { - name.push_back( wellName() ); + variableValueMap[RiaDefines::namingVariableWell()] = wellName(); } - name.push_back( "RFT" ); + variableValueMap[RiaDefines::namingVariableResultType()] = "RFT"; + QString caseText; if ( m_eclipseResultCase ) { - name.push_back( m_eclipseResultCase->caseUserDescription() ); + caseText = m_eclipseResultCase->caseUserDescription(); } else if ( m_ensemble ) // Summary RFT curves have both ensemble and summary set. Prioritize ensemble for name. { - name.push_back( m_ensemble->name() ); + caseText = m_ensemble->name(); } else if ( m_summaryCase ) { - name.push_back( m_summaryCase->displayCaseName() ); + caseText = m_summaryCase->displayCaseName(); } else if ( m_observedFmuRftData ) { - name.push_back( m_observedFmuRftData->name() ); + caseText = m_observedFmuRftData->name(); + } + + if ( !caseText.isEmpty() ) + { + variableValueMap[RiaDefines::namingVariableCase()] = caseText; } if ( m_rftDataType() == RftDataType::RFT_DATA ) @@ -477,25 +535,80 @@ QString RimWellLogRftCurve::createCurveAutoName() RifEclipseRftAddress::RftWellLogChannelType channelNameEnum = caf::AppEnum::fromText( wellLogChannelUiName() ); QString channelName = caf::AppEnum::uiText( channelNameEnum ); - name.push_back( channelName ); + + variableValueMap[RiaDefines::namingVariableResultName()] = channelName; } } else if ( m_rftDataType() == RftDataType::RFT_SEGMENT_DATA ) { - name.push_back( m_segmentResultName ); + variableValueMap[RiaDefines::namingVariableResultName()] = m_segmentResultName; QString branchText = QString( "Branch %1" ).arg( m_segmentBranchIndex() ); - name.push_back( branchText ); - name.push_back( m_segmentBranchType().uiText() ); + variableValueMap[RiaDefines::namingVariableWellBranch()] = branchText; + + if ( isSegmentResult( m_segmentResultName() ) ) + { + variableValueMap[RiaDefines::namingVariableResultType()] = m_segmentBranchType().uiText(); + } + else + { + variableValueMap[RiaDefines::namingVariableResultType()] = "Reservoir"; + } } if ( !m_timeStep().isNull() ) { - name.push_back( m_timeStep().toString( RiaQDateTimeTools::dateFormatString() ) ); + variableValueMap[RiaDefines::namingVariableTime()] = m_timeStep().toString( RiaQDateTimeTools::dateFormatString() ); + } + + return variableValueMap; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimWellLogRftCurve::createCurveAutoName() +{ + QStringList curveNameSubStrings; + + for ( const auto& [key, value] : createCurveNameKeyValueMap() ) + { + curveNameSubStrings.push_back( value ); } - return name.join( ", " ); + return curveNameSubStrings.join( ", " ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimWellLogRftCurve::createCurveNameFromTemplate( const QString& templateText ) +{ + auto name = RiaTextStringTools::replaceTemplateTextWithValues( templateText, createCurveNameKeyValueMap() ); + + if ( m_scaleFactor() != 1.0 ) + { + int exponent = std::log10( m_scaleFactor() ); + auto text = QString( "x1e%1" ).arg( QString::number( exponent ) ); + + name += QString( " [%1]" ).arg( text ); + } + + return name; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QStringList RimWellLogRftCurve::supportedCurveNameVariables() const +{ + return { RiaDefines::namingVariableWell(), + RiaDefines::namingVariableResultName(), + RiaDefines::namingVariableResultType(), + RiaDefines::namingVariableCase(), + RiaDefines::namingVariableWellBranch(), + RiaDefines::namingVariableTime() }; } //-------------------------------------------------------------------------------------------------- @@ -503,6 +616,11 @@ QString RimWellLogRftCurve::createCurveAutoName() //-------------------------------------------------------------------------------------------------- void RimWellLogRftCurve::onLoadDataAndUpdate( bool updateParentPlot ) { + if ( m_curveColorByPhase && m_rftDataType() == RimWellLogRftCurve::RftDataType::RFT_SEGMENT_DATA ) + { + assignColorFromResultName( m_segmentResultName ); + } + this->RimPlotCurve::updateCurvePresentation( updateParentPlot ); DerivedMDSource derivedMDSource = DerivedMDSource::NO_SOURCE; @@ -604,8 +722,9 @@ void RimWellLogRftCurve::onLoadDataAndUpdate( bool updateParentPlot ) { m_plotCurve->setPerPointLabels( perPointLabels ); - auto propertyValues = this->curveData()->propertyValues(); - auto depthValues = this->curveData()->depths( RiaDefines::DepthTypeEnum::MEASURED_DEPTH, displayUnit ); + auto propertyValues = this->curveData()->propertyValuesByIntervals(); + auto depthValues = + this->curveData()->depthValuesByIntervals( RiaDefines::DepthTypeEnum::MEASURED_DEPTH, displayUnit ); if ( !errors.empty() ) { @@ -616,6 +735,8 @@ void RimWellLogRftCurve::onLoadDataAndUpdate( bool updateParentPlot ) setPropertyAndDepthValuesToPlotCurve( propertyValues, depthValues ); } + m_plotCurve->setLineSegmentStartStopIndices( this->curveData()->polylineStartStopIndices() ); + RimWellLogTrack* wellLogTrack; firstAncestorOrThisOfType( wellLogTrack ); CVF_ASSERT( wellLogTrack ); @@ -689,7 +810,7 @@ void RimWellLogRftCurve::onLoadDataAndUpdate( bool updateParentPlot ) //-------------------------------------------------------------------------------------------------- void RimWellLogRftCurve::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) { - RimPlotCurve::updateOptionSensitivity(); + RimPlotCurve::updateFieldUiState(); caf::PdmUiGroup* curveDataGroup = uiOrdering.addNewGroup( "Curve Data" ); curveDataGroup->add( &m_eclipseResultCase ); @@ -697,6 +818,7 @@ void RimWellLogRftCurve::defineUiOrdering( QString uiConfigName, caf::PdmUiOrder curveDataGroup->add( &m_wellName ); curveDataGroup->add( &m_timeStep ); curveDataGroup->add( &m_rftDataType ); + curveDataGroup->add( &m_scaleFactor ); if ( m_rftDataType() == RimWellLogRftCurve::RftDataType::RFT_DATA ) { @@ -710,19 +832,12 @@ void RimWellLogRftCurve::defineUiOrdering( QString uiConfigName, caf::PdmUiOrder else { curveDataGroup->add( &m_segmentResultName ); - curveDataGroup->add( &m_segmentBranchIndex ); curveDataGroup->add( &m_segmentBranchType ); + curveDataGroup->add( &m_segmentBranchIndex ); + curveDataGroup->add( &m_curveColorByPhase ); } - caf::PdmUiGroup* stackingGroup = uiOrdering.addNewGroup( "Stacking" ); - RimStackablePlotCurve::stackingUiOrdering( *stackingGroup ); - - caf::PdmUiGroup* appearanceGroup = uiOrdering.addNewGroup( "Appearance" ); - RimPlotCurve::appearanceUiOrdering( *appearanceGroup ); - - caf::PdmUiGroup* nameGroup = uiOrdering.addNewGroup( "Curve Name" ); - nameGroup->add( &m_showLegend ); - RimPlotCurve::curveNameUiOrdering( *nameGroup ); + RimStackablePlotCurve::defaultUiOrdering( uiOrdering ); uiOrdering.skipRemainingFields(); } @@ -778,7 +893,17 @@ QList RimWellLogRftCurve::calculateValueOptions( const c } else if ( fieldNeedingOptions == &m_segmentBranchIndex ) { - options = RimRftTools::segmentBranchIndexOptions( reader, m_wellName(), m_timeStep() ); + options = RimRftTools::segmentBranchIndexOptions( reader, m_wellName(), m_timeStep(), m_segmentBranchType() ); + } + else if ( fieldNeedingOptions == &m_scaleFactor ) + { + for ( int exp = -12; exp <= 12; exp += 3 ) + { + QString uiText = exp == 0 ? "1" : QString( "10 ^ %1" ).arg( exp ); + double value = std::pow( 10, exp ); + + options.push_back( caf::PdmOptionItemInfo( uiText, value ) ); + } } return options; @@ -829,7 +954,7 @@ void RimWellLogRftCurve::fieldChangedByUi( const caf::PdmFieldHandle* changedFie loadData = true; } else if ( changedField == &m_timeStep || changedField == &m_segmentResultName || changedField == &m_segmentBranchIndex || - changedField == &m_rftDataType || changedField == &m_segmentBranchType ) + changedField == &m_rftDataType || changedField == &m_segmentBranchType || m_scaleFactor ) { loadData = true; } @@ -1010,9 +1135,9 @@ std::vector RimWellLogRftCurve::sortedIndicesInRftFile() std::vector RimWellLogRftCurve::xValues() { RifReaderRftInterface* reader = rftReader(); - std::vector values; + if ( !reader ) return {}; - if ( !reader ) return values; + std::vector values; if ( m_rftDataType() == RftDataType::RFT_SEGMENT_DATA ) { @@ -1023,29 +1148,37 @@ std::vector RimWellLogRftCurve::xValues() m_segmentBranchType() ); reader->values( depthAddress, &values ); - - return values; } + else + { + auto address = RifEclipseRftAddress::createAddress( m_wellName(), m_timeStep, m_wellLogChannelName() ); - auto address = RifEclipseRftAddress::createAddress( m_wellName(), m_timeStep, m_wellLogChannelName() ); - - reader->values( address, &values ); - - bool wellPathExists = createWellPathIdxToRftFileIdxMapping(); + reader->values( address, &values ); - if ( wellPathExists ) - { - std::vector valuesSorted; + bool wellPathExists = createWellPathIdxToRftFileIdxMapping(); - for ( size_t idx : sortedIndicesInRftFile() ) + if ( wellPathExists ) { - if ( idx < values.size() ) + std::vector valuesSorted; + + for ( size_t idx : sortedIndicesInRftFile() ) { - valuesSorted.push_back( ( values.at( idx ) ) ); + if ( idx < values.size() ) + { + valuesSorted.push_back( ( values.at( idx ) ) ); + } } + + std::swap( valuesSorted, values ); } + } - return valuesSorted; + if ( m_scaleFactor() != 1.0 ) + { + for ( auto& val : values ) + { + val *= m_scaleFactor(); + } } return values; @@ -1124,27 +1257,12 @@ std::vector RimWellLogRftCurve::measuredDepthValues() { if ( m_rftDataType() == RftDataType::RFT_SEGMENT_DATA ) { - std::vector values; - RifReaderRftInterface* reader = rftReader(); if ( reader ) { - auto depthAddress = - RifEclipseRftAddress::createBranchSegmentAddress( m_wellName(), - m_timeStep, - RiaDefines::segmentStartDepthResultName(), - segmentBranchIndex(), - m_segmentBranchType() ); - - reader->values( depthAddress, &values ); - - // Special handling of first segment - if ( values.size() > 2 && values.front() < 0.001 ) - { - values[0] = values[1]; - } + return RimRftTools::seglenstValues( reader, m_wellName(), m_timeStep, segmentBranchIndex(), m_segmentBranchType() ); } - return values; + return {}; } if ( m_observedFmuRftData && !m_ensemble && !m_summaryCase ) @@ -1263,3 +1381,11 @@ int RimWellLogRftCurve::segmentBranchIndex() const { return m_segmentBranchIndex(); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimWellLogRftCurve::isSegmentResult( const QString& resultName ) +{ + return resultName.startsWith( "SEG" ); +} diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogRftCurve.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogRftCurve.h index 7f7bbcd65d..13322c4ba4 100644 --- a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogRftCurve.h +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogRftCurve.h @@ -98,9 +98,16 @@ class RimWellLogRftCurve : public RimWellLogCurve void setSimWellBranchData( bool branchDetection, int branchIndex ); + void enableColorFromResultName( bool enable ); + void assignColorFromResultName( const QString& resultName ); + + void setScaleFactor( double factor ); + protected: - // Overrides from RimWellLogPlotCurve - QString createCurveAutoName() override; + QString createCurveAutoName() override; + QString createCurveNameFromTemplate( const QString& templateText ) override; + QStringList supportedCurveNameVariables() const override; + void onLoadDataAndUpdate( bool updateParentPlot ) override; RiaDefines::PhaseType phaseType() const override; @@ -121,6 +128,8 @@ class RimWellLogRftCurve : public RimWellLogCurve std::vector sortedIndicesInRftFile(); void updateWellChannelNameAndTimeStep(); + std::map createCurveNameKeyValueMap() const; + std::vector xValues(); std::vector errorValues(); std::vector tvDepthValues(); @@ -133,6 +142,8 @@ class RimWellLogRftCurve : public RimWellLogCurve int segmentBranchIndex() const; + static bool isSegmentResult( const QString& resultName ); + private: caf::PdmPtrField m_eclipseResultCase; caf::PdmPtrField m_summaryCase; @@ -142,6 +153,9 @@ class RimWellLogRftCurve : public RimWellLogCurve caf::PdmField m_wellName; caf::PdmField m_branchIndex; caf::PdmField m_branchDetection; + caf::PdmField m_curveColorByPhase; + + caf::PdmField m_scaleFactor; caf::PdmField> m_rftDataType; diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogTrack.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogTrack.cpp index acc0f535db..81b6bc57cc 100644 --- a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogTrack.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogTrack.cpp @@ -59,6 +59,7 @@ #include "RimPerforationCollection.h" #include "RimPerforationInterval.h" #include "RimProject.h" +#include "RimRftTopologyCurve.h" #include "RimTools.h" #include "RimWellAllocationPlot.h" #include "RimWellBoreStabilityPlot.h" @@ -184,8 +185,6 @@ RimWellLogTrack::RimWellLogTrack() CAF_PDM_InitFieldNoDefault( &m_description, "TrackDescription", "Name" ); - m_description.uiCapability()->setUiReadOnly( true ); - CAF_PDM_InitFieldNoDefault( &m_curves, "Curves", "" ); m_curves.uiCapability()->setUiTreeHidden( true ); auto reorderability = caf::PdmFieldReorderCapability::addToField( &m_curves ); @@ -206,17 +205,18 @@ RimWellLogTrack::RimWellLogTrack() CAF_PDM_InitField( &m_isAutoScalePropertyValuesEnabled, "AutoScaleX", true, "Auto Scale" ); m_isAutoScalePropertyValuesEnabled.uiCapability()->setUiHidden( true ); - CAF_PDM_InitField( &m_isLogarithmicScaleEnabled, "LogarithmicScaleX", false, "Logarithmic Scale" ); + CAF_PDM_InitField( &m_isPropertyLogarithmicScaleEnabled, "LogarithmicScaleX", false, "Logarithmic Scale" ); CAF_PDM_InitField( &m_invertPropertyValueAxis, "InvertPropertyValueAxis", false, "Invert Axis Range" ); + CAF_PDM_InitField( &m_isPropertyAxisEnabled, "IsPropertyAxisEnabled", true, "Show Axis" ); CAF_PDM_InitFieldNoDefault( &m_propertyValueAxisGridVisibility, "ShowXGridLines", "Show Grid Lines" ); - CAF_PDM_InitField( &m_explicitTickIntervals, "ExplicitTickIntervals", false, "Manually Set Tick Intervals" ); - CAF_PDM_InitField( &m_minAndMaxTicksOnly, "MinAndMaxTicksOnly", false, "Show Ticks at Min and Max" ); - CAF_PDM_InitField( &m_majorTickInterval, "MajorTickIntervals", 0.0, "Major Tick Interval" ); - CAF_PDM_InitField( &m_minorTickInterval, "MinorTickIntervals", 0.0, "Minor Tick Interval" ); - m_majorTickInterval.uiCapability()->setUiHidden( true ); - m_minorTickInterval.uiCapability()->setUiHidden( true ); + CAF_PDM_InitField( &m_explicitTickIntervalsPropertyValueAxis, "ExplicitTickIntervals", false, "Manually Set Tick Intervals" ); + CAF_PDM_InitField( &m_propertyAxisMinAndMaxTicksOnly, "MinAndMaxTicksOnly", false, "Show Ticks at Min and Max" ); + CAF_PDM_InitField( &m_majorTickIntervalPropertyAxis, "MajorTickIntervals", 0.0, "Major Tick Interval" ); + CAF_PDM_InitField( &m_minorTickIntervalPropertyAxis, "MinorTickIntervals", 0.0, "Minor Tick Interval" ); + m_majorTickIntervalPropertyAxis.uiCapability()->setUiHidden( true ); + m_minorTickIntervalPropertyAxis.uiCapability()->setUiHidden( true ); CAF_PDM_InitFieldNoDefault( &m_axisFontSize, "AxisFontSize", "Axis Font Size" ); @@ -372,8 +372,9 @@ void RimWellLogTrack::calculatePropertyValueZoomRange() double minValue = HUGE_VAL; double maxValue = -HUGE_VAL; - size_t visibleCurves = 0u; - for ( auto curve : m_curves ) + size_t topologyCurveCount = 0; + size_t visibleCurves = 0u; + for ( const auto& curve : m_curves ) { double minCurveValue = HUGE_VAL; double maxCurveValue = -HUGE_VAL; @@ -394,6 +395,16 @@ void RimWellLogTrack::calculatePropertyValueZoomRange() } } } + + if ( dynamic_cast( curve.p() ) ) topologyCurveCount++; + } + + if ( topologyCurveCount == m_curves.size() ) + { + // The topology track is quite narrow, and to be able to show the curves we add extra space for min/max values + const double range = maxValue - minValue; + maxValue += range * 0.5; + minValue -= range * 0.5; } if ( minValue == HUGE_VAL ) @@ -402,9 +413,9 @@ void RimWellLogTrack::calculatePropertyValueZoomRange() minValue = 0; maxValue = 0; } - else if ( m_minorTickInterval() != 0.0 ) + else if ( m_minorTickIntervalPropertyAxis() != 0.0 ) { - std::tie( minValue, maxValue ) = adjustXRange( minValue, maxValue, m_minorTickInterval() ); + std::tie( minValue, maxValue ) = adjustXRange( minValue, maxValue, m_minorTickIntervalPropertyAxis() ); } else { @@ -488,7 +499,7 @@ void RimWellLogTrack::updatePropertyValueZoom() m_visiblePropertyValueRangeMin = m_availablePropertyValueRangeMin; m_visiblePropertyValueRangeMax = m_availablePropertyValueRangeMax; - if ( !visibleStackedCurves().empty() && !m_isLogarithmicScaleEnabled ) + if ( !visibleStackedCurves().empty() && !m_isPropertyLogarithmicScaleEnabled ) { // Try to ensure we include the base line whether the values are negative or positive. m_visiblePropertyValueRangeMin = std::min( m_visiblePropertyValueRangeMin(), 0.0 ); @@ -518,7 +529,7 @@ void RimWellLogTrack::updatePropertyValueZoom() this->firstAncestorOrThisOfTypeAsserted( wellLogPlot ); // Attribute components use the opposite axis to the property values - if ( wellLogPlot->depthOrientation() == RimDepthTrackPlot::DepthOrientation::VERTICAL ) + if ( wellLogPlot->depthOrientation() == RiaDefines::Orientation::VERTICAL ) { m_plotWidget->setAxisRange( RiuPlotAxis::defaultBottom(), componentRangeMin, componentRangeMax ); } @@ -538,7 +549,7 @@ void RimWellLogTrack::updateDepthZoom() RimDepthTrackPlot* wellLogPlot; this->firstAncestorOrThisOfTypeAsserted( wellLogPlot ); - if ( wellLogPlot->depthOrientation() == RimDepthTrackPlot::DepthOrientation::VERTICAL ) + if ( wellLogPlot->depthOrientation() == RiaDefines::Orientation::VERTICAL ) { m_plotWidget->setAxisRange( depthAxis(), m_visibleDepthRangeMin(), m_visibleDepthRangeMax() ); } @@ -583,22 +594,27 @@ void RimWellLogTrack::fieldChangedByUi( const caf::PdmFieldHandle* changedField, { updateParentLayout(); } - else if ( changedField == &m_explicitTickIntervals ) + else if ( changedField == &m_explicitTickIntervalsPropertyValueAxis ) { if ( m_plotWidget ) { - m_majorTickInterval = m_plotWidget->majorTickInterval( valueAxis() ); - m_minorTickInterval = m_plotWidget->minorTickInterval( valueAxis() ); + m_majorTickIntervalPropertyAxis = m_plotWidget->majorTickInterval( valueAxis() ); + m_minorTickIntervalPropertyAxis = m_plotWidget->minorTickInterval( valueAxis() ); } - m_majorTickInterval.uiCapability()->setUiHidden( !m_explicitTickIntervals() ); - m_minorTickInterval.uiCapability()->setUiHidden( !m_explicitTickIntervals() ); - if ( !m_explicitTickIntervals() ) + m_majorTickIntervalPropertyAxis.uiCapability()->setUiHidden( !m_explicitTickIntervalsPropertyValueAxis() ); + m_minorTickIntervalPropertyAxis.uiCapability()->setUiHidden( !m_explicitTickIntervalsPropertyValueAxis() ); + if ( !m_explicitTickIntervalsPropertyValueAxis() ) { updatePropertyValueAxisAndGridTickIntervals(); } } - else if ( changedField == &m_propertyValueAxisGridVisibility || changedField == &m_majorTickInterval || - changedField == &m_minorTickInterval || changedField == &m_minAndMaxTicksOnly || + else if ( changedField == &m_isPropertyAxisEnabled ) + { + updatePropertyValueAxisAndGridTickIntervals(); + updateParentLayout(); + } + else if ( changedField == &m_propertyValueAxisGridVisibility || changedField == &m_majorTickIntervalPropertyAxis || + changedField == &m_minorTickIntervalPropertyAxis || changedField == &m_propertyAxisMinAndMaxTicksOnly || changedField == &m_invertPropertyValueAxis ) { updatePropertyValueAxisAndGridTickIntervals(); @@ -606,7 +622,7 @@ void RimWellLogTrack::fieldChangedByUi( const caf::PdmFieldHandle* changedField, else if ( changedField == &m_visiblePropertyValueRangeMin || changedField == &m_visiblePropertyValueRangeMax ) { bool emptyRange = isEmptyVisiblePropertyRange(); - m_explicitTickIntervals.uiCapability()->setUiReadOnly( emptyRange ); + m_explicitTickIntervalsPropertyValueAxis.uiCapability()->setUiReadOnly( emptyRange ); m_propertyValueAxisGridVisibility.uiCapability()->setUiReadOnly( emptyRange ); m_isAutoScalePropertyValuesEnabled = false; @@ -624,14 +640,14 @@ void RimWellLogTrack::fieldChangedByUi( const caf::PdmFieldHandle* changedField, m_plotWidget->scheduleReplot(); } } - else if ( changedField == &m_isLogarithmicScaleEnabled ) + else if ( changedField == &m_isPropertyLogarithmicScaleEnabled ) { updateAxisScaleEngine(); - if ( m_isLogarithmicScaleEnabled() ) + if ( m_isPropertyLogarithmicScaleEnabled() ) { - m_explicitTickIntervals = false; + m_explicitTickIntervalsPropertyValueAxis = false; } - m_explicitTickIntervals.uiCapability()->setUiHidden( m_isLogarithmicScaleEnabled() ); + m_explicitTickIntervalsPropertyValueAxis.uiCapability()->setUiHidden( m_isPropertyLogarithmicScaleEnabled() ); updatePropertyValueZoom(); loadDataAndUpdate(); @@ -822,7 +838,7 @@ void RimWellLogTrack::updatePropertyValueAxisAndGridTickIntervals() auto rangeBoundaryB = m_visiblePropertyValueRangeMax(); if ( m_invertPropertyValueAxis() ) std::swap( rangeBoundaryA, rangeBoundaryB ); - if ( m_minAndMaxTicksOnly ) + if ( m_propertyAxisMinAndMaxTicksOnly ) { auto roundToDigits = []( double value, int numberOfDigits, bool useFloor ) { if ( value == 0.0 ) return 0.0; @@ -858,7 +874,7 @@ void RimWellLogTrack::updatePropertyValueAxisAndGridTickIntervals() RimDepthTrackPlot* wellLogPlot; this->firstAncestorOrThisOfTypeAsserted( wellLogPlot ); - if ( wellLogPlot->depthOrientation() == RimDepthTrackPlot::DepthOrientation::VERTICAL ) + if ( wellLogPlot->depthOrientation() == RiaDefines::Orientation::VERTICAL ) { m_plotWidget->qwtPlot()->setAxisScaleDiv( QwtAxis::XTop, div ); } @@ -867,11 +883,11 @@ void RimWellLogTrack::updatePropertyValueAxisAndGridTickIntervals() m_plotWidget->qwtPlot()->setAxisScaleDiv( QwtAxis::YLeft, div ); } } - else if ( m_explicitTickIntervals ) + else if ( m_explicitTickIntervalsPropertyValueAxis ) { m_plotWidget->setMajorAndMinorTickIntervals( valueAxis(), - m_majorTickInterval(), - m_minorTickInterval(), + m_majorTickIntervalPropertyAxis(), + m_minorTickIntervalPropertyAxis(), rangeBoundaryA, rangeBoundaryB ); } @@ -896,6 +912,9 @@ void RimWellLogTrack::updatePropertyValueAxisAndGridTickIntervals() wellLogPlot->depthAxisGridLinesEnabled() & RimWellLogPlot::AXIS_GRID_MAJOR, wellLogPlot->depthAxisGridLinesEnabled() & RimWellLogPlot::AXIS_GRID_MINOR ); } + + m_plotWidget->enableAxisNumberLabels( valueAxis(), m_isPropertyAxisEnabled() ); + m_plotWidget->scheduleReplot(); } @@ -1052,7 +1071,7 @@ QString RimWellLogTrack::asciiDataForPlotExport() const out += QString::number( curveDepth, 'f', 3 ); for ( std::vector plotVector : curvesPlotXValues ) { - out += " \t" + QString::number( plotVector[i], 'g' ); + out += QString( " %1" ).arg( QString::number( plotVector[i], 'f', 3 ), 12 ); } out += "\n"; } @@ -1270,7 +1289,7 @@ bool RimWellLogTrack::isEmptyVisiblePropertyRange() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimWellLogTrack::updateAxesVisibility( RimDepthTrackPlot::DepthOrientation orientation, bool isFirstTrack, bool isLastTrack ) +void RimWellLogTrack::updateAxesVisibility( RiaDefines::Orientation orientation, bool isFirstTrack, bool isLastTrack ) { if ( !m_plotWidget ) return; @@ -1287,19 +1306,30 @@ void RimWellLogTrack::updateAxesVisibility( RimDepthTrackPlot::DepthOrientation bool needUpdate = false; - if ( orientation == RimDepthTrackPlot::DepthOrientation::VERTICAL ) + RimDepthTrackPlot* wellLogPlot; + this->firstAncestorOrThisOfTypeAsserted( wellLogPlot ); + + bool showFirstTrack = + wellLogPlot->depthAxisVisibility() == RiaDefines::MultiPlotAxisVisibility::ALL_VISIBLE || + ( isFirstTrack && wellLogPlot->depthAxisVisibility() == RiaDefines::MultiPlotAxisVisibility::ONE_VISIBLE ); + + bool showLastTrack = + wellLogPlot->depthAxisVisibility() == RiaDefines::MultiPlotAxisVisibility::ALL_VISIBLE || + ( isLastTrack && wellLogPlot->depthAxisVisibility() == RiaDefines::MultiPlotAxisVisibility::ONE_VISIBLE ); + + if ( orientation == RiaDefines::Orientation::VERTICAL ) { // Show depth axis only for the first track (on the left side) needUpdate |= setAxisVisible( QwtAxis::XBottom, false ); needUpdate |= setAxisVisible( QwtAxis::XTop, true ); - needUpdate |= setAxisVisible( QwtAxis::YLeft, isFirstTrack ); + needUpdate |= setAxisVisible( QwtAxis::YLeft, showFirstTrack ); needUpdate |= setAxisVisible( QwtAxis::YRight, false ); } else { // Show depth axis only for the last track (on the bottom side) needUpdate |= setAxisVisible( QwtAxis::XTop, false ); - needUpdate |= setAxisVisible( QwtAxis::XBottom, isLastTrack ); + needUpdate |= setAxisVisible( QwtAxis::XBottom, showLastTrack ); needUpdate |= setAxisVisible( QwtAxis::YLeft, true ); needUpdate |= setAxisVisible( QwtAxis::YRight, false ); } @@ -1319,6 +1349,36 @@ void RimWellLogTrack::onChildrenUpdated( caf::PdmChildArrayFieldHandle* chi } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimWellLogTrack::isCurveHighlightSupported() const +{ + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellLogTrack::updateDepthMarkerLine() +{ + if ( m_plotWidget ) + { + RimDepthTrackPlot* wellLogPlot; + this->firstAncestorOrThisOfTypeAsserted( wellLogPlot ); + if ( wellLogPlot->isDepthMarkerLineEnabled() ) + { + m_plotWidget->createAnnotationsInPlot( wellLogPlot->depthAxisAnnotations() ); + } + else + { + m_plotWidget->createAnnotationsInPlot( {} ); + } + + m_plotWidget->scheduleReplot(); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1364,11 +1424,11 @@ void RimWellLogTrack::onLoadDataAndUpdate() } this->updatePropertyValueAxisAndGridTickIntervals(); - m_majorTickInterval.uiCapability()->setUiHidden( !m_explicitTickIntervals() ); - m_minorTickInterval.uiCapability()->setUiHidden( !m_explicitTickIntervals() ); + m_majorTickIntervalPropertyAxis.uiCapability()->setUiHidden( !m_explicitTickIntervalsPropertyValueAxis() ); + m_minorTickIntervalPropertyAxis.uiCapability()->setUiHidden( !m_explicitTickIntervalsPropertyValueAxis() ); bool emptyRange = isEmptyVisiblePropertyRange(); - m_explicitTickIntervals.uiCapability()->setUiReadOnly( emptyRange ); + m_explicitTickIntervalsPropertyValueAxis.uiCapability()->setUiReadOnly( emptyRange ); m_propertyValueAxisGridVisibility.uiCapability()->setUiReadOnly( emptyRange ); updateDepthZoom(); @@ -1731,9 +1791,9 @@ void RimWellLogTrack::updateZoomInParentPlot() //-------------------------------------------------------------------------------------------------- void RimWellLogTrack::setTickIntervals( double majorTickInterval, double minorTickInterval ) { - m_explicitTickIntervals = true; - m_majorTickInterval = majorTickInterval; - m_minorTickInterval = minorTickInterval; + m_explicitTickIntervalsPropertyValueAxis = true; + m_majorTickIntervalPropertyAxis = majorTickInterval; + m_minorTickIntervalPropertyAxis = minorTickInterval; } //-------------------------------------------------------------------------------------------------- @@ -1741,7 +1801,7 @@ void RimWellLogTrack::setTickIntervals( double majorTickInterval, double minorTi //-------------------------------------------------------------------------------------------------- void RimWellLogTrack::setMinAndMaxTicksOnly( bool enable ) { - m_minAndMaxTicksOnly = enable; + m_propertyAxisMinAndMaxTicksOnly = enable; } //-------------------------------------------------------------------------------------------------- @@ -1918,9 +1978,10 @@ QImage RimWellLogTrack::snapshotWindowContent() //-------------------------------------------------------------------------------------------------- void RimWellLogTrack::zoomAll() { - setAutoScalePropertyValuesEnabled( true ); - setAutoScaleDepthValuesEnabled( true ); - updateZoomInParentPlot(); + RimDepthTrackPlot* plot = nullptr; + firstAncestorOrThisOfType( plot ); + + if ( plot ) plot->zoomAll(); } //-------------------------------------------------------------------------------------------------- @@ -1945,7 +2006,14 @@ caf::PdmObject* RimWellLogTrack::findPdmObjectFromPlotCurve( const RiuPlotCurve* void RimWellLogTrack::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) { uiOrdering.add( &m_description ); - uiOrdering.add( &m_colSpan ); + + RimDepthTrackPlot* plot = nullptr; + firstAncestorOrThisOfType( plot ); + bool isHorizontal = plot && plot->depthOrientation() == RiaDefines::Orientation::HORIZONTAL; + if ( isHorizontal ) + uiOrdering.add( &m_rowSpan ); + else + uiOrdering.add( &m_colSpan ); caf::PdmUiGroup* annotationGroup = uiOrdering.addNewGroup( "Regions/Annotations" ); annotationGroup->setCollapsedByDefault(); @@ -2025,7 +2093,7 @@ void RimWellLogTrack::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering uiOrdering.add( &m_ensembleWellLogCurveSet ); - uiOrderingForXAxisSettings( uiOrdering ); + uiOrderingForPropertyAxisSettings( uiOrdering ); uiOrdering.skipRemainingFields( true ); } @@ -2097,11 +2165,11 @@ void RimWellLogTrack::updateAxisScaleEngine() this->firstAncestorOrThisOfType( wellLogPlot ); if ( wellLogPlot ) { - if ( wellLogPlot->depthOrientation() == RimDepthTrackPlot::DepthOrientation::VERTICAL ) + if ( wellLogPlot->depthOrientation() == RiaDefines::Orientation::VERTICAL ) { m_plotWidget->setAxisInverted( RiuPlotAxis::defaultLeft(), true ); - if ( m_isLogarithmicScaleEnabled ) + if ( m_isPropertyLogarithmicScaleEnabled ) { m_plotWidget->qwtPlot()->setAxisScaleEngine( QwtAxis::XTop, new QwtLogScaleEngine ); @@ -2120,7 +2188,7 @@ void RimWellLogTrack::updateAxisScaleEngine() { m_plotWidget->setAxisInverted( RiuPlotAxis::defaultLeft(), false ); - if ( m_isLogarithmicScaleEnabled ) + if ( m_isPropertyLogarithmicScaleEnabled ) { m_plotWidget->qwtPlot()->setAxisScaleEngine( QwtAxis::YLeft, new QwtLogScaleEngine ); @@ -2155,10 +2223,28 @@ std::pair RimWellLogTrack::adjustXRange( double minValue, double //-------------------------------------------------------------------------------------------------- std::pair RimWellLogTrack::extendMinMaxRange( double minValue, double maxValue, double factor ) { + if ( minValue == std::numeric_limits::infinity() || maxValue == std::numeric_limits::infinity() ) + { + return { minValue, maxValue }; + } + auto modifiedMin = minValue; auto modifiedMax = maxValue; auto range = std::fabs( maxValue - minValue ); + if ( range < 1e-6 ) + { + // If min and max are equal, the curve is not visible. Make sure the range is larger than zero. + if ( maxValue != 0.0 ) + { + range = maxValue * 0.01; + } + else + { + range = 1.0; + } + } + modifiedMax += factor * range; auto candidateMinValue = minValue - factor * range; @@ -2217,7 +2303,7 @@ void RimWellLogTrack::handleWheelEvent( QWheelEvent* wheelEvent ) double zoomCenter = 0.0; auto position = caf::position( wheelEvent ); - if ( wellLogPlot->depthOrientation() == RimDepthTrackPlot::DepthOrientation::VERTICAL ) + if ( wellLogPlot->depthOrientation() == RiaDefines::Orientation::VERTICAL ) { QwtScaleMap scaleMap = m_plotWidget->qwtPlot()->canvasMap( QwtAxis::YLeft ); zoomCenter = scaleMap.invTransform( position.y() ); @@ -2301,7 +2387,7 @@ void RimWellLogTrack::connectCurveSignals( RimWellLogCurve* curve ) //-------------------------------------------------------------------------------------------------- void RimWellLogTrack::computeAndSetPropertyValueRangeMinForLogarithmicScale() { - if ( m_isAutoScalePropertyValuesEnabled && m_isLogarithmicScaleEnabled ) + if ( m_isAutoScalePropertyValuesEnabled && m_isPropertyLogarithmicScaleEnabled ) { double pos = HUGE_VAL; double neg = -HUGE_VAL; @@ -2328,7 +2414,7 @@ void RimWellLogTrack::computeAndSetPropertyValueRangeMinForLogarithmicScale() //-------------------------------------------------------------------------------------------------- void RimWellLogTrack::setLogarithmicScale( bool enable ) { - m_isLogarithmicScaleEnabled = enable; + m_isPropertyLogarithmicScaleEnabled = enable; updateAxisScaleEngine(); computeAndSetPropertyValueRangeMinForLogarithmicScale(); @@ -2339,7 +2425,7 @@ void RimWellLogTrack::setLogarithmicScale( bool enable ) //-------------------------------------------------------------------------------------------------- bool RimWellLogTrack::isLogarithmicScale() const { - return m_isLogarithmicScaleEnabled; + return m_isPropertyLogarithmicScaleEnabled; } //-------------------------------------------------------------------------------------------------- @@ -2420,15 +2506,16 @@ void RimWellLogTrack::uiOrderingForRftPltFormations( caf::PdmUiOrdering& uiOrder //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimWellLogTrack::uiOrderingForXAxisSettings( caf::PdmUiOrdering& uiOrdering ) +void RimWellLogTrack::uiOrderingForPropertyAxisSettings( caf::PdmUiOrdering& uiOrdering ) { caf::PdmUiGroup* gridGroup = uiOrdering.addNewGroup( "Property Axis Settings" ); - gridGroup->add( &m_isLogarithmicScaleEnabled ); + gridGroup->add( &m_isPropertyAxisEnabled ); + gridGroup->add( &m_isPropertyLogarithmicScaleEnabled ); gridGroup->add( &m_visiblePropertyValueRangeMin ); gridGroup->add( &m_visiblePropertyValueRangeMax ); gridGroup->add( &m_invertPropertyValueAxis ); gridGroup->add( &m_propertyValueAxisGridVisibility ); - gridGroup->add( &m_minAndMaxTicksOnly ); + gridGroup->add( &m_propertyAxisMinAndMaxTicksOnly ); // TODO Revisit if these settings are required // See issue https://github.com/OPM/ResInsight/issues/4367 @@ -2437,6 +2524,22 @@ void RimWellLogTrack::uiOrderingForXAxisSettings( caf::PdmUiOrdering& uiOrdering // gridGroup->add( &m_minorTickInterval ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellLogTrack::enablePropertyAxis( bool enable ) +{ + m_isPropertyAxisEnabled = enable; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimWellLogTrack::isPropertyAxisEnabled() const +{ + return m_isPropertyAxisEnabled(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -2693,7 +2796,7 @@ void RimWellLogTrack::updateStackedCurveData() 0.0, displayUnit, false, - m_isLogarithmicScaleEnabled ); + m_isPropertyLogarithmicScaleEnabled ); auto plotDepthValues = tempCurveData.depths( depthType ); auto polyLineStartStopIndices = tempCurveData.polylineStartStopIndices(); @@ -2777,9 +2880,7 @@ void RimWellLogTrack::updateFormationNamesOnPlot() RiaDefines::DepthUnitType fromDepthUnit = plot->caseDepthUnit(); RiaDefines::DepthUnitType toDepthUnit = plot->depthUnit(); - RiaDefines::Orientation orientation = RiaDefines::Orientation::HORIZONTAL; - if ( plot->depthOrientation() == RimDepthTrackPlot::DepthOrientation::VERTICAL ) - orientation = RiaDefines::Orientation::VERTICAL; + auto orientation = plot->depthOrientation(); if ( m_formationSource() == FormationSource::WELL_PICK_FILTER ) { @@ -2948,9 +3049,7 @@ void RimWellLogTrack::updateResultPropertyNamesOnPlot() RiaDefines::DepthUnitType fromDepthUnit = plot->caseDepthUnit(); RiaDefines::DepthUnitType toDepthUnit = plot->depthUnit(); - RiaDefines::Orientation orientation = RiaDefines::Orientation::HORIZONTAL; - if ( plot->depthOrientation() == RimDepthTrackPlot::DepthOrientation::VERTICAL ) - orientation = RiaDefines::Orientation::VERTICAL; + auto orientation = plot->depthOrientation(); RigEclipseWellLogExtractor* eclWellLogExtractor = RiaExtractionTools::findOrCreateWellLogExtractor( m_formationWellPathForSourceCase, @@ -3082,9 +3181,7 @@ void RimWellLogTrack::updateCurveDataRegionsOnPlot() RiaDefines::DepthUnitType fromDepthUnit = wellBoreStabilityPlot->caseDepthUnit(); RiaDefines::DepthUnitType toDepthUnit = wellBoreStabilityPlot->depthUnit(); - RiaDefines::Orientation orientation = RiaDefines::Orientation::HORIZONTAL; - if ( wellBoreStabilityPlot->depthOrientation() == RimDepthTrackPlot::DepthOrientation::VERTICAL ) - orientation = RiaDefines::Orientation::VERTICAL; + auto orientation = wellBoreStabilityPlot->depthOrientation(); wellBoreStabilityPlot->updateCommonDataSource(); RimGeoMechCase* geoMechCase = diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogTrack.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogTrack.h index f17165f3f8..6d68b21319 100644 --- a/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogTrack.h +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogTrack.h @@ -202,7 +202,9 @@ class RimWellLogTrack : public RimPlot std::vector visibleCurves() const; void uiOrderingForRftPltFormations( caf::PdmUiOrdering& uiOrdering ); - void uiOrderingForXAxisSettings( caf::PdmUiOrdering& uiOrdering ); + void uiOrderingForPropertyAxisSettings( caf::PdmUiOrdering& uiOrdering ); + void enablePropertyAxis( bool enable ); + bool isPropertyAxisEnabled() const; void setFormationsForCaseWithSimWellOnly( bool caseWithSimWellOnly ); void updatePropertyValueAxisAndGridTickIntervals(); @@ -237,7 +239,9 @@ class RimWellLogTrack : public RimPlot void setCurvesTreeVisibility( bool isVisible ); void setEnsembleWellLogCurveSet( RimEnsembleWellLogCurveSet* curveSet ); - void updateAxesVisibility( RimDepthTrackPlot::DepthOrientation orientation, bool isFirstTrack, bool isLastTrack ); + void updateAxesVisibility( RiaDefines::Orientation orientation, bool isFirstTrack, bool isLastTrack ); + bool isCurveHighlightSupported() const override; + void updateDepthMarkerLine(); protected: // RimViewWindow overrides @@ -316,25 +320,25 @@ class RimWellLogTrack : public RimPlot bool isEmptyVisiblePropertyRange() const; private: - QString m_propertyValueAxisTitle; - - caf::PdmField m_description; - + caf::PdmField m_description; caf::PdmChildArrayField m_curves; - caf::PdmField m_visiblePropertyValueRangeMin; - caf::PdmField m_visiblePropertyValueRangeMax; - caf::PdmField m_visibleDepthRangeMin; - caf::PdmField m_visibleDepthRangeMax; + // Property value axis + caf::PdmField m_isPropertyAxisEnabled; + caf::PdmField m_visiblePropertyValueRangeMin; + caf::PdmField m_visiblePropertyValueRangeMax; caf::PdmField m_isAutoScalePropertyValuesEnabled; - caf::PdmField m_isLogarithmicScaleEnabled; + caf::PdmField m_isPropertyLogarithmicScaleEnabled; caf::PdmField m_invertPropertyValueAxis; caf::PdmField m_propertyValueAxisGridVisibility; + caf::PdmField m_propertyAxisMinAndMaxTicksOnly; + caf::PdmField m_explicitTickIntervalsPropertyValueAxis; + caf::PdmField m_majorTickIntervalPropertyAxis; + caf::PdmField m_minorTickIntervalPropertyAxis; - caf::PdmField m_explicitTickIntervals; - caf::PdmField m_minAndMaxTicksOnly; - caf::PdmField m_majorTickInterval; - caf::PdmField m_minorTickInterval; + // Depth axis + caf::PdmField m_visibleDepthRangeMin; + caf::PdmField m_visibleDepthRangeMax; caf::PdmField m_axisFontSize; @@ -374,8 +378,9 @@ class RimWellLogTrack : public RimPlot QPointer m_plotWidget; std::unique_ptr m_annotationTool; - double m_availablePropertyValueRangeMin; - double m_availablePropertyValueRangeMax; - double m_availableDepthRangeMin; - double m_availableDepthRangeMax; + QString m_propertyValueAxisTitle; + double m_availablePropertyValueRangeMin; + double m_availablePropertyValueRangeMax; + double m_availableDepthRangeMin; + double m_availableDepthRangeMax; }; diff --git a/ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementCurve.cpp b/ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementCurve.cpp index adaadc9574..ad477e38d6 100644 --- a/ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementCurve.cpp @@ -138,7 +138,7 @@ void RimWellMeasurementCurve::onLoadDataAndUpdate( bool updateParentPlot ) } } - if ( m_isUsingAutoName && m_plotCurve ) + if ( m_namingMethod == RiaDefines::ObjectNamingMethod::AUTO && m_plotCurve ) { m_plotCurve->setTitle( createCurveAutoName() ); } @@ -221,7 +221,7 @@ void RimWellMeasurementCurve::fieldChangedByUi( const caf::PdmFieldHandle* chang //-------------------------------------------------------------------------------------------------- void RimWellMeasurementCurve::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) { - RimPlotCurve::updateOptionSensitivity(); + RimPlotCurve::updateFieldUiState(); caf::PdmUiGroup* curveDataGroup = uiOrdering.addNewGroup( "Curve Data" ); curveDataGroup->add( &m_wellPath ); diff --git a/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathCollection.cpp b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathCollection.cpp index e5631a986a..bbf79d8702 100644 --- a/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathCollection.cpp @@ -305,16 +305,17 @@ void RimWellPathCollection::readAndAddWellPaths( std::vector& caf::ProgressInfo progress( wellPathArray.size(), "Reading well paths from file" ); std::vector wellPathsToGroup; - for ( size_t wpIdx = 0; wpIdx < wellPathArray.size(); wpIdx++ ) + for ( RimFileWellPath* wellPath : wellPathArray ) { - RimFileWellPath* wellPath = wellPathArray[wpIdx]; wellPath->readWellPathFile( nullptr, m_wellPathImporter.get(), true ); progress.setProgressDescription( QString( "Reading file %1" ).arg( wellPath->name() ) ); - // If a well path with this name exists already, make it read the well path file - RimFileWellPath* existingWellPath = dynamic_cast( tryFindMatchingWellPath( wellPath->name() ) ); - + // If a well path with this name exists already, make it read the well path file. This is useful if a well log + // file has been imported before a well path file containing the full geometry for the well path. + // NB! Do not use tryFindMatchingWellPath(), as this function will remove the prefix and will return an false + // match in many cases. + auto* existingWellPath = dynamic_cast( wellPathByName( wellPath->name() ) ); if ( existingWellPath ) { existingWellPath->setFilepath( wellPath->filePath() ); @@ -584,6 +585,8 @@ void RimWellPathCollection::deleteAllWellPaths() //-------------------------------------------------------------------------------------------------- void RimWellPathCollection::deleteWell( RimWellPath* wellPath ) { + removeWellPath( wellPath ); + m_wellPaths.removeChild( wellPath ); delete wellPath; } @@ -703,16 +706,18 @@ void RimWellPathCollection::reloadAllWellPathFormations() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimWellPathCollection::removeWellPath( gsl::not_null wellPath ) +void RimWellPathCollection::removeWellPath( gsl::not_null wellToRemove ) { - RimFileWellPath* fileWellPath = dynamic_cast( wellPath.get() ); - if ( fileWellPath ) + auto* fileWellToRemove = dynamic_cast( wellToRemove.get() ); + if ( fileWellToRemove ) { bool isFilePathUsed = false; - for ( auto wellPath : m_wellPaths ) + for ( const auto& well : m_wellPaths ) { - RimFileWellPath* fWPath = dynamic_cast( wellPath.p() ); - if ( fWPath && fWPath->filePath() == fileWellPath->filePath() ) + auto fileWell = dynamic_cast( well.p() ); + if ( fileWell == fileWellToRemove ) continue; + + if ( fileWell && fileWell->filePath() == fileWellToRemove->filePath() ) { isFilePathUsed = true; break; @@ -723,7 +728,7 @@ void RimWellPathCollection::removeWellPath( gsl::not_null wellPath { // One file can have multiple well paths // If no other well paths are referencing the filepath, remove cached data from the file reader - m_wellPathImporter->removeFilePath( fileWellPath->filePath() ); + m_wellPathImporter->removeFilePath( fileWellToRemove->filePath() ); } } updateAllRequiredEditors(); diff --git a/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGeometryDef.cpp b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGeometryDef.cpp index 7ff2ab11e4..9b37e0a525 100644 --- a/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGeometryDef.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGeometryDef.cpp @@ -99,6 +99,10 @@ RimWellPathGeometryDef::RimWellPathGeometryDef() m_autoTargetAtSeaLevel = new RimWellPathTarget; m_autoTargetAtSeaLevel->setEnabled( false ); + // Disable IO was introduced to avoid errors related to unstable location of well target at sea level. + // https://github.com/OPM/ResInsight/issues/9439 + m_autoTargetAtSeaLevel.xmlCapability()->disableIO(); + CAF_PDM_InitScriptableField( &m_isAttachedToParentWell, "AttachedToParentWell", false, "Attached to Parent Well" ); CAF_PDM_InitFieldNoDefault( &m_fixedWellPathPoints, "FixedWellPathPoints", "" ); CAF_PDM_InitFieldNoDefault( &m_fixedMeasuredDepths, "FixedMeasuredDepths", "" ); @@ -257,17 +261,28 @@ std::vector RimWellPathGeometryDef::createTargets( const std //-------------------------------------------------------------------------------------------------- cvf::ref RimWellPathGeometryDef::createWellPathGeometry() { - cvf::ref wellPathGeometry = new RigWellPath; + // User defined well targets can be updated from 3D view or from table. Always update location for well target at + // sea level. + updateTargetAtSeaLevel(); - if ( m_useAutoGeneratedTargetAtSeaLevel ) - { - updateTargetAtSeaLevel(); - } + double offsetMd = m_useAutoGeneratedTargetAtSeaLevel ? 0.0 : m_mdAtFirstTarget; + return createWellPathGeometry( m_useAutoGeneratedTargetAtSeaLevel, offsetMd, true ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::ref RimWellPathGeometryDef::createWellPathGeometry( bool useAutoGeneratedTargetAtSeaLevel, + double offsetMd, + bool updateTargets ) const +{ + cvf::ref wellPathGeometry = new RigWellPath; std::vector wellPathPoints = m_fixedWellPathPoints; std::vector measuredDepths = m_fixedMeasuredDepths; - RiaLineArcWellPathCalculator wellPathCalculator = lineArcWellPathCalculator(); + RiaLineArcWellPathCalculator wellPathCalculator = + lineArcWellPathCalculator( useAutoGeneratedTargetAtSeaLevel, updateTargets ); if ( wellPathCalculator.lineArcEndpoints().size() >= 2 ) { @@ -275,15 +290,11 @@ cvf::ref RimWellPathGeometryDef::createWellPathGeometry() auto [sampledWellPathPoints, sampledMeasuredDepths] = arcLineSampler.sampledPointsAndMDs( 30, false ); wellPathPoints.insert( wellPathPoints.end(), sampledWellPathPoints.begin(), sampledWellPathPoints.end() ); - double startMD = 0.0; + double startMD = offsetMd; if ( !measuredDepths.empty() ) { startMD = measuredDepths.back(); } - else if ( !m_useAutoGeneratedTargetAtSeaLevel ) - { - startMD = m_mdAtFirstTarget; - } for ( auto md : sampledMeasuredDepths ) { @@ -306,7 +317,8 @@ cvf::ref RimWellPathGeometryDef::createWellPathGeometry() //-------------------------------------------------------------------------------------------------- std::vector RimWellPathGeometryDef::wellPlan() const { - RiaLineArcWellPathCalculator wellPathCalculator = lineArcWellPathCalculator(); + RiaLineArcWellPathCalculator wellPathCalculator = + lineArcWellPathCalculator( m_useAutoGeneratedTargetAtSeaLevel, false ); RiaWellPlanCalculator wpCalc( wellPathCalculator.startTangent(), wellPathCalculator.lineArcEndpoints() ); @@ -517,21 +529,28 @@ void RimWellPathGeometryDef::fieldChangedByUi( const caf::PdmFieldHandle* change RimWellPathGeometryDefTools::updateLinkedGeometryDefinitions( linkedDefs, delta ); } } - else if ( changedField == &m_useAutoGeneratedTargetAtSeaLevel && !m_useAutoGeneratedTargetAtSeaLevel ) + else if ( changedField == &m_useAutoGeneratedTargetAtSeaLevel ) { - auto firstTarget = firstActiveTarget(); - if ( firstTarget != nullptr ) + updateTargetAtSeaLevel(); + + if ( !m_useAutoGeneratedTargetAtSeaLevel() ) { - auto firstLocationXYZ = firstTarget->targetPointXYZ() + anchorPointXyz(); + auto firstTarget = firstActiveTarget(); + if ( firstTarget != nullptr ) + { + auto firstLocationXYZ = firstTarget->targetPointXYZ() + anchorPointXyz(); - // Temporarily enable target at sea level to be able to create a complete geometry to find MD of first - // target of the complete geometry - m_useAutoGeneratedTargetAtSeaLevel = true; - auto wellPathGeo = createWellPathGeometry(); - m_useAutoGeneratedTargetAtSeaLevel = false; + // Temporarily enable target at sea level to be able to create a complete geometry to find MD of first + // target of the complete geometry + auto wellPathGeo = createWellPathGeometry( true, 0.0, false ); - double mdAtFirstTarget = wellPathGeo->closestMeasuredDepth( firstLocationXYZ ); - m_mdAtFirstTarget = mdAtFirstTarget; + double mdAtFirstTarget = wellPathGeo->closestMeasuredDepth( firstLocationXYZ ); + m_mdAtFirstTarget = mdAtFirstTarget; + } + } + else + { + m_mdAtFirstTarget = 0.0; } } @@ -584,10 +603,18 @@ void RimWellPathGeometryDef::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTre /// //-------------------------------------------------------------------------------------------------- std::vector RimWellPathGeometryDef::activeWellTargets() const +{ + return activeWellTargets( m_useAutoGeneratedTargetAtSeaLevel ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimWellPathGeometryDef::activeWellTargets( bool useAutoGeneratedTargetAtSeaLevel ) const { std::vector active; - if ( m_useAutoGeneratedTargetAtSeaLevel && !m_wellTargets.empty() && m_autoTargetAtSeaLevel ) + if ( useAutoGeneratedTargetAtSeaLevel && !m_wellTargets.empty() && m_autoTargetAtSeaLevel ) { active.push_back( m_autoTargetAtSeaLevel ); } @@ -606,12 +633,29 @@ std::vector RimWellPathGeometryDef::activeWellTargets() cons //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RiaLineArcWellPathCalculator RimWellPathGeometryDef::lineArcWellPathCalculator() const +RiaLineArcWellPathCalculator RimWellPathGeometryDef::lineArcWellPathCalculator( bool useAutoGeneratedTargetAtSeaLevel, + bool updateTargets ) const { - std::vector targetDatas; + std::vector activeTargets; - std::vector activeTargets = activeWellTargets(); + auto candidates = activeWellTargets( useAutoGeneratedTargetAtSeaLevel ); + if ( !candidates.empty() ) + { + activeTargets.push_back( candidates.front() ); + RimWellPathTarget* previousTarget = candidates.front(); + for ( size_t i = 1; i < candidates.size(); i++ ) + { + auto candidate = candidates[i]; + if ( previousTarget && ( previousTarget->targetPointXYZ() - candidate->targetPointXYZ() ).length() > 1e-3 ) + { + activeTargets.push_back( candidate ); + previousTarget = candidate; + } + } + } + + std::vector targetDatas; for ( auto wellTarget : activeTargets ) { targetDatas.push_back( wellTarget->wellTargetData() ); @@ -621,18 +665,21 @@ RiaLineArcWellPathCalculator RimWellPathGeometryDef::lineArcWellPathCalculator() const std::vector& targetStatuses = wellPathCalculator.targetStatuses(); - for ( size_t tIdx = 0; tIdx < activeTargets.size(); ++tIdx ) + if ( updateTargets ) { - activeTargets[tIdx]->setDerivedTangent( targetStatuses[tIdx].resultAzimuthRadians, - targetStatuses[tIdx].resultInclinationRadians ); + for ( size_t tIdx = 0; tIdx < activeTargets.size(); ++tIdx ) + { + activeTargets[tIdx]->setDerivedTangent( targetStatuses[tIdx].resultAzimuthRadians, + targetStatuses[tIdx].resultInclinationRadians ); - activeTargets[tIdx]->setRadius1Data( targetStatuses[tIdx].isRadius1Editable, - targetStatuses[tIdx].hasOverriddenRadius1, - targetStatuses[tIdx].resultRadius1 ); + activeTargets[tIdx]->setRadius1Data( targetStatuses[tIdx].isRadius1Editable, + targetStatuses[tIdx].hasOverriddenRadius1, + targetStatuses[tIdx].resultRadius1 ); - activeTargets[tIdx]->setRadius2Data( targetStatuses[tIdx].isRadius2Editable, - targetStatuses[tIdx].hasOverriddenRadius2, - targetStatuses[tIdx].resultRadius2 ); + activeTargets[tIdx]->setRadius2Data( targetStatuses[tIdx].isRadius2Editable, + targetStatuses[tIdx].hasOverriddenRadius2, + targetStatuses[tIdx].resultRadius2 ); + } } return wellPathCalculator; @@ -645,6 +692,12 @@ void RimWellPathGeometryDef::updateTargetAtSeaLevel() { if ( m_useAutoGeneratedTargetAtSeaLevel && !m_wellTargets.empty() ) { + // Update tangents for existing well targets without the target at sea level. + bool useAutoGeneratedTargetAtSeaLevel = false; + double offsetMd = 0.0; + bool updateTargets = true; + createWellPathGeometry( useAutoGeneratedTargetAtSeaLevel, offsetMd, updateTargets ); + cvf::Vec3d newPos = cvf::Vec3d::ZERO; auto firstTarget = m_wellTargets[0]; @@ -713,6 +766,7 @@ void RimWellPathGeometryDef::defineEditorAttribute( const caf::PdmFieldHandle* f if ( tvAttribute ) { tvAttribute->resizePolicy = caf::PdmUiTableViewEditorAttribute::RESIZE_TO_FIT_CONTENT; + tvAttribute->heightHint = 1000; if ( m_pickPointsEnabled ) { diff --git a/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGeometryDef.h b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGeometryDef.h index 772e7f44e1..5c9c190cab 100644 --- a/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGeometryDef.h +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGeometryDef.h @@ -95,6 +95,10 @@ class RimWellPathGeometryDef : public caf::PdmObject bool showAbsoluteCoordinates() const; protected: + std::vector activeWellTargets( bool useAutoGeneratedTargetAtSeaLevel ) const; + cvf::ref + createWellPathGeometry( bool useAutoGeneratedTargetAtSeaLevel, double offsetMd, bool updateTargets ) const; + void defineCustomContextMenu( const caf::PdmFieldHandle* fieldNeedingMenu, QMenu* menu, QWidget* fieldEditorWidget ) override; void defineEditorAttribute( const caf::PdmFieldHandle* field, @@ -113,7 +117,8 @@ class RimWellPathGeometryDef : public caf::PdmObject void initAfterRead() override; QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; - RiaLineArcWellPathCalculator lineArcWellPathCalculator() const; + RiaLineArcWellPathCalculator lineArcWellPathCalculator( bool useAutoGeneratedTargetAtSeaLevel, + bool updateTargets = true ) const; void updateTargetAtSeaLevel(); diff --git a/ApplicationLibCode/ProjectDataModelCommands/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModelCommands/CMakeLists_files.cmake index ce24800ff7..916ff188d5 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModelCommands/CMakeLists_files.cmake @@ -20,6 +20,8 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RimcModeledWellPath.h ${CMAKE_CURRENT_LIST_DIR}/RimcWellPath.h ${CMAKE_CURRENT_LIST_DIR}/RimcFractureTemplateCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimcFractureTemplate.h + ${CMAKE_CURRENT_LIST_DIR}/RimcThermalFractureTemplate.h ${CMAKE_CURRENT_LIST_DIR}/RimcIntersection.h ) @@ -45,6 +47,8 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RimcModeledWellPath.cpp ${CMAKE_CURRENT_LIST_DIR}/RimcWellPath.cpp ${CMAKE_CURRENT_LIST_DIR}/RimcFractureTemplateCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcFractureTemplate.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcThermalFractureTemplate.cpp ${CMAKE_CURRENT_LIST_DIR}/RimcIntersection.cpp ) diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcFractureTemplate.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcFractureTemplate.cpp new file mode 100644 index 0000000000..f54e44bda4 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcFractureTemplate.cpp @@ -0,0 +1,85 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022- Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#include "RimcFractureTemplate.h" + +#include "RiaLogging.h" + +#include "RimFractureTemplate.h" + +#include "cafPdmAbstractFieldScriptingCapability.h" +#include "cafPdmFieldScriptingCapability.h" + +CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimFractureTemplate, RimcFractureTemplate_setScaleFactors, "SetScaleFactors" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimcFractureTemplate_setScaleFactors::RimcFractureTemplate_setScaleFactors( caf::PdmObjectHandle* self ) + : caf::PdmObjectMethod( self ) +{ + CAF_PDM_InitObject( "Set Fracture Template Scale Factors", "", "", "Set Fracture Template Scale Factors." ); + CAF_PDM_InitScriptableField( &m_halfLength, "HalfLength", 1.0, "Half Length" ); + CAF_PDM_InitScriptableField( &m_height, "Height", 1.0, "Height" ); + CAF_PDM_InitScriptableField( &m_dFactor, "DFactor", 1.0, "D Factor" ); + CAF_PDM_InitScriptableField( &m_conductivity, "Conductivity", 1.0, "Conductivity" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmObjectHandle* RimcFractureTemplate_setScaleFactors::execute() +{ + if ( m_halfLength() <= 0.0 || m_height() <= 0.0 || m_dFactor() <= 0.0 || m_conductivity() <= 0.0 ) + { + RiaLogging::error( "Invalid scale factors." ); + return nullptr; + } + + RimFractureTemplate* fractureTemplate = self(); + if ( fractureTemplate ) + { + fractureTemplate->setScaleFactors( m_halfLength, m_height, m_dFactor, m_conductivity ); + fractureTemplate->loadDataAndUpdateGeometryHasChanged(); + } + + return nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimcFractureTemplate_setScaleFactors::resultIsPersistent() const +{ + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::unique_ptr RimcFractureTemplate_setScaleFactors::defaultResult() const +{ + return nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimcFractureTemplate_setScaleFactors::isNullptrValidResult() const +{ + return true; +} diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcFractureTemplate.h b/ApplicationLibCode/ProjectDataModelCommands/RimcFractureTemplate.h new file mode 100644 index 0000000000..373cb788c5 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcFractureTemplate.h @@ -0,0 +1,49 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2020- Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafPdmField.h" +#include "cafPdmObjectHandle.h" +#include "cafPdmObjectMethod.h" + +#include + +class RimFractureTemplate; + +//================================================================================================== +/// +//================================================================================================== +class RimcFractureTemplate_setScaleFactors : public caf::PdmObjectMethod +{ + CAF_PDM_HEADER_INIT; + +public: + RimcFractureTemplate_setScaleFactors( caf::PdmObjectHandle* self ); + + caf::PdmObjectHandle* execute() override; + bool resultIsPersistent() const override; + std::unique_ptr defaultResult() const override; + bool isNullptrValidResult() const override; + +private: + caf::PdmField m_halfLength; + caf::PdmField m_height; + caf::PdmField m_dFactor; + caf::PdmField m_conductivity; +}; diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcFractureTemplateCollection.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcFractureTemplateCollection.cpp index 66b7ce3816..11f3f15ad7 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/RimcFractureTemplateCollection.cpp +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcFractureTemplateCollection.cpp @@ -20,12 +20,13 @@ #include "FractureCommands/RicFractureNameGenerator.h" #include "FractureCommands/RicNewStimPlanFractureTemplateFeature.h" #include "FractureCommands/RicNewStimPlanModelFeature.h" +#include "FractureCommands/RicNewThermalFractureTemplateFeature.h" #include "RimEclipseCase.h" #include "RimFractureTemplate.h" - #include "RimFractureTemplateCollection.h" #include "RimStimPlanFractureTemplate.h" +#include "RimThermalFractureTemplate.h" #include "cafPdmAbstractFieldScriptingCapability.h" #include "cafPdmFieldScriptingCapability.h" @@ -78,3 +79,52 @@ std::unique_ptr RimcFractureTemplateCollection_appendFract { return std::unique_ptr( new RimStimPlanFractureTemplate ); } + +CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimFractureTemplateCollection, + RimcFractureTemplateCollection_appendThermalFractureTemplate, + "AppendThermalFractureTemplate" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimcFractureTemplateCollection_appendThermalFractureTemplate::RimcFractureTemplateCollection_appendThermalFractureTemplate( + caf::PdmObjectHandle* self ) + : caf::PdmObjectMethod( self ) +{ + CAF_PDM_InitObject( "Create Fracture Template", "", "", "Create a new Thermal Fracture Template" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_filePath, "FilePath", "", "", "", "File Path to Thermal Fracture CSV File" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmObjectHandle* RimcFractureTemplateCollection_appendThermalFractureTemplate::execute() +{ + RimFractureTemplateCollection* fractureTemplateCollection = self(); + + bool reuseExistingTemplatesWithMatchingNames = false; + auto newTemplates = + RicNewThermalFractureTemplateFeature::createNewTemplatesFromFiles( { m_filePath }, + reuseExistingTemplatesWithMatchingNames ); + + if ( newTemplates.empty() ) return nullptr; + + fractureTemplateCollection->updateAllRequiredEditors(); + return newTemplates[0]; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimcFractureTemplateCollection_appendThermalFractureTemplate::resultIsPersistent() const +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::unique_ptr RimcFractureTemplateCollection_appendThermalFractureTemplate::defaultResult() const +{ + return std::unique_ptr( new RimThermalFractureTemplate ); +} diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcFractureTemplateCollection.h b/ApplicationLibCode/ProjectDataModelCommands/RimcFractureTemplateCollection.h index 4cbdba71dc..30ed89b171 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/RimcFractureTemplateCollection.h +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcFractureTemplateCollection.h @@ -43,3 +43,21 @@ class RimcFractureTemplateCollection_appendFractureTemplate : public caf::PdmObj private: caf::PdmField m_filePath; }; + +//================================================================================================== +/// +//================================================================================================== +class RimcFractureTemplateCollection_appendThermalFractureTemplate : public caf::PdmObjectMethod +{ + CAF_PDM_HEADER_INIT; + +public: + RimcFractureTemplateCollection_appendThermalFractureTemplate( caf::PdmObjectHandle* self ); + + caf::PdmObjectHandle* execute() override; + bool resultIsPersistent() const override; + std::unique_ptr defaultResult() const override; + +private: + caf::PdmField m_filePath; +}; diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcSummaryPlotCollection.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcSummaryPlotCollection.cpp index 296508a476..8d5d136371 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/RimcSummaryPlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcSummaryPlotCollection.cpp @@ -25,6 +25,7 @@ #include "RiaTextStringTools.h" #include "RimSummaryCase.h" +#include "RimSummaryCaseCollection.h" #include "RimSummaryPlot.h" #include "RimSummaryPlotCollection.h" diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcSummaryPlotCollection.h b/ApplicationLibCode/ProjectDataModelCommands/RimcSummaryPlotCollection.h index f4f3abcafd..ab651749bd 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/RimcSummaryPlotCollection.h +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcSummaryPlotCollection.h @@ -18,9 +18,6 @@ #pragma once -#include "RimSummaryCaseCollection.h" -#include "RimSummaryPlotCollection.h" - #include "cafPdmField.h" #include "cafPdmObjectHandle.h" #include "cafPdmObjectMethod.h" @@ -33,6 +30,7 @@ class RimSummaryCase; class RimSummaryPlotCollection; +class RimSummaryCaseCollection; //================================================================================================== /// diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcThermalFractureTemplate.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcThermalFractureTemplate.cpp new file mode 100644 index 0000000000..6b3cebcf81 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcThermalFractureTemplate.cpp @@ -0,0 +1,124 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022- Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#include "RimcThermalFractureTemplate.h" + +#include "RifThermalFractureTemplateSurfaceExporter.h" + +#include "RimThermalFractureTemplate.h" + +#include "RimcDataContainerString.h" + +#include "cafPdmAbstractFieldScriptingCapability.h" +#include "cafPdmFieldScriptingCapability.h" + +CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimThermalFractureTemplate, RimcThermalFractureTemplate_exportToFile, "ExportToFile" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimcThermalFractureTemplate_exportToFile::RimcThermalFractureTemplate_exportToFile( caf::PdmObjectHandle* self ) + : caf::PdmObjectMethod( self ) +{ + CAF_PDM_InitObject( "Export Thermal Fracture Template", "", "", "Export Thermal Fracture Template to File" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_filePath, "FilePath", "", "", "", "File Path" ); + CAF_PDM_InitScriptableField( &m_timeStep, "TimeStep", 0, "Time Step" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmObjectHandle* RimcThermalFractureTemplate_exportToFile::execute() +{ + RimThermalFractureTemplate* thermalFracture = self(); + if ( thermalFracture && thermalFracture->fractureDefinition() ) + RifThermalFractureTemplateSurfaceExporter::writeToFile( thermalFracture, m_timeStep(), m_filePath() ); + return nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimcThermalFractureTemplate_exportToFile::resultIsPersistent() const +{ + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::unique_ptr RimcThermalFractureTemplate_exportToFile::defaultResult() const +{ + return std::unique_ptr( new RimThermalFractureTemplate ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimcThermalFractureTemplate_exportToFile::isNullptrValidResult() const +{ + return true; +} + +CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimThermalFractureTemplate, RimcThermalFractureTemplate_timeSteps, "TimeSteps" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimcThermalFractureTemplate_timeSteps::RimcThermalFractureTemplate_timeSteps( caf::PdmObjectHandle* self ) + : caf::PdmObjectMethod( self ) +{ + CAF_PDM_InitObject( "Get Thermal Fracture Template Time Steps", "", "", "Get Thermal Fracture Template Time Steps" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmObjectHandle* RimcThermalFractureTemplate_timeSteps::execute() +{ + RimThermalFractureTemplate* thermalFracture = self(); + auto timeSteps = thermalFracture->timeStepsStrings(); + + auto dataObject = new RimcDataContainerString; + dataObject->m_stringValues = timeSteps; + + return dataObject; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimcThermalFractureTemplate_timeSteps::resultIsPersistent() const +{ + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::unique_ptr RimcThermalFractureTemplate_timeSteps::defaultResult() const +{ + return std::unique_ptr( new RimcDataContainerString ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimcThermalFractureTemplate_timeSteps::isNullptrValidResult() const +{ + return true; +} diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcThermalFractureTemplate.h b/ApplicationLibCode/ProjectDataModelCommands/RimcThermalFractureTemplate.h new file mode 100644 index 0000000000..172a2a2dc5 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcThermalFractureTemplate.h @@ -0,0 +1,64 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2020- Equinor ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafPdmField.h" +#include "cafPdmObjectHandle.h" +#include "cafPdmObjectMethod.h" +#include "cafPdmPtrField.h" + +#include + +class RimThermalFractureTemplate; + +//================================================================================================== +/// +//================================================================================================== +class RimcThermalFractureTemplate_exportToFile : public caf::PdmObjectMethod +{ + CAF_PDM_HEADER_INIT; + +public: + RimcThermalFractureTemplate_exportToFile( caf::PdmObjectHandle* self ); + + caf::PdmObjectHandle* execute() override; + bool resultIsPersistent() const override; + std::unique_ptr defaultResult() const override; + bool isNullptrValidResult() const override; + +private: + caf::PdmField m_filePath; + caf::PdmField m_timeStep; +}; + +//================================================================================================== +/// +//================================================================================================== +class RimcThermalFractureTemplate_timeSteps : public caf::PdmObjectMethod +{ + CAF_PDM_HEADER_INIT; + +public: + RimcThermalFractureTemplate_timeSteps( caf::PdmObjectHandle* self ); + + caf::PdmObjectHandle* execute() override; + bool resultIsPersistent() const override; + std::unique_ptr defaultResult() const override; + bool isNullptrValidResult() const override; +}; diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcWellPath.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcWellPath.cpp index d58155fa7e..a6905d0809 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/RimcWellPath.cpp +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcWellPath.cpp @@ -18,6 +18,7 @@ #include "RimcWellPath.h" +#include "FractureCommands/RicPlaceThermalFractureUsingTemplateDataFeature.h" #include "RiaLogging.h" #include "RimEclipseCase.h" @@ -26,6 +27,7 @@ #include "RimPerforationInterval.h" #include "RimStimPlanFractureTemplate.h" #include "RimStimPlanModel.h" +#include "RimThermalFractureTemplate.h" #include "RimTools.h" #include "RimWellPath.h" #include "RimWellPathCollection.h" @@ -123,6 +125,59 @@ std::unique_ptr RimcWellPath_addFracture::defaultResult() return std::unique_ptr( new RimWellPathFracture ); } +CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimWellPath, RimcWellPath_addThermalFracture, "AddThermalFracture" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimcWellPath_addThermalFracture::RimcWellPath_addThermalFracture( caf::PdmObjectHandle* self ) + : caf::PdmObjectMethod( self ) +{ + CAF_PDM_InitObject( "Add Thermal Fracture", "", "", "Add Thermal Fracture" ); + + CAF_PDM_InitScriptableField( &m_md, "MeasuredDepth", 0.0, "Measured Depth" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_fractureTemplate, "FractureTemplate", "", "", "", "Thermal Fracture Template" ); + CAF_PDM_InitScriptableField( &m_placeUsingTemplateData, "PlaceUsingTemplateData", true, "Place using template data" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmObjectHandle* RimcWellPath_addThermalFracture::execute() +{ + auto wellPath = self(); + + RimWellPathFracture* wellPathFracture = RicNewWellPathFractureFeature::addFracture( wellPath, m_md() ); + + if ( m_fractureTemplate ) + { + wellPathFracture->setFractureTemplate( m_fractureTemplate() ); + } + + if ( m_placeUsingTemplateData ) + { + RicPlaceThermalFractureUsingTemplateDataFeature::placeUsingTemplateData( wellPathFracture ); + } + + return wellPathFracture; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimcWellPath_addThermalFracture::resultIsPersistent() const +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::unique_ptr RimcWellPath_addThermalFracture::defaultResult() const +{ + return std::unique_ptr( new RimWellPathFracture ); +} + CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimWellPath, RimcWellPath_appendPerforationInterval, "AppendPerforationInterval" ); //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcWellPath.h b/ApplicationLibCode/ProjectDataModelCommands/RimcWellPath.h index f0e2acdc51..bf82d0b9ed 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/RimcWellPath.h +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcWellPath.h @@ -26,6 +26,7 @@ #include class RimStimPlanFractureTemplate; +class RimThermalFractureTemplate; class RimEclipseCase; //================================================================================================== @@ -49,6 +50,26 @@ class RimcWellPath_addFracture : public caf::PdmObjectMethod caf::PdmPtrField m_eclipseCase; }; +//================================================================================================== +/// +//================================================================================================== +class RimcWellPath_addThermalFracture : public caf::PdmObjectMethod +{ + CAF_PDM_HEADER_INIT; + +public: + RimcWellPath_addThermalFracture( caf::PdmObjectHandle* self ); + + caf::PdmObjectHandle* execute() override; + bool resultIsPersistent() const override; + std::unique_ptr defaultResult() const override; + +private: + caf::PdmPtrField m_fractureTemplate; + caf::PdmField m_md; + caf::PdmField m_placeUsingTemplateData; +}; + //================================================================================================== /// //================================================================================================== diff --git a/ApplicationLibCode/ReservoirDataModel/Completions/CMakeLists_files.cmake b/ApplicationLibCode/ReservoirDataModel/Completions/CMakeLists_files.cmake index b4ba15d3d4..c11644d6c9 100644 --- a/ApplicationLibCode/ReservoirDataModel/Completions/CMakeLists_files.cmake +++ b/ApplicationLibCode/ReservoirDataModel/Completions/CMakeLists_files.cmake @@ -2,6 +2,7 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RigCompletionData.h ${CMAKE_CURRENT_LIST_DIR}/RigCompletionDataGridCell.h ${CMAKE_CURRENT_LIST_DIR}/RigEclipseToStimPlanCellTransmissibilityCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseToThermalCellTransmissibilityCalculator.h ${CMAKE_CURRENT_LIST_DIR}/RigTransmissibilityCondenser.h ${CMAKE_CURRENT_LIST_DIR}/RigFractureTransmissibilityEquations.h ${CMAKE_CURRENT_LIST_DIR}/RigWellPathStimplanIntersector.h @@ -14,6 +15,7 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RigCompletionData.cpp ${CMAKE_CURRENT_LIST_DIR}/RigCompletionDataGridCell.cpp ${CMAKE_CURRENT_LIST_DIR}/RigEclipseToStimPlanCellTransmissibilityCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseToThermalCellTransmissibilityCalculator.cpp ${CMAKE_CURRENT_LIST_DIR}/RigTransmissibilityCondenser.cpp ${CMAKE_CURRENT_LIST_DIR}/RigFractureTransmissibilityEquations.cpp ${CMAKE_CURRENT_LIST_DIR}/RigWellPathStimplanIntersector.cpp diff --git a/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToStimPlanCalculator.cpp b/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToStimPlanCalculator.cpp index 19adef628f..8c14199fec 100644 --- a/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToStimPlanCalculator.cpp +++ b/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToStimPlanCalculator.cpp @@ -19,25 +19,30 @@ #include "RigEclipseToStimPlanCalculator.h" #include "RiaLogging.h" +#include "RiaThermalFractureDefines.h" +#include "RiaWeightedMeanCalculator.h" #include "RigActiveCellInfo.h" #include "RigCaseCellResultsData.h" #include "RigCellGeometryTools.h" #include "RigEclipseCaseData.h" +#include "RigEclipseToStimPlanCellTransmissibilityCalculator.h" +#include "RigEclipseToThermalCellTransmissibilityCalculator.h" #include "RigFractureCell.h" #include "RigFractureGrid.h" #include "RigFractureTransmissibilityEquations.h" #include "RigHexIntersectionTools.h" #include "RigMainGrid.h" #include "RigResultAccessorFactory.h" +#include "RigThermalFractureDefinition.h" #include "RigTransmissibilityCondenser.h" -#include "RiaWeightedMeanCalculator.h" #include "RimEclipseCase.h" #include "RimEllipseFractureTemplate.h" #include "RimFracture.h" #include "RimFractureContainmentTools.h" -#include "RimStimPlanFractureTemplate.h" +#include "RimMeshFractureTemplate.h" +#include "RimThermalFractureTemplate.h" //-------------------------------------------------------------------------------------------------- /// @@ -66,25 +71,104 @@ void RigEclipseToStimPlanCalculator::computeValues() auto reservoirCellIndicesOpenForFlow = RimFractureContainmentTools::reservoirCellIndicesOpenForFlow( m_case, m_fracture ); + auto resultValueAtIJ = + []( const std::vector>& values, const RigFractureGrid& fractureGrid, size_t i, size_t j ) { + if ( values.empty() ) return HUGE_VAL; + + size_t adjustedI = i + 1; + size_t adjustedJ = j + 1; + + if ( adjustedI >= fractureGrid.iCellCount() + 1 || adjustedJ >= fractureGrid.jCellCount() + 1 ) + return HUGE_VAL; + + return values[adjustedJ][adjustedI]; + }; + + std::vector> injectivityFactors; + std::vector> viscosities; + std::vector> filterCakeMobilities; + + RimThermalFractureTemplate* thermalFractureTemplate = + dynamic_cast( m_fracture->fractureTemplate() ); + + if ( thermalFractureTemplate != nullptr ) + { + auto unitSystem = thermalFractureTemplate->fractureDefinition()->unitSystem(); + size_t timeStep = thermalFractureTemplate->activeTimeStepIndex(); + + injectivityFactors = + thermalFractureTemplate + ->resultValues( RiaDefines::injectivityFactorResultName(), + RiaDefines::getExpectedThermalFractureUnit( RiaDefines::injectivityFactorResultName(), + unitSystem ), + + timeStep ); + + viscosities = thermalFractureTemplate + ->resultValues( RiaDefines::viscosityResultName(), + RiaDefines::getExpectedThermalFractureUnit( RiaDefines::viscosityResultName(), + unitSystem ), + timeStep ); + + filterCakeMobilities = + thermalFractureTemplate + ->resultValues( RiaDefines::filterCakeMobilityResultName(), + RiaDefines::getExpectedThermalFractureUnit( RiaDefines::filterCakeMobilityResultName(), + unitSystem ), + timeStep ); + } + for ( size_t i = 0; i < m_fractureGrid.fractureCells().size(); i++ ) { const RigFractureCell& fractureCell = m_fractureGrid.fractureCells()[i]; if ( !fractureCell.hasNonZeroConductivity() ) continue; - RigEclipseToStimPlanCellTransmissibilityCalculator eclToFractureTransCalc( m_case, - m_fractureTransform, - m_fractureSkinFactor, - m_cDarcy, - fractureCell, - reservoirCellIndicesOpenForFlow, - m_fracture ); + std::unique_ptr eclToFractureTransCalc; + if ( thermalFractureTemplate != nullptr ) + { + size_t cellI = fractureCell.getI(); + size_t cellJ = fractureCell.getJ(); + + double injectivityFactor = resultValueAtIJ( injectivityFactors, m_fractureGrid, cellI, cellJ ); + double viscosity = resultValueAtIJ( viscosities, m_fractureGrid, cellI, cellJ ); + double filterCakeMobility = resultValueAtIJ( filterCakeMobilities, m_fractureGrid, cellI, cellJ ); + + // Assumed value + double relativePermeability = 1.0; + + auto filterPressureDropType = thermalFractureTemplate->filterCakePressureDropType(); + eclToFractureTransCalc = + std::make_unique( m_case, + m_fractureTransform, + m_fractureSkinFactor, + m_cDarcy, + fractureCell, + m_fracture, + filterPressureDropType, + injectivityFactor, + filterCakeMobility, + viscosity, + relativePermeability ); + } + else + { + eclToFractureTransCalc = + std::make_unique( m_case, + m_fractureTransform, + m_fractureSkinFactor, + m_cDarcy, + fractureCell, + m_fracture ); + } + + eclToFractureTransCalc->computeValues( reservoirCellIndicesOpenForFlow ); const std::vector& fractureCellContributingEclipseCells = - eclToFractureTransCalc.globalIndiciesToContributingEclipseCells(); + eclToFractureTransCalc->globalIndiciesToContributingEclipseCells(); if ( !fractureCellContributingEclipseCells.empty() ) { - m_singleFractureCellCalculators.emplace( i, eclToFractureTransCalc ); + m_singleFractureCellCalculators.emplace( i, std::move( eclToFractureTransCalc ) ); } } } @@ -100,10 +184,10 @@ void RigEclipseToStimPlanCalculator::appendDataToTransmissibilityCondenser( bool for ( const auto& eclToFractureTransCalc : m_singleFractureCellCalculators ) { const std::vector& fractureCellContributingEclipseCells = - eclToFractureTransCalc.second.globalIndiciesToContributingEclipseCells(); + eclToFractureTransCalc.second->globalIndiciesToContributingEclipseCells(); const std::vector& fractureCellContributingEclipseCellTransmissibilities = - eclToFractureTransCalc.second.contributingEclipseCellTransmissibilities(); + eclToFractureTransCalc.second->contributingEclipseCellTransmissibilities(); size_t stimPlanCellIndex = eclToFractureTransCalc.first; @@ -138,7 +222,7 @@ double RigEclipseToStimPlanCalculator::totalEclipseAreaOpenForFlow() const for ( const auto& singleCellCalc : m_singleFractureCellCalculators ) { - double cellArea = singleCellCalc.second.areaOpenForFlow(); + double cellArea = singleCellCalc.second->areaOpenForFlow(); area += cellArea; } @@ -153,20 +237,16 @@ double RigEclipseToStimPlanCalculator::areaWeightedMatrixPermeability() const { RiaWeightedMeanCalculator calc; + for ( const auto& singleCellCalc : m_singleFractureCellCalculators ) { - for ( const auto& singleCellCalc : m_singleFractureCellCalculators ) - { - const RigEclipseToStimPlanCellTransmissibilityCalculator& calulator = singleCellCalc.second; - - const std::vector& areas = calulator.contributingEclipseCellIntersectionAreas(); - const std::vector& permeabilities = calulator.contributingEclipseCellPermeabilities(); + const std::vector& areas = singleCellCalc.second->contributingEclipseCellIntersectionAreas(); + const std::vector& permeabilities = singleCellCalc.second->contributingEclipseCellPermeabilities(); - if ( areas.size() == permeabilities.size() ) + if ( areas.size() == permeabilities.size() ) + { + for ( size_t i = 0; i < areas.size(); i++ ) { - for ( size_t i = 0; i < areas.size(); i++ ) - { - calc.addValueAndWeight( permeabilities[i], areas[i] ); - } + calc.addValueAndWeight( permeabilities[i], areas[i] ); } } } @@ -187,7 +267,7 @@ double RigEclipseToStimPlanCalculator::areaWeightedWidth() const width = ellipseFractureTemplate->width(); } - auto stimPlanFractureTemplate = dynamic_cast( m_fracture->fractureTemplate() ); + auto stimPlanFractureTemplate = dynamic_cast( m_fracture->fractureTemplate() ); if ( stimPlanFractureTemplate ) { auto widthValues = stimPlanFractureTemplate->widthResultValues(); @@ -197,12 +277,15 @@ double RigEclipseToStimPlanCalculator::areaWeightedWidth() const for ( const auto& singleCellCalc : m_singleFractureCellCalculators ) { - double cellArea = singleCellCalc.second.areaOpenForFlow(); + double cellArea = singleCellCalc.second->areaOpenForFlow(); size_t globalStimPlanCellIndex = singleCellCalc.first; double widthValue = widthValues[globalStimPlanCellIndex]; - calc.addValueAndWeight( widthValue, cellArea ); + if ( !std::isinf( widthValue ) && !std::isnan( widthValue ) ) + { + calc.addValueAndWeight( widthValue, cellArea ); + } } width = calc.weightedMean(); @@ -225,9 +308,13 @@ double RigEclipseToStimPlanCalculator::areaWeightedConductivity() const for ( const auto& singleCellCalc : m_singleFractureCellCalculators ) { - double cellArea = singleCellCalc.second.areaOpenForFlow(); + double cellArea = singleCellCalc.second->areaOpenForFlow(); - calc.addValueAndWeight( singleCellCalc.second.fractureCell().getConductivityValue(), cellArea ); + double conductivity = singleCellCalc.second->fractureCell().getConductivityValue(); + if ( !std::isinf( conductivity ) && !std::isnan( conductivity ) ) + { + calc.addValueAndWeight( conductivity, cellArea ); + } } return calc.validAggregatedWeight() ? calc.weightedMean() : 0.0; @@ -253,7 +340,7 @@ double RigEclipseToStimPlanCalculator::longestYSectionOpenForFlow() const auto calculatorForCell = m_singleFractureCellCalculators.find( globalStimPlanCellIndex ); if ( calculatorForCell != m_singleFractureCellCalculators.end() ) { - currentAggregatedDistanceY += calculatorForCell->second.fractureCell().cellSizeZ(); + currentAggregatedDistanceY += calculatorForCell->second->fractureCell().cellSizeZ(); } else { diff --git a/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToStimPlanCalculator.h b/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToStimPlanCalculator.h index f8d5d7664f..f45d6cb083 100644 --- a/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToStimPlanCalculator.h +++ b/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToStimPlanCalculator.h @@ -25,6 +25,7 @@ #include "cvfMatrix4.h" #include +#include class QString; @@ -69,5 +70,5 @@ class RigEclipseToStimPlanCalculator cvf::Mat4d m_fractureTransform; const RigFractureGrid& m_fractureGrid; - std::map m_singleFractureCellCalculators; + std::map> m_singleFractureCellCalculators; }; diff --git a/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToStimPlanCellTransmissibilityCalculator.cpp b/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToStimPlanCellTransmissibilityCalculator.cpp index d944a05f75..23989fd2a3 100644 --- a/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToStimPlanCellTransmissibilityCalculator.cpp +++ b/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToStimPlanCellTransmissibilityCalculator.cpp @@ -39,19 +39,22 @@ /// //-------------------------------------------------------------------------------------------------- RigEclipseToStimPlanCellTransmissibilityCalculator::RigEclipseToStimPlanCellTransmissibilityCalculator( - const RimEclipseCase* caseToApply, - cvf::Mat4d fractureTransform, - double skinFactor, - double cDarcy, - const RigFractureCell& stimPlanCell, - const std::set& reservoirCellIndicesOpenForFlow, - const RimFracture* fracture ) + const RimEclipseCase* caseToApply, + cvf::Mat4d fractureTransform, + double skinFactor, + double cDarcy, + const RigFractureCell& stimPlanCell, + const RimFracture* fracture ) : m_case( caseToApply ) , m_fractureTransform( fractureTransform ) , m_fractureSkinFactor( skinFactor ) , m_cDarcy( cDarcy ) , m_stimPlanCell( stimPlanCell ) , m_fracture( fracture ) +{ +} + +void RigEclipseToStimPlanCellTransmissibilityCalculator::computeValues( const std::set& reservoirCellIndicesOpenForFlow ) { calculateStimPlanCellsMatrixTransmissibility( reservoirCellIndicesOpenForFlow ); } @@ -146,7 +149,7 @@ void RigEclipseToStimPlanCellTransmissibilityCalculator::calculateStimPlanCellsM const std::set& reservoirCellIndicesOpenForFlow ) { // Not calculating flow into fracture if stimPlan cell cond value is 0 (assumed to be outside the fracture): - if ( m_stimPlanCell.getConductivityValue() < 1e-7 ) return; + if ( m_stimPlanCell.getConductivityValue() < 1e-7 || std::isinf( m_stimPlanCell.getConductivityValue() ) ) return; const RigEclipseCaseData* eclipseCaseData = m_case->eclipseCaseData(); @@ -328,8 +331,8 @@ void RigEclipseToStimPlanCellTransmissibilityCalculator::calculateStimPlanCellsM fractureAreaWeightedlength, m_cDarcy ); - transmissibility = sqrt( transmissibility_X * transmissibility_X + transmissibility_Y * transmissibility_Y + - transmissibility_Z * transmissibility_Z ); + cvf::Vec3d transmissibilityVector( transmissibility_X, transmissibility_Y, transmissibility_Z ); + transmissibility = calculateTransmissibility( transmissibilityVector, fractureArea ); matrixPermeability = RigFractureTransmissibilityEquations::matrixPermeability( permX, permY, NTG ); } @@ -390,3 +393,12 @@ cvf::ref 0, RigEclipseResultAddress( uiResultName ) ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RigEclipseToStimPlanCellTransmissibilityCalculator::calculateTransmissibility( const cvf::Vec3d& transmissibilityVector, + double fractureArea ) +{ + return transmissibilityVector.length(); +} diff --git a/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToStimPlanCellTransmissibilityCalculator.h b/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToStimPlanCellTransmissibilityCalculator.h index 2a612149cd..0d5e792945 100644 --- a/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToStimPlanCellTransmissibilityCalculator.h +++ b/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToStimPlanCellTransmissibilityCalculator.h @@ -42,13 +42,13 @@ class RimFracture; class RigEclipseToStimPlanCellTransmissibilityCalculator { public: - explicit RigEclipseToStimPlanCellTransmissibilityCalculator( const RimEclipseCase* caseToApply, - cvf::Mat4d fractureTransform, - double skinFactor, - double cDarcy, - const RigFractureCell& stimPlanCell, - const std::set& reservoirCellIndicesOpenForFlow, - const RimFracture* fracture ); + explicit RigEclipseToStimPlanCellTransmissibilityCalculator( const RimEclipseCase* caseToApply, + cvf::Mat4d fractureTransform, + double skinFactor, + double cDarcy, + const RigFractureCell& stimPlanCell, + const RimFracture* fracture ); + void computeValues( const std::set& reservoirCellIndicesOpenForFlow ); // These three vectors have the same size const std::vector& globalIndiciesToContributingEclipseCells() const; @@ -65,12 +65,14 @@ class RigEclipseToStimPlanCellTransmissibilityCalculator private: void calculateStimPlanCellsMatrixTransmissibility( const std::set& reservoirCellIndicesOpenForFlow ); + virtual double calculateTransmissibility( const cvf::Vec3d& transmissibilityVector, double fractureArea ); + std::vector getPotentiallyFracturedCellsForPolygon( const std::vector& polygon ) const; static cvf::ref createResultAccessor( const RimEclipseCase* eclipseCase, const QString& uiResultName ); -private: +protected: const RimEclipseCase* m_case; const RimFracture* m_fracture; diff --git a/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToThermalCellTransmissibilityCalculator.cpp b/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToThermalCellTransmissibilityCalculator.cpp new file mode 100644 index 0000000000..f8fb421bf4 --- /dev/null +++ b/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToThermalCellTransmissibilityCalculator.cpp @@ -0,0 +1,74 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022 Statoil ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RigEclipseToThermalCellTransmissibilityCalculator.h" + +#include "RimEclipseCase.h" +#include "RimFracture.h" +#include "RimThermalFractureTemplate.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RigEclipseToThermalCellTransmissibilityCalculator::RigEclipseToThermalCellTransmissibilityCalculator( + const RimEclipseCase* caseToApply, + cvf::Mat4d fractureTransform, + double skinFactor, + double cDarcy, + const RigFractureCell& stimPlanCell, + const RimFracture* fracture, + RimThermalFractureTemplate::FilterCakePressureDrop filterCakePressureDrop, + double injectivityFactor, + double filterCakeMobility, + double viscosity, + double relativePermeability ) + : RigEclipseToStimPlanCellTransmissibilityCalculator( caseToApply, fractureTransform, skinFactor, cDarcy, stimPlanCell, fracture ) + , m_filterCakePressureDrop( filterCakePressureDrop ) + , m_injectivityFactor( injectivityFactor ) + , m_filterCakeMobility( filterCakeMobility ) + , m_viscosity( viscosity ) + , m_relativePermeability( relativePermeability ) +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RigEclipseToThermalCellTransmissibilityCalculator::calculateTransmissibility( const cvf::Vec3d& transmissibilityVector, + double fractureArea ) +{ + double fractureMatrixTransimissibility = transmissibilityVector.length(); + + if ( m_filterCakePressureDrop == RimThermalFractureTemplate::FilterCakePressureDrop::RELATIVE ) + { + return m_injectivityFactor * fractureMatrixTransimissibility; + } + else if ( m_filterCakePressureDrop == RimThermalFractureTemplate::FilterCakePressureDrop::ABSOLUTE ) + { + double filterCakeTransmissibility = ( m_viscosity / m_relativePermeability ) * fractureArea * m_filterCakeMobility; + + // Harmonic mean + return ( fractureMatrixTransimissibility * filterCakeTransmissibility ) / + ( fractureMatrixTransimissibility + filterCakeTransmissibility ); + } + else + { + CAF_ASSERT( m_filterCakePressureDrop == RimThermalFractureTemplate::FilterCakePressureDrop::NONE ); + return fractureMatrixTransimissibility; + } +} diff --git a/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToThermalCellTransmissibilityCalculator.h b/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToThermalCellTransmissibilityCalculator.h new file mode 100644 index 0000000000..9554167baf --- /dev/null +++ b/ApplicationLibCode/ReservoirDataModel/Completions/RigEclipseToThermalCellTransmissibilityCalculator.h @@ -0,0 +1,68 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2022 Statoil ASA +// +// ResInsight 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 3 of the License, or +// (at your option) any later version. +// +// ResInsight 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 at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RigEclipseToStimPlanCellTransmissibilityCalculator.h" + +#include "cvfMatrix4.h" +#include "cvfObject.h" + +#include "RimThermalFractureTemplate.h" + +#include + +class QString; + +class RimEclipseCase; +class RigFractureCell; +class RigResultAccessor; +class RimFracture; + +//================================================================================================== +/// +/// Calculator used to compute the intersection areas between one Thermal RigFractureCell and Eclipse cells +/// Both active and inactive Eclipse cells are included. The transmissibility value for inactive cells are set to zero. +/// Eclipse reservoir cells open for flow is defined by reservoirCellIndicesOpenForFlow +/// +//================================================================================================== +class RigEclipseToThermalCellTransmissibilityCalculator : public RigEclipseToStimPlanCellTransmissibilityCalculator +{ +public: + explicit RigEclipseToThermalCellTransmissibilityCalculator( + const RimEclipseCase* caseToApply, + cvf::Mat4d fractureTransform, + double skinFactor, + double cDarcy, + const RigFractureCell& stimPlanCell, + const RimFracture* fracture, + RimThermalFractureTemplate::FilterCakePressureDrop filterCakePressureDrop, + double injectvityFactor, + double filterCakeMobility, + double viscosity, + double relativePermeability ); + +protected: + double calculateTransmissibility( const cvf::Vec3d& transmissibilityVector, double fractureArea ) override; + + RimThermalFractureTemplate::FilterCakePressureDrop m_filterCakePressureDrop; + double m_injectivityFactor; + double m_filterCakeMobility; + double m_viscosity; + double m_relativePermeability; +}; diff --git a/ApplicationLibCode/ReservoirDataModel/Completions/RigWellPathStimplanIntersector.cpp b/ApplicationLibCode/ReservoirDataModel/Completions/RigWellPathStimplanIntersector.cpp index 91603d2c64..db10f46f4b 100644 --- a/ApplicationLibCode/ReservoirDataModel/Completions/RigWellPathStimplanIntersector.cpp +++ b/ApplicationLibCode/ReservoirDataModel/Completions/RigWellPathStimplanIntersector.cpp @@ -36,11 +36,9 @@ //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RigWellPathStimplanIntersector::RigWellPathStimplanIntersector( gsl::not_null wellPathGeom, +RigWellPathStimplanIntersector::RigWellPathStimplanIntersector( const std::vector& wellPathPoints, gsl::not_null rimFracture ) { - std::vector wellPathPoints = - wellPathGeom->wellPathPointsIncludingInterpolatedIntersectionPoint( rimFracture->fractureMD() ); cvf::Mat4d fractureXf = rimFracture->transformMatrix(); double wellRadius = rimFracture->wellRadius(); diff --git a/ApplicationLibCode/ReservoirDataModel/Completions/RigWellPathStimplanIntersector.h b/ApplicationLibCode/ReservoirDataModel/Completions/RigWellPathStimplanIntersector.h index 2a83b24038..b0012cb68f 100644 --- a/ApplicationLibCode/ReservoirDataModel/Completions/RigWellPathStimplanIntersector.h +++ b/ApplicationLibCode/ReservoirDataModel/Completions/RigWellPathStimplanIntersector.h @@ -50,7 +50,7 @@ class RigWellPathStimplanIntersector double computeLength() const { return cvf::Math::sqrt( hlength * hlength + vlength * vlength ); } }; - RigWellPathStimplanIntersector( gsl::not_null wellpathGeom, + RigWellPathStimplanIntersector( const std::vector& wellPathPoints, gsl::not_null rimFracture ); const std::map& intersections() const; diff --git a/ApplicationLibCode/ReservoirDataModel/RigActiveCellInfo.cpp b/ApplicationLibCode/ReservoirDataModel/RigActiveCellInfo.cpp index 7fffd23c2c..1bad2eca98 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigActiveCellInfo.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigActiveCellInfo.cpp @@ -141,10 +141,11 @@ void RigActiveCellInfo::IJKBoundingBox( cvf::Vec3st& min, cvf::Vec3st& max ) con //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RigActiveCellInfo::gridActiveCellCounts( size_t gridIndex, size_t& activeCellCount ) const +size_t RigActiveCellInfo::gridActiveCellCounts( size_t gridIndex ) const { - activeCellCount = m_perGridActiveCellInfo[gridIndex].activeCellCount(); + return m_perGridActiveCellInfo[gridIndex].activeCellCount(); } + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ReservoirDataModel/RigActiveCellInfo.h b/ApplicationLibCode/ReservoirDataModel/RigActiveCellInfo.h index d13c319614..3489cfc0a1 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigActiveCellInfo.h +++ b/ApplicationLibCode/ReservoirDataModel/RigActiveCellInfo.h @@ -39,10 +39,10 @@ class RigActiveCellInfo : public cvf::Object size_t cellResultIndex( size_t reservoirCellIndex ) const; void setCellResultIndex( size_t reservoirCellIndex, size_t globalResultCellIndex ); - void setGridCount( size_t gridCount ); - void setGridActiveCellCounts( size_t gridIndex, size_t activeCellCount ); - void gridActiveCellCounts( size_t gridIndex, size_t& activeCellCount ) const; - void computeDerivedData(); + void setGridCount( size_t gridCount ); + void setGridActiveCellCounts( size_t gridIndex, size_t activeCellCount ); + size_t gridActiveCellCounts( size_t gridIndex ) const; + void computeDerivedData(); void setIJKBoundingBox( const cvf::Vec3st& min, const cvf::Vec3st& max ); void IJKBoundingBox( cvf::Vec3st& min, cvf::Vec3st& max ) const; diff --git a/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.cpp b/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.cpp index 99c5d87e96..526a015c2d 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.cpp @@ -28,6 +28,7 @@ #include "RiaResultNames.h" #include "RigAllanDiagramData.h" #include "RigCaseCellResultCalculator.h" +#include "RigEclipseAllanFaultsStatCalc.h" #include "RigEclipseCaseData.h" #include "RigEclipseMultiPropertyStatCalc.h" #include "RigEclipseNativeStatCalc.h" @@ -39,6 +40,8 @@ #include "RimCompletionCellIntersectionCalc.h" #include "RimEclipseCase.h" +#include "RimGridCalculation.h" +#include "RimGridCalculationCollection.h" #include "RimProject.h" #include "RifReaderEclipseOutput.h" @@ -49,7 +52,6 @@ #include -#include "RigEclipseAllanFaultsStatCalc.h" #include #include @@ -1122,9 +1124,16 @@ void RigCaseCellResultsData::createPlaceholderResultEntries() // I/J/K indexes { - addStaticScalarResult( RiaDefines::ResultCatType::STATIC_NATIVE, RiaResultNames::indexIResultName(), false, 0 ); - addStaticScalarResult( RiaDefines::ResultCatType::STATIC_NATIVE, RiaResultNames::indexJResultName(), false, 0 ); - addStaticScalarResult( RiaDefines::ResultCatType::STATIC_NATIVE, RiaResultNames::indexKResultName(), false, 0 ); + findOrCreateScalarResultIndex( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, + RiaResultNames::indexIResultName() ), + false ); + + findOrCreateScalarResultIndex( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, + RiaResultNames::indexJResultName() ), + false ); + findOrCreateScalarResultIndex( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, + RiaResultNames::indexKResultName() ), + false ); } } @@ -2034,70 +2043,47 @@ void RigCaseCellResultsData::computeIndexResults() size_t reservoirCellCount = activeCellInfo()->reservoirCellCount(); if ( reservoirCellCount == 0 ) return; - size_t iResultIndex = findOrCreateScalarResultIndex( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, - RiaResultNames::indexIResultName() ), - false ); - size_t jResultIndex = findOrCreateScalarResultIndex( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, - RiaResultNames::indexJResultName() ), - false ); - size_t kResultIndex = findOrCreateScalarResultIndex( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, - RiaResultNames::indexKResultName() ), - false ); + size_t iResultIndex = findScalarResultIndexFromAddress( + RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, RiaResultNames::indexIResultName() ) ); + size_t jResultIndex = findScalarResultIndexFromAddress( + RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, RiaResultNames::indexJResultName() ) ); + size_t kResultIndex = findScalarResultIndexFromAddress( + RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, RiaResultNames::indexKResultName() ) ); + + if ( iResultIndex == cvf::UNDEFINED_SIZE_T || jResultIndex == cvf::UNDEFINED_SIZE_T || + kResultIndex == cvf::UNDEFINED_SIZE_T ) + return; bool computeIndexI = false; bool computeIndexJ = false; bool computeIndexK = false; - if ( iResultIndex == cvf::UNDEFINED_SIZE_T ) + std::vector>& indexI = m_cellScalarResults[iResultIndex]; + std::vector>& indexJ = m_cellScalarResults[jResultIndex]; + std::vector>& indexK = m_cellScalarResults[kResultIndex]; + + if ( indexI.empty() ) indexI.resize( 1 ); + if ( indexI[0].size() < reservoirCellCount ) { - iResultIndex = this->addStaticScalarResult( RiaDefines::ResultCatType::STATIC_NATIVE, - RiaResultNames::indexIResultName(), - false, - reservoirCellCount ); + indexI[0].resize( reservoirCellCount, std::numeric_limits::infinity() ); computeIndexI = true; } - if ( jResultIndex == cvf::UNDEFINED_SIZE_T ) + if ( indexJ.empty() ) indexJ.resize( 1 ); + if ( indexJ[0].size() < reservoirCellCount ) { - jResultIndex = this->addStaticScalarResult( RiaDefines::ResultCatType::STATIC_NATIVE, - RiaResultNames::indexJResultName(), - false, - reservoirCellCount ); + indexJ[0].resize( reservoirCellCount, std::numeric_limits::infinity() ); computeIndexJ = true; } - if ( kResultIndex == cvf::UNDEFINED_SIZE_T ) + if ( indexK.empty() ) indexK.resize( 1 ); + if ( indexK[0].size() < reservoirCellCount ) { - kResultIndex = this->addStaticScalarResult( RiaDefines::ResultCatType::STATIC_NATIVE, - RiaResultNames::indexKResultName(), - false, - reservoirCellCount ); + indexK[0].resize( reservoirCellCount, std::numeric_limits::infinity() ); computeIndexK = true; } - std::vector>& indexI = m_cellScalarResults[iResultIndex]; - std::vector>& indexJ = m_cellScalarResults[jResultIndex]; - std::vector>& indexK = m_cellScalarResults[kResultIndex]; - - { - if ( indexI[0].size() < reservoirCellCount ) - { - indexI[0].resize( reservoirCellCount, std::numeric_limits::infinity() ); - computeIndexI = true; - } - - if ( indexJ[0].size() < reservoirCellCount ) - { - indexJ[0].resize( reservoirCellCount, std::numeric_limits::infinity() ); - computeIndexJ = true; - } - - if ( indexK[0].size() < reservoirCellCount ) - { - indexK[0].resize( reservoirCellCount, std::numeric_limits::infinity() ); - computeIndexK = true; - } - } + if ( !( computeIndexI || computeIndexJ || computeIndexK ) ) return; const std::vector& globalCellArray = m_ownerMainGrid->globalCellArray(); long long numCells = static_cast( globalCellArray.size() ); @@ -2897,6 +2883,23 @@ void RigCaseCellResultsData::computeCompletionTypeForTimeStep( size_t timeStep ) if ( !eclipseCase ) return; + // If permeabilities are generated by calculations, make sure that generated data is calculated + // See RicExportFractureCompletionsImpl::generateCompdatValues() + for ( const QString propertyName : { "PERMX", "PERMY", "PERMZ" } ) + { + for ( auto userCalculation : RimProject::current()->gridCalculationCollection()->calculations() ) + { + auto gridCalculation = dynamic_cast( userCalculation ); + if ( gridCalculation && gridCalculation->outputEclipseCase() != eclipseCase ) continue; + + QString generatedPropertyName = userCalculation->findLeftHandSide( userCalculation->expression() ); + if ( generatedPropertyName == propertyName ) + { + userCalculation->calculate(); + } + } + } + RimCompletionCellIntersectionCalc::calculateCompletionTypeResult( eclipseCase, completionTypeResult, timeStep ); } diff --git a/ApplicationLibCode/ReservoirDataModel/RigEclipseNativeStatCalc.cpp b/ApplicationLibCode/ReservoirDataModel/RigEclipseNativeStatCalc.cpp index eba4764a53..281208b721 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigEclipseNativeStatCalc.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigEclipseNativeStatCalc.cpp @@ -41,7 +41,14 @@ RigEclipseNativeStatCalc::RigEclipseNativeStatCalc( RigCaseCellResultsData* void RigEclipseNativeStatCalc::minMaxCellScalarValues( size_t timeStepIndex, double& min, double& max ) { MinMaxAccumulator acc( min, max ); - traverseCells( acc, timeStepIndex ); + + std::vector threadAccumulators; + threadTraverseCells( threadAccumulators, timeStepIndex ); + for ( const auto& threadAcc : threadAccumulators ) + { + acc.addValue( threadAcc.min ); + acc.addValue( threadAcc.max ); + } min = acc.min; max = acc.max; } @@ -63,7 +70,13 @@ void RigEclipseNativeStatCalc::p10p90CellScalarValues( double& p10, double& p90 for ( size_t timeStepIndex = 0; timeStepIndex < timeStepCount(); timeStepIndex++ ) { - traverseCells( acc, timeStepIndex ); + std::vector threadAccumulators; + threadTraverseCells( threadAccumulators, timeStepIndex ); + for ( const auto& threadAcc : threadAccumulators ) + { + acc.addData( threadAcc.values ); + acc.addData( threadAcc.values ); + } } acc.computep10p90( p10, p90 ); @@ -75,7 +88,15 @@ void RigEclipseNativeStatCalc::p10p90CellScalarValues( double& p10, double& p90 void RigEclipseNativeStatCalc::p10p90CellScalarValues( size_t timeStepIndex, double& p10, double& p90 ) { PercentilAccumulator acc; - traverseCells( acc, timeStepIndex ); + + std::vector threadAccumulators; + threadTraverseCells( threadAccumulators, timeStepIndex ); + for ( const auto& threadAcc : threadAccumulators ) + { + acc.addData( threadAcc.values ); + acc.addData( threadAcc.values ); + } + acc.computep10p90( p10, p90 ); } @@ -85,7 +106,15 @@ void RigEclipseNativeStatCalc::p10p90CellScalarValues( size_t timeStepIndex, dou void RigEclipseNativeStatCalc::posNegClosestToZero( size_t timeStepIndex, double& pos, double& neg ) { PosNegAccumulator acc( pos, neg ); - traverseCells( acc, timeStepIndex ); + + std::vector threadAccumulators; + threadTraverseCells( threadAccumulators, timeStepIndex ); + for ( const auto& threadAcc : threadAccumulators ) + { + acc.addValue( threadAcc.pos ); + acc.addValue( threadAcc.neg ); + } + pos = acc.pos; neg = acc.neg; } diff --git a/ApplicationLibCode/ReservoirDataModel/RigEclipseNativeStatCalc.h b/ApplicationLibCode/ReservoirDataModel/RigEclipseNativeStatCalc.h index 9a2a8d4969..4e19447a3e 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigEclipseNativeStatCalc.h +++ b/ApplicationLibCode/ReservoirDataModel/RigEclipseNativeStatCalc.h @@ -19,10 +19,11 @@ #pragma once -#include "RigStatisticsCalculator.h" +#include "RiaOpenMPTools.h" #include "RigActiveCellInfo.h" #include "RigCaseCellResultsData.h" +#include "RigStatisticsCalculator.h" class RigHistogramCalculator; @@ -50,6 +51,7 @@ class RigEclipseNativeStatCalc : public RigStatisticsCalculator RigCaseCellResultsData* m_resultsData; RigEclipseResultAddress m_eclipseResultAddress; + // Add all result values to an accumulator for a given time step template void traverseCells( StatisticsAccumulator& accumulator, size_t timeStepIndex ) { @@ -59,31 +61,34 @@ class RigEclipseNativeStatCalc : public RigStatisticsCalculator } const std::vector& values = m_resultsData->cellScalarResults( m_eclipseResultAddress, timeStepIndex ); + for ( const auto& val : values ) + { + accumulator.addValue( val ); + } + } - if ( values.empty() ) + // Create one accumulator for each available thread, and add values to accumulator for a given time step + template + void threadTraverseCells( std::vector& accumulators, size_t timeStepIndex ) + { + if ( timeStepIndex >= m_resultsData->cellScalarResults( m_eclipseResultAddress ).size() ) { - // Can happen if values do not exist for the current time step index. return; } - const RigActiveCellInfo* actCellInfo = m_resultsData->activeCellInfo(); - size_t cellCount = actCellInfo->reservoirCellCount(); + const std::vector& values = m_resultsData->cellScalarResults( m_eclipseResultAddress, timeStepIndex ); - bool isUsingGlobalActiveIndex = m_resultsData->isUsingGlobalActiveIndex( m_eclipseResultAddress ); - for ( size_t cIdx = 0; cIdx < cellCount; ++cIdx ) - { - // Filter out inactive cells - if ( !actCellInfo->isActive( cIdx ) ) continue; + int numberOfThreads = RiaOpenMPTools::availableThreadCount(); + accumulators.resize( numberOfThreads ); - size_t cellResultIndex = cIdx; - if ( isUsingGlobalActiveIndex ) - { - cellResultIndex = actCellInfo->cellResultIndex( cIdx ); - } +#pragma omp parallel + { + int myThread = RiaOpenMPTools::currentThreadIndex(); - if ( cellResultIndex != cvf::UNDEFINED_SIZE_T && cellResultIndex < values.size() ) +#pragma omp for + for ( long long i = 0; i < (long long)values.size(); i++ ) { - accumulator.addValue( values[cellResultIndex] ); + accumulators[myThread].addValue( values[i] ); } } } diff --git a/ApplicationLibCode/ReservoirDataModel/RigFractureCell.cpp b/ApplicationLibCode/ReservoirDataModel/RigFractureCell.cpp index 47e494ea01..67e20d5c04 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigFractureCell.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigFractureCell.cpp @@ -72,7 +72,7 @@ size_t RigFractureCell::getJ() const //-------------------------------------------------------------------------------------------------- bool RigFractureCell::hasNonZeroConductivity() const { - return m_conductivityValue > 1e-7; + return m_conductivityValue > 1e-7 && !std::isinf( m_conductivityValue ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ReservoirDataModel/RigGridManager.cpp b/ApplicationLibCode/ReservoirDataModel/RigGridManager.cpp index d347a93fe4..04bcc278ab 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigGridManager.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigGridManager.cpp @@ -120,7 +120,7 @@ bool RigGridManager::isGridDimensionsEqual( const std::vector>& //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RigGridManager::isMainGridDimensionsEqual( RigMainGrid* gridA, RigMainGrid* gridB ) +bool RigGridManager::isMainGridDimensionsEqual( const RigMainGrid* gridA, const RigMainGrid* gridB ) { if ( gridA == nullptr || gridB == nullptr ) return false; diff --git a/ApplicationLibCode/ReservoirDataModel/RigGridManager.h b/ApplicationLibCode/ReservoirDataModel/RigGridManager.h index efc3a2b102..e373871120 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigGridManager.h +++ b/ApplicationLibCode/ReservoirDataModel/RigGridManager.h @@ -38,7 +38,7 @@ class RigGridManager : public cvf::Object void clear(); static bool isEqual( RigMainGrid* gridA, RigMainGrid* gridB ); - static bool isMainGridDimensionsEqual( RigMainGrid* gridA, RigMainGrid* gridB ); + static bool isMainGridDimensionsEqual( const RigMainGrid* gridA, const RigMainGrid* gridB ); static bool isGridDimensionsEqual( const std::vector>& mainCaseGridDimensions, const std::vector>& caseGridDimensions ); diff --git a/ApplicationLibCode/ReservoirDataModel/RigMainGrid.cpp b/ApplicationLibCode/ReservoirDataModel/RigMainGrid.cpp index a7fabf8293..f7c16d60fa 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigMainGrid.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigMainGrid.cpp @@ -21,6 +21,7 @@ #include "RigMainGrid.h" #include "RiaLogging.h" +#include "RiaOpenMPTools.h" #include "RiaResultNames.h" #include "RigActiveCellInfo.h" @@ -30,10 +31,6 @@ #include "cvfAssert.h" #include "cvfBoundingBoxTree.h" -#ifdef USE_OPENMP -#include -#endif - RigMainGrid::RigMainGrid() : RigGridBase( this ) { @@ -264,13 +261,31 @@ void RigMainGrid::setDisplayModelOffset( cvf::Vec3d offset ) /// Compute cell ranges for active and valid cells /// Compute bounding box in world coordinates based on node coordinates //-------------------------------------------------------------------------------------------------- -void RigMainGrid::computeCachedData() +void RigMainGrid::computeCachedData( std::string* aabbTreeInfo ) { initAllSubGridsParentGridPointer(); initAllSubCellsMainGridCellIndex(); m_cellSearchTree = nullptr; - buildCellSearchTree(); + + const double maxNumberOfLeafNodes = 4000000; + const double factor = std::ceil( cellCount() / maxNumberOfLeafNodes ); + const size_t cellsPerBoundingBox = std::max( size_t( 1 ), static_cast( factor ) ); + + if ( cellsPerBoundingBox > 1 ) + { + buildCellSearchTreeOptimized( cellsPerBoundingBox ); + } + else + { + buildCellSearchTree(); + } + + if ( aabbTreeInfo ) + { + *aabbTreeInfo += "Cells per bounding box : " + std::to_string( cellsPerBoundingBox ) + "\n"; + *aabbTreeInfo += m_cellSearchTree->info(); + } } //-------------------------------------------------------------------------------------------------- @@ -575,12 +590,7 @@ void RigMainGrid::addUnNamedFaultFaces( int gcIdx, } else { - CVF_FAIL_MSG( "Found fault with global neighbor index less than the native index. " ); // Should never - // occur. because - // we flag the - // opposite face - // in the - // faultsPrCellAcc + CVF_FAIL_MSG( "Found fault with global neighbor index less than the native index. " ); } } } @@ -641,32 +651,67 @@ void RigMainGrid::distributeNNCsToFaults() //-------------------------------------------------------------------------------------------------- bool RigMainGrid::isFaceNormalsOutwards() const { - for ( int gcIdx = 0; gcIdx < static_cast( m_cells.size() ); ++gcIdx ) - { - if ( !m_cells[gcIdx].isInvalid() ) + auto isValidAndFaceNormalDir = []( const double ijSize, + const double kSize, + const RigCell& cell, + cvf::StructGridInterface::FaceType face ) -> std::pair { + const cvf::Vec3d cellCenter = cell.center(); + const cvf::Vec3d faceCenter = cell.faceCenter( face ); + const cvf::Vec3d faceNormal = cell.faceNormalWithAreaLength( face ); + + if ( ( faceCenter - cellCenter ).length() > 0.2 * ijSize && ( faceNormal.length() > ( 0.2 * ijSize * 0.2 * kSize ) ) ) { - cvf::Vec3d cellCenter = m_cells[gcIdx].center(); - cvf::Vec3d faceCenter = m_cells[gcIdx].faceCenter( StructGridInterface::POS_I ); - cvf::Vec3d faceNormal = m_cells[gcIdx].faceNormalWithAreaLength( StructGridInterface::POS_I ); + // Cell is assumed ok to use, so calculate whether the normals are outwards or inwards + if ( ( faceCenter - cellCenter ) * faceNormal >= 0 ) + { + return { true, true }; + } + + return { true, false }; + } + + return { false, false }; + }; - double typicalIJCellSize = characteristicIJCellSize(); - double dummy, dummy2, typicalKSize; - characteristicCellSizes( &dummy, &dummy2, &typicalKSize ); + double ijSize = characteristicIJCellSize(); - if ( ( faceCenter - cellCenter ).length() > 0.2 * typicalIJCellSize && - ( faceNormal.length() > ( 0.2 * typicalIJCellSize * 0.2 * typicalKSize ) ) ) + double iSize, jSize, kSize = 0.0; + characteristicCellSizes( &iSize, &jSize, &kSize ); + const double characteristicVolume = iSize * jSize * kSize; + + for ( const auto& cell : m_cells ) + { + if ( !cell.isInvalid() ) + { + // Some cells can be very twisted and distorted. Use a volume criteria to find a reasonably regular cell. + const double cellVolume = cell.volume(); + if ( cellVolume < characteristicVolume * 0.8 ) continue; + + auto [isValid1, direction1] = + isValidAndFaceNormalDir( ijSize, kSize, cell, cvf::StructGridInterface::FaceType::NEG_I ); + auto [isValid2, direction2] = + isValidAndFaceNormalDir( ijSize, kSize, cell, cvf::StructGridInterface::FaceType::POS_I ); + auto [isValid3, direction3] = + isValidAndFaceNormalDir( ijSize, kSize, cell, cvf::StructGridInterface::FaceType::NEG_J ); + auto [isValid4, direction4] = + isValidAndFaceNormalDir( ijSize, kSize, cell, cvf::StructGridInterface::FaceType::POS_J ); + + if ( !isValid1 || !isValid2 || !isValid3 || !isValid4 ) continue; + + if ( direction1 && direction2 && direction3 && direction4 ) { - // Cell is assumed ok to use, so calculate whether the normals are outwards or inwards + // All face normals pointing outwards + return true; + } - if ( ( faceCenter - cellCenter ) * faceNormal >= 0 ) - { - return true; - } - else - { - return false; - } + if ( !direction1 && !direction2 && !direction3 && !direction4 ) + { + // All cell face normals pointing inwards + return false; } + + // This is a mixed case, where some faces are outwards and some are inwards + continue; } } @@ -744,10 +789,8 @@ void RigMainGrid::buildCellSearchTree() #pragma omp parallel { - size_t threadCellCount = cellCount; -#ifdef USE_OPENMP - threadCellCount = std::ceil( cellCount / static_cast( omp_get_num_threads() ) ); -#endif + int numberOfThreads = RiaOpenMPTools::availableThreadCount(); + size_t threadCellCount = std::ceil( cellCount / static_cast( numberOfThreads ) ); std::vector threadIndicesForBoundingBoxes; std::vector threadBoundingBoxes; @@ -763,14 +806,10 @@ void RigMainGrid::buildCellSearchTree() const std::array& cellIndices = m_cells[cIdx].cornerIndices(); cvf::BoundingBox cellBB; - cellBB.add( m_nodes[cellIndices[0]] ); - cellBB.add( m_nodes[cellIndices[1]] ); - cellBB.add( m_nodes[cellIndices[2]] ); - cellBB.add( m_nodes[cellIndices[3]] ); - cellBB.add( m_nodes[cellIndices[4]] ); - cellBB.add( m_nodes[cellIndices[5]] ); - cellBB.add( m_nodes[cellIndices[6]] ); - cellBB.add( m_nodes[cellIndices[7]] ); + for ( size_t i : cellIndices ) + { + cellBB.add( m_nodes[i] ); + } if ( cellBB.isValid() ) { @@ -796,6 +835,97 @@ void RigMainGrid::buildCellSearchTree() } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigMainGrid::buildCellSearchTreeOptimized( size_t cellsPerBoundingBox ) +{ + int threadCount = RiaOpenMPTools::availableThreadCount(); + + std::vector>> threadCellIndicesForBoundingBoxes( threadCount ); + std::vector> threadCellBoundingBoxes( threadCount ); + +#pragma omp parallel + { + int myThread = RiaOpenMPTools::currentThreadIndex(); + +#pragma omp for + for ( int i = 0; i < static_cast( cellCountI() ); i++ ) + { + for ( size_t j = 0; j < cellCountJ(); j++ ) + { + size_t k = 0; + while ( k < cellCountK() ) + { + size_t kCount = 0; + + std::vector aggregatedCellIndices; + cvf::BoundingBox accumulatedBB; + + while ( ( kCount < cellsPerBoundingBox ) && ( k + kCount < cellCountK() ) ) + { + size_t cellIdx = cellIndexFromIJK( i, j, k + kCount ); + const auto& rigCell = cell( cellIdx ); + + if ( !rigCell.isInvalid() ) + { + aggregatedCellIndices.push_back( static_cast( cellIdx ) ); + + // Add all cells in sub grid contained in this main grid cell + if ( auto subGrid = rigCell.subGrid() ) + { + for ( size_t localIdx = 0; localIdx < subGrid->cellCount(); localIdx++ ) + { + const auto& localCell = subGrid->cell( localIdx ); + if ( localCell.mainGridCellIndex() == cellIdx ) + { + aggregatedCellIndices.push_back( + static_cast( subGrid->reservoirCellIndex( localIdx ) ) ); + } + } + } + + const std::array& cellIndices = rigCell.cornerIndices(); + + cvf::BoundingBox cellBB; + for ( size_t i : cellIndices ) + { + cellBB.add( m_nodes[i] ); + } + + if ( cellBB.isValid() ) accumulatedBB.add( cellBB ); + } + kCount++; + } + + k += kCount; + kCount = 0; + + threadCellIndicesForBoundingBoxes[myThread].emplace_back( aggregatedCellIndices ); + threadCellBoundingBoxes[myThread].emplace_back( accumulatedBB ); + } + } + } + } + + std::vector> cellIndicesForBoundingBoxes; + std::vector cellBoundingBoxes; + + for ( auto i = 0; i < threadCount; i++ ) + { + cellIndicesForBoundingBoxes.insert( cellIndicesForBoundingBoxes.end(), + threadCellIndicesForBoundingBoxes[i].begin(), + threadCellIndicesForBoundingBoxes[i].end() ); + + cellBoundingBoxes.insert( cellBoundingBoxes.end(), + threadCellBoundingBoxes[i].begin(), + threadCellBoundingBoxes[i].end() ); + } + + m_cellSearchTree = new cvf::BoundingBoxTree; + m_cellSearchTree->buildTreeFromBoundingBoxesOptimized( cellBoundingBoxes, cellIndicesForBoundingBoxes ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ReservoirDataModel/RigMainGrid.h b/ApplicationLibCode/ReservoirDataModel/RigMainGrid.h index dabed2d97f..2f29de4920 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigMainGrid.h +++ b/ApplicationLibCode/ReservoirDataModel/RigMainGrid.h @@ -88,7 +88,7 @@ class RigMainGrid : public RigGridBase cvf::StructGridInterface::FaceType face ) const; bool isFaceNormalsOutwards() const; - void computeCachedData(); + void computeCachedData( std::string* aabbTreeInfo = nullptr ); void initAllSubGridsParentGridPointer(); cvf::Vec3d displayModelOffset() const override; @@ -116,6 +116,7 @@ class RigMainGrid : public RigGridBase private: void initAllSubCellsMainGridCellIndex(); void buildCellSearchTree(); + void buildCellSearchTreeOptimized( size_t cellsPerBoundingBox ); bool hasFaultWithName( const QString& name ) const; static std::array defaultMapAxes(); diff --git a/ApplicationLibCode/ReservoirDataModel/RigNNCData.cpp b/ApplicationLibCode/ReservoirDataModel/RigNNCData.cpp index 0c77da06f7..397d8cd327 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigNNCData.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigNNCData.cpp @@ -201,6 +201,9 @@ bool RigNNCData::ensureAllConnectionDataIsProcessed() { if ( m_haveGeneratedConnections ) return false; + // Return false if we have no data to process to avoid recursive updates in consuming code + if ( !m_mainGrid ) return false; + if ( m_mainGrid ) { caf::ProgressInfo progressInfo( 3, "Computing NNC Data" ); diff --git a/ApplicationLibCode/ReservoirDataModel/RigSimulationWellCenterLineCalculator.cpp b/ApplicationLibCode/ReservoirDataModel/RigSimulationWellCenterLineCalculator.cpp index d365c926dd..b93e15ac5a 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigSimulationWellCenterLineCalculator.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigSimulationWellCenterLineCalculator.cpp @@ -753,14 +753,11 @@ class BranchSplitter const std::array& cellIndices = wellCell.cornerIndices(); cvf::BoundingBox& cellBB = m_cellBoundingBoxes[cIdx]; - cellBB.add( nodes[cellIndices[0]] ); - cellBB.add( nodes[cellIndices[1]] ); - cellBB.add( nodes[cellIndices[2]] ); - cellBB.add( nodes[cellIndices[3]] ); - cellBB.add( nodes[cellIndices[4]] ); - cellBB.add( nodes[cellIndices[5]] ); - cellBB.add( nodes[cellIndices[6]] ); - cellBB.add( nodes[cellIndices[7]] ); + + for ( size_t i : cellIndices ) + { + cellBB.add( nodes[i] ); + } } m_cellSearchTree.buildTreeFromBoundingBoxes( m_cellBoundingBoxes, nullptr ); diff --git a/ApplicationLibCode/ReservoirDataModel/RigStimPlanFractureDefinition.cpp b/ApplicationLibCode/ReservoirDataModel/RigStimPlanFractureDefinition.cpp index 355f8dae08..d86a3a7c42 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigStimPlanFractureDefinition.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigStimPlanFractureDefinition.cpp @@ -28,6 +28,8 @@ #include "RivWellFracturePartMgr.h" +#include "cafAssert.h" + #include //-------------------------------------------------------------------------------------------------- @@ -123,6 +125,7 @@ double RigStimPlanFractureDefinition::bottomPerfTvd() const //-------------------------------------------------------------------------------------------------- double RigStimPlanFractureDefinition::minY() const { + CAF_ASSERT( !m_Ys.empty() ); return m_Ys[0]; } @@ -131,6 +134,7 @@ double RigStimPlanFractureDefinition::minY() const //-------------------------------------------------------------------------------------------------- double RigStimPlanFractureDefinition::maxY() const { + CAF_ASSERT( !m_Ys.empty() ); return m_Ys.back(); } diff --git a/ApplicationLibCode/ReservoirDataModel/RigThermalFractureResultUtil.cpp b/ApplicationLibCode/ReservoirDataModel/RigThermalFractureResultUtil.cpp index e39ddf42ff..ad65953aed 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigThermalFractureResultUtil.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigThermalFractureResultUtil.cpp @@ -34,9 +34,6 @@ #include -int numSamplesX = 100; -int numSamplesY = 60; - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -75,12 +72,12 @@ std::vector> boundingBox.expand( 1.0 ); // Generate a uniform mesh (center points) - auto [xCoords, depthCoords] = generateUniformMesh( boundingBox, numSamplesX, numSamplesY ); + auto [xCoords, depthCoords] = generateUniformMesh( boundingBox, NUM_SAMPLES_X, NUM_SAMPLES_Y ); // Fill with invalid value - for ( int i = 0; i < numSamplesY; i++ ) + for ( int i = 0; i < NUM_SAMPLES_Y; i++ ) { - std::vector junk( numSamplesX, std::numeric_limits::infinity() ); + std::vector junk( NUM_SAMPLES_X, std::numeric_limits::infinity() ); vec.push_back( junk ); } @@ -133,7 +130,7 @@ void RigThermalFractureResultUtil::createFractureTriangleGeometry( boundingBox.expand( 1.0 ); // Generate a uniform mesh - auto [xCoords, depthCoords] = generateUniformMesh( boundingBox, numSamplesX, numSamplesY ); + auto [xCoords, depthCoords] = generateUniformMesh( boundingBox, NUM_SAMPLES_X, NUM_SAMPLES_Y ); // Code adapted from RigStimPlanFractureDefinition std::vector adjustedYs = depthCoords; @@ -190,9 +187,9 @@ std::vector const std::vector>& resultValuesAtTimeStep = getDataAtTimeIndex( fractureDefinition, resultName, unitName, timeStepIndex ); - for ( int i = 0; i < static_cast( numSamplesX ) - 2; i++ ) + for ( int i = 0; i < static_cast( NUM_SAMPLES_X ) - 2; i++ ) { - for ( int j = 0; j < static_cast( numSamplesY ) - 2; j++ ) + for ( int j = 0; j < static_cast( NUM_SAMPLES_Y ) - 2; j++ ) { if ( j + 1 < static_cast( resultValuesAtTimeStep.size() ) && i + 1 < static_cast( resultValuesAtTimeStep[j + 1].size() ) ) @@ -282,7 +279,7 @@ cvf::cref boundingBox.expand( 1.0 ); // Generate a uniform mesh - auto [Xs, Ys] = generateUniformMesh( boundingBox, numSamplesX, numSamplesY ); + auto [Xs, Ys] = generateUniformMesh( boundingBox, NUM_SAMPLES_X, NUM_SAMPLES_Y ); double centerZ = fractureDefinition->centerPosition().z(); double offset = wellPathIntersectionAtFractureDepth - centerZ; @@ -343,8 +340,8 @@ cvf::cref cvf::ref fractureGrid = new RigFractureGrid; fractureGrid->setFractureCells( stimPlanCells ); fractureGrid->setWellCenterFractureCellIJ( wellCenterStimPlanCellIJ ); - fractureGrid->setICellCount( numSamplesX - 2 ); - fractureGrid->setJCellCount( numSamplesY - 2 ); + fractureGrid->setICellCount( NUM_SAMPLES_X - 2 ); + fractureGrid->setJCellCount( NUM_SAMPLES_Y - 2 ); fractureGrid->ensureCellSearchTreeIsBuilt(); return cvf::cref( fractureGrid.p() ); @@ -354,10 +351,10 @@ cvf::cref /// TODO: adapted from RimEnsembleFractureStatistics. Maybe extract? //-------------------------------------------------------------------------------------------------- std::pair, std::vector> - RigThermalFractureResultUtil::generateUniformMesh( const cvf::BoundingBox& bb, int numSamplesX, int numSamplesY ) + RigThermalFractureResultUtil::generateUniformMesh( const cvf::BoundingBox& bb, int NUM_SAMPLES_X, int NUM_SAMPLES_Y ) { - CAF_ASSERT( numSamplesX > 0 ); - CAF_ASSERT( numSamplesY > 0 ); + CAF_ASSERT( NUM_SAMPLES_X > 0 ); + CAF_ASSERT( NUM_SAMPLES_Y > 0 ); double minX = bb.min().x(); double maxX = bb.max().x(); @@ -366,10 +363,10 @@ std::pair, std::vector> double maxY = bb.max().y(); std::vector gridXs; - linearSampling( minX, maxX, numSamplesX, gridXs ); + linearSampling( minX, maxX, NUM_SAMPLES_X, gridXs ); std::vector gridYs; - linearSampling( minY, maxY, numSamplesY, gridYs ); + linearSampling( minY, maxY, NUM_SAMPLES_Y, gridYs ); return std::make_pair( gridXs, gridYs ); } @@ -448,24 +445,6 @@ void RigThermalFractureResultUtil::appendDataToResultStatistics( std::shared_ptr } } -//-------------------------------------------------------------------------------------------------- -/// Taken from OverlayNavigationCube::computeNewUpVector -/// Consider move to geometry util class -//-------------------------------------------------------------------------------------------------- -cvf::Mat4d RigThermalFractureResultUtil::rotationMatrixBetweenVectors( const cvf::Vec3d& v1, const cvf::Vec3d& v2 ) -{ - using namespace cvf; - - Vec3d rotAxis = v1 ^ v2; - rotAxis.normalize(); - - // Guard acos against out-of-domain input - const double dotProduct = Math::clamp( v1 * v2, -1.0, 1.0 ); - const double angle = Math::acos( dotProduct ); - Mat4d rotMat = Mat4d::fromRotation( rotAxis, angle ); - return rotMat; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -481,6 +460,13 @@ std::vector r.z() *= -1.0; } + // Store the depths of the points + std::vector depths; + for ( auto& r : relativePos ) + { + depths.push_back( r.z() ); + } + cvf::Vec3d p0 = relativePos[0]; cvf::Vec3d p1 = relativePos[1]; cvf::Vec3d p2 = relativePos[2]; @@ -489,7 +475,7 @@ std::vector plane.setFromPoints( p0, p1, p2 ); cvf::Vec3d planeNormal = plane.normal().getNormalized(); - auto rotMat = rotationMatrixBetweenVectors( planeNormal, ( cvf::Vec3d::Z_AXIS ).getNormalized() ); + auto rotMat = cvf::GeometryTools::rotationMatrixBetweenVectors( planeNormal, ( cvf::Vec3d::Z_AXIS ).getNormalized() ); for ( auto& r : relativePos ) { @@ -497,21 +483,24 @@ std::vector r.z() = 0.0; } - auto findExtrema = []( const std::vector& points ) { - double maxDistance = -1.0; + auto findPointsWithMostSimilarDepth = []( const std::vector& points, const std::vector& depths ) { + double minDiff = std::numeric_limits::max(); cvf::Vec3d e1 = cvf::Vec3d::UNDEFINED; cvf::Vec3d e2 = cvf::Vec3d::UNDEFINED; - for ( auto p1 : points ) + for ( size_t i1 = 0; i1 < points.size(); i1++ ) { - for ( auto p2 : points ) + for ( size_t i2 = 0; i2 < points.size(); i2++ ) { - double distance = p1.pointDistanceSquared( p2 ); - if ( distance > maxDistance ) + if ( i1 != i2 ) { - maxDistance = distance; - e1 = p1; - e2 = p2; + double diff = std::fabs( depths[i1] - depths[i2] ); + if ( diff < minDiff ) + { + minDiff = diff; + e1 = points[i1]; + e2 = points[i2]; + } } } } @@ -519,9 +508,14 @@ std::vector return std::make_pair( e1, e2 ); }; - auto [e1, e2] = findExtrema( relativePos ); - cvf::Vec3d direction = e1 - e2; - auto rotMat2 = rotationMatrixBetweenVectors( direction.getNormalized(), cvf::Vec3d::X_AXIS ); + // Find the rotation that aligns the data so that depth (z coord) is the most similar. + auto [e1, e2] = findPointsWithMostSimilarDepth( relativePos, depths ); + cvf::Vec3d direction = e1 - e2; + cvf::Vec3d directionNormal = direction.getNormalized(); + // Make sure normal is pointing down + if ( directionNormal.y() > 0.0 ) directionNormal *= -1.0; + + auto rotMat2 = cvf::GeometryTools::rotationMatrixBetweenVectors( directionNormal, cvf::Vec3d::X_AXIS ); for ( auto& r : relativePos ) { r.transformVector( rotMat2 ); diff --git a/ApplicationLibCode/ReservoirDataModel/RigThermalFractureResultUtil.h b/ApplicationLibCode/ReservoirDataModel/RigThermalFractureResultUtil.h index 05fd82f0a2..8ce8ebbce8 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigThermalFractureResultUtil.h +++ b/ApplicationLibCode/ReservoirDataModel/RigThermalFractureResultUtil.h @@ -96,8 +96,6 @@ class RigThermalFractureResultUtil static double linearSampling( double minValue, double maxValue, int numSamples, std::vector& samples ); - static cvf::Mat4d rotationMatrixBetweenVectors( const cvf::Vec3d& v1, const cvf::Vec3d& v2 ); - static std::vector getRelativeCoordinates( std::shared_ptr fractureDefinition, size_t timeStepIndex ); @@ -111,4 +109,7 @@ class RigThermalFractureResultUtil std::shared_ptr fractureDefinition, int propertyIndex, size_t timeStepIndex ); + + static const int NUM_SAMPLES_X = 50; + static const int NUM_SAMPLES_Y = 40; }; diff --git a/ApplicationLibCode/ReservoirDataModel/RigWbsParameter.h b/ApplicationLibCode/ReservoirDataModel/RigWbsParameter.h index d0cb03c6f1..060661d757 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigWbsParameter.h +++ b/ApplicationLibCode/ReservoirDataModel/RigWbsParameter.h @@ -99,7 +99,8 @@ class RigWbsParameter SourceAddress( QString primary = "", QString secondary = "", QString units = RiaWellLogUnitTools::noUnitString() ) - : primary( primary ) + : resType( RIG_NODAL ) + , primary( primary ) , secondary( secondary ) , units( units ) { diff --git a/ApplicationLibCode/ReservoirDataModel/RigWellLogIndexDepthOffset.cpp b/ApplicationLibCode/ReservoirDataModel/RigWellLogIndexDepthOffset.cpp index 3a37b52043..694ecc2422 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigWellLogIndexDepthOffset.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigWellLogIndexDepthOffset.cpp @@ -99,3 +99,11 @@ std::vector RigWellLogIndexDepthOffset::sortedIndexes() const std::sort( indexes.begin(), indexes.end() ); return indexes; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RigWellLogIndexDepthOffset::hasIndex( int kIndex ) const +{ + return m_mdOffsets.count( kIndex ) > 0; +} diff --git a/ApplicationLibCode/ReservoirDataModel/RigWellLogIndexDepthOffset.h b/ApplicationLibCode/ReservoirDataModel/RigWellLogIndexDepthOffset.h index 3bf5cb1852..8f2c7b794d 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigWellLogIndexDepthOffset.h +++ b/ApplicationLibCode/ReservoirDataModel/RigWellLogIndexDepthOffset.h @@ -34,6 +34,7 @@ class RigWellLogIndexDepthOffset : public cvf::Object double getTopTvd( int kIndex ) const; double getBottomTvd( int kIndex ) const; std::vector sortedIndexes() const; + bool hasIndex( int kIndex ) const; private: std::map> m_mdOffsets; diff --git a/ApplicationLibCode/ReservoirDataModel/cvfGeometryTools.cpp b/ApplicationLibCode/ReservoirDataModel/cvfGeometryTools.cpp index 16c77cff30..c1f16f1a64 100644 --- a/ApplicationLibCode/ReservoirDataModel/cvfGeometryTools.cpp +++ b/ApplicationLibCode/ReservoirDataModel/cvfGeometryTools.cpp @@ -165,6 +165,21 @@ double GeometryTools::getAngle( const cvf::Vec3d& v1, const cvf::Vec3d& v2 ) return angle; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Mat4d GeometryTools::rotationMatrixBetweenVectors( const cvf::Vec3d& v1, const cvf::Vec3d& v2 ) +{ + cvf::Vec3d rotAxis = v1 ^ v2; + rotAxis.normalize(); + + // Guard acos against out-of-domain input + const double dotProduct = cvf::Math::clamp( v1 * v2, -1.0, 1.0 ); + const double angle = cvf::Math::acos( dotProduct ); + cvf::Mat4d rotMat = cvf::Mat4d::fromRotation( rotAxis, angle ); + return rotMat; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ReservoirDataModel/cvfGeometryTools.h b/ApplicationLibCode/ReservoirDataModel/cvfGeometryTools.h index 87a641c2a8..5be7b3c55f 100644 --- a/ApplicationLibCode/ReservoirDataModel/cvfGeometryTools.h +++ b/ApplicationLibCode/ReservoirDataModel/cvfGeometryTools.h @@ -22,6 +22,7 @@ #include "cvfArray.h" #include "cvfArrayWrapperConst.h" #include "cvfMatrix3.h" +#include "cvfMatrix4.h" #include #include @@ -140,6 +141,8 @@ class GeometryTools const std::vector& faceOverlapPolygonWindingSameAsCubeFaceFlags, std::vector* partialFacePolygon, bool* m_partiallyFreeCubeFaceHasHoles ); + + static cvf::Mat4d rotationMatrixBetweenVectors( const cvf::Vec3d& v1, const cvf::Vec3d& v2 ); }; template diff --git a/ApplicationLibCode/UnitTests/CMakeLists_files.cmake b/ApplicationLibCode/UnitTests/CMakeLists_files.cmake index c08b76929a..aeacdb0461 100644 --- a/ApplicationLibCode/UnitTests/CMakeLists_files.cmake +++ b/ApplicationLibCode/UnitTests/CMakeLists_files.cmake @@ -84,6 +84,7 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/opm-summary-Test.cpp ${CMAKE_CURRENT_LIST_DIR}/RifEclipseTextFileReader-Test.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaSummaryStringTools-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaVariableMapper-Test.cpp ) if(RESINSIGHT_ENABLE_GRPC) diff --git a/ApplicationLibCode/UnitTests/ObservedDataParser-Test.cpp b/ApplicationLibCode/UnitTests/ObservedDataParser-Test.cpp index 245948da06..4864ead0a4 100644 --- a/ApplicationLibCode/UnitTests/ObservedDataParser-Test.cpp +++ b/ApplicationLibCode/UnitTests/ObservedDataParser-Test.cpp @@ -401,6 +401,47 @@ TEST( RifColumnBasedAsciiParserTest, TestCellSeparatorComma ) EXPECT_EQ( 4.44, pwValues[3] ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RifColumnBasedAsciiParserTest, ThreeLinesHeader ) +{ + AsciiDataParseOptions parseOptions; + parseOptions.dateFormat = "dd.MM.yyyy"; + parseOptions.cellSeparator = ";"; + parseOptions.locale = QLocale::c(); + parseOptions.timeSeriesColumnName = "TIME"; + + // The CSV header require at leas one line with header data. + // Units and object names are optional header lines. + + // Example data with three header lines: + QString data = R"( +TIME;WBHPH;WBHPH;WBHPH +DAYS;BARS;BARS;BARS +;A-3T2_old;A-3A_old;A-9T2_old +15.07.1999;456.78;0;0 +16.07.1999;0;0;0 +)"; + + QTextStream out( &data ); + + RifCsvUserDataPastedTextParser parser = RifCsvUserDataPastedTextParser( data ); + parser.parse( parseOptions ); + + auto timeColumn = parser.columnInfo( 0 ); + ASSERT_TRUE( timeColumn != nullptr ); + + auto column1 = parser.columnInfo( 1 ); + ASSERT_TRUE( column1 != nullptr ); + auto adr = column1->summaryAddress; + + ASSERT_STREQ( adr.wellName().data(), "A-3T2_old" ); + ASSERT_STREQ( adr.vectorName().data(), "WBHPH" ); + + ASSERT_EQ( column1->values.front(), 456.78 ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/UnitTests/RiaVariableMapper-Test.cpp b/ApplicationLibCode/UnitTests/RiaVariableMapper-Test.cpp new file mode 100644 index 0000000000..ae821dc70e --- /dev/null +++ b/ApplicationLibCode/UnitTests/RiaVariableMapper-Test.cpp @@ -0,0 +1,102 @@ +#include "gtest/gtest.h" + +#include "Tools/RiaVariableMapper.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RiaVariableMapperTest, BasicUsage ) +{ + QString inputText = R"( + $MyVar$ /path/to/file; + $PathId_001$ myFile.txt; + )"; + + RiaVariableMapper mapper( inputText ); + + bool isFound = false; + QString value; + + value = mapper.valueForVariable( "$MyVar$", &isFound ); + EXPECT_TRUE( isFound ); + EXPECT_STREQ( value.toStdString().data(), "/path/to/file" ); + + value = mapper.valueForVariable( "$PathId_001$", &isFound ); + EXPECT_TRUE( isFound ); + EXPECT_STREQ( value.toStdString().data(), "myFile.txt" ); + + mapper.valueForVariable( "not present", &isFound ); + EXPECT_FALSE( isFound ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RiaVariableMapperTest, UserDefinedVariables ) +{ + QString inputText = R"( + $MyVar$ /path/to/file; + $TestVar$ a different variable; + )"; + + RiaVariableMapper mapper( inputText ); + + mapper.addPathAndGetId( "/path/to/file/myFile.txt" ); + mapper.addPathAndGetId( "/path/to/file/myFile2.txt" ); + + mapper.replaceVariablesInValues(); + + QString table = mapper.variableTableAsText(); + + QString expectedText = R"( + $MyVar$ /path/to/file; + $TestVar$ a different variable; + $PathId_001$ $MyVar$/myFile.txt; + $PathId_002$ $MyVar$/myFile2.txt; + )"; + + EXPECT_TRUE( table == expectedText ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RiaVariableMapperTest, UserDefinedVariablesRecursive ) +{ + QString inputText = R"( + $MyVar2$ $MyVar1$/to/file; + $MyVar1$ /path; + $TestVar$ a different variable; + )"; + + RiaVariableMapper mapper( inputText ); + + mapper.addPathAndGetId( "/path/to/file/myFile.txt" ); + mapper.addPathAndGetId( "/path/to/file/myFile2.txt" ); + + mapper.replaceVariablesInValues(); + + QString table = mapper.variableTableAsText(); + + QString expectedText = R"( + $MyVar1$ /path; + $MyVar2$ $MyVar1$/to/file; + $TestVar$ a different variable; + $PathId_001$ $MyVar2$/myFile.txt; + $PathId_002$ $MyVar2$/myFile2.txt; + )"; + + EXPECT_TRUE( table == expectedText ); + + RiaVariableMapper otherMapper( table ); + bool isFound = false; + + QString value = otherMapper.valueForVariable( "$MyVar1$", &isFound ); + EXPECT_TRUE( value == "/path" ); + + value = otherMapper.valueForVariable( "$MyVar2$", &isFound ); + EXPECT_TRUE( value == "/path/to/file" ); + + value = otherMapper.valueForVariable( "$PathId_001$", &isFound ); + EXPECT_TRUE( value == "/path/to/file/myFile.txt" ); +} diff --git a/ApplicationLibCode/UnitTests/RifColorLegendData-Test.cpp b/ApplicationLibCode/UnitTests/RifColorLegendData-Test.cpp index 1e2af76430..a3031c94e4 100644 --- a/ApplicationLibCode/UnitTests/RifColorLegendData-Test.cpp +++ b/ApplicationLibCode/UnitTests/RifColorLegendData-Test.cpp @@ -1,9 +1,9 @@ #include "gtest/gtest.h" +#include "RiaNumericalTools.h" #include "RiaTestDataDirectory.h" #include "RifColorLegendData.h" #include "RigFormationNames.h" -#include "RimRegularLegendConfig.h" #include "cvfColor3.h" @@ -85,46 +85,46 @@ TEST( RifColorLegendData, ReadLYRFileWithColorHTML ) EXPECT_EQ( 0.0f, formationColor.b() ); } -TEST( RimRegularLegendConfig, LogTenFunctions ) +TEST( RiaNumericalTools, LogTenFunctions ) { { // Negative values will return zero double value = -0.0015; - auto exponentCeil = RimRegularLegendConfig::computeTenExponentCeil( value ); + auto exponentCeil = RiaNumericalTools::computeTenExponentCeil( value ); EXPECT_EQ( 0.0f, exponentCeil ); - auto exponentFloor = RimRegularLegendConfig::computeTenExponentFloor( value ); + auto exponentFloor = RiaNumericalTools::computeTenExponentFloor( value ); EXPECT_EQ( 0.0f, exponentFloor ); } { double value = 0.15; - auto exponentCeil = RimRegularLegendConfig::computeTenExponentCeil( value ); + auto exponentCeil = RiaNumericalTools::computeTenExponentCeil( value ); EXPECT_EQ( 0.0f, exponentCeil ); - auto exponentFloor = RimRegularLegendConfig::computeTenExponentFloor( value ); + auto exponentFloor = RiaNumericalTools::computeTenExponentFloor( value ); EXPECT_EQ( -1.0f, exponentFloor ); } { double value = 1.5; - auto exponentCeil = RimRegularLegendConfig::computeTenExponentCeil( value ); + auto exponentCeil = RiaNumericalTools::computeTenExponentCeil( value ); EXPECT_EQ( 1.0f, exponentCeil ); - auto exponentFloor = RimRegularLegendConfig::computeTenExponentFloor( value ); + auto exponentFloor = RiaNumericalTools::computeTenExponentFloor( value ); EXPECT_EQ( 0.0f, exponentFloor ); } { double value = 15; - auto exponentCeil = RimRegularLegendConfig::computeTenExponentCeil( value ); + auto exponentCeil = RiaNumericalTools::computeTenExponentCeil( value ); EXPECT_EQ( 2.0f, exponentCeil ); - auto exponentFloor = RimRegularLegendConfig::computeTenExponentFloor( value ); + auto exponentFloor = RiaNumericalTools::computeTenExponentFloor( value ); EXPECT_EQ( 1.0f, exponentFloor ); } } diff --git a/ApplicationLibCode/UnitTests/RifTextDataTableFormatter-Test.cpp b/ApplicationLibCode/UnitTests/RifTextDataTableFormatter-Test.cpp index e449e636fb..ec7b99668d 100644 --- a/ApplicationLibCode/UnitTests/RifTextDataTableFormatter-Test.cpp +++ b/ApplicationLibCode/UnitTests/RifTextDataTableFormatter-Test.cpp @@ -342,3 +342,29 @@ WELSPECS EXPECT_STREQ( textForCompare.toStdString().data(), tableText.toStdString().data() ); } } + +TEST( RifTextDataTableFormatter, ReplaceTokensInString ) +{ + { + std::map keyValues = { + { "$KEY1", "VALUE1" }, + { "$KEY1_WITH_MORE_TEXT", "VALUE2" }, + }; + + auto templateText = QString( "$KEY1, $KEY1_WITH_MORE_TEXT" ); + auto resolvedText = RiaTextStringTools::replaceTemplateTextWithValues( templateText, keyValues ); + + EXPECT_STREQ( resolvedText.toStdString().data(), "VALUE1, VALUE2" ); + } + + { + std::map keyValues = { + { "$KEY1", "VALUE1" }, + }; + + auto templateText = QString( "$KEY1, $KEY1_WITH_MORE_2" ); + auto resolvedText = RiaTextStringTools::replaceTemplateTextWithValues( templateText, keyValues ); + + EXPECT_STREQ( resolvedText.toStdString().data(), "VALUE1, $KEY1_WITH_MORE_2" ); + } +} diff --git a/ApplicationLibCode/UnitTests/RifThermalFractureReader-Test.cpp b/ApplicationLibCode/UnitTests/RifThermalFractureReader-Test.cpp index 193fa7fa38..203f046d38 100644 --- a/ApplicationLibCode/UnitTests/RifThermalFractureReader-Test.cpp +++ b/ApplicationLibCode/UnitTests/RifThermalFractureReader-Test.cpp @@ -117,41 +117,5 @@ TEST( DISABLED_RifThermalFractureReaderTest, CreateXyzPointCloud ) QString fileName = CASE_REAL_TEST_DATA_DIRECTORY_03 + "fracture_OS_metric_units_final.csv"; auto [fractureData, errorMessage] = RifThermalFractureReader::readFractureCsvFile( fileName ); - - auto numNodes = fractureData->numNodes(); - auto numTimeSteps = fractureData->numTimeSteps(); - auto properties = fractureData->getPropertyNamesUnits(); - - for ( size_t timeStepIndex = 0; timeStepIndex < numTimeSteps; timeStepIndex++ ) - { - QString exportfileName = QString( CASE_REAL_TEST_DATA_DIRECTORY_03 + "msjtest-%1.xyz" ).arg( timeStepIndex ); - - std::vector xs; - std::vector ys; - std::vector zs; - - for ( int nodeIndex = 0; nodeIndex < static_cast( numNodes ); nodeIndex++ ) - { - xs.push_back( - fractureData->getPropertyValue( 0, static_cast( nodeIndex ), static_cast( timeStepIndex ) ) ); - ys.push_back( - fractureData->getPropertyValue( 1, static_cast( nodeIndex ), static_cast( timeStepIndex ) ) ); - zs.push_back( - fractureData->getPropertyValue( 2, static_cast( nodeIndex ), static_cast( timeStepIndex ) ) ); - } - - QFile file( exportfileName ); - if ( file.open( QIODevice::WriteOnly | QIODevice::Text ) ) - { - QTextStream out( &file ); - - out.setRealNumberPrecision( 16 ); - - for ( size_t i = 0; i < xs.size(); i++ ) - { - out << xs[i] << " " << ys[i] << " " << zs[i] << "\n"; - } - } - file.close(); - } + // EXPECT_TRUE( ); } diff --git a/ApplicationLibCode/UnitTests/opm-summary-Test.cpp b/ApplicationLibCode/UnitTests/opm-summary-Test.cpp index c6085ba807..448c267c34 100644 --- a/ApplicationLibCode/UnitTests/opm-summary-Test.cpp +++ b/ApplicationLibCode/UnitTests/opm-summary-Test.cpp @@ -99,13 +99,10 @@ TEST( OpmSummaryTests, DISABLED_OpmImportRftData ) { std::cout << "\n"; - auto rftVectors = eRft.listOfRftArrays( i ); - - for ( const auto& rftVec : rftVectors ) + auto results = eRft.listOfRftArrays( i ); + for ( const auto& [name, arrayType, size] : results ) { - auto [name, arrType, itemCount] = rftVec; - - std::cout << name << ", " << itemCount << "\n"; + std::cout << name << ", " << size << "\n"; } } } diff --git a/ApplicationLibCode/UserInterface/AnalysisPlots/RiuGroupedBarChartBuilder.cpp b/ApplicationLibCode/UserInterface/AnalysisPlots/RiuGroupedBarChartBuilder.cpp index e094201924..42d9a8b81d 100644 --- a/ApplicationLibCode/UserInterface/AnalysisPlots/RiuGroupedBarChartBuilder.cpp +++ b/ApplicationLibCode/UserInterface/AnalysisPlots/RiuGroupedBarChartBuilder.cpp @@ -100,8 +100,7 @@ class RiuBarChartScaleDraw : public QwtScaleDraw public: struct RiuBarChartTick { - RiuBarChartTick() = default; - RiuBarChartTick( const RiuBarChartTick& rhs ) = default; + RiuBarChartTick() = default; RiuBarChartTick( QwtScaleDiv::TickType tickType, const QString& label, bool oppositeSide = false ) : tickType( tickType ) , label( label ) diff --git a/ApplicationLibCode/UserInterface/RiuExpressionContextMenuManager.cpp b/ApplicationLibCode/UserInterface/RiuExpressionContextMenuManager.cpp index 8af449b4df..24060ed745 100644 --- a/ApplicationLibCode/UserInterface/RiuExpressionContextMenuManager.cpp +++ b/ApplicationLibCode/UserInterface/RiuExpressionContextMenuManager.cpp @@ -23,6 +23,10 @@ const std::map> RiuExpressionContextMenuManager::MENU_MAP = { { "Basic Operators", { "+", "-", "*", "/", "x^n" } }, { "Assignment Operators", { ":=" } }, + { "If Statements", + { "VAR_1 := if((X < 0.01), 0.01, X)", + "VAR_1 := if((X < 0.01 AND Y > 2.5), 0.01, X)", + "VAR_1 := if((X < 0.01 OR Y > 2.5), 0.01, X)" } }, { "Scalar Functions", { "avg(x)", "max(x)", "min(x)", "sum(x)" } }, { "Vector Functions", { "abs(x)", "ceil(x)", "floor(x)", "frac(x)", "log(x)", "log10(x)", "pow(x, n)", "round(x)", "sgn(x)", "sqrt(x)", "trunc(x)" } }, diff --git a/ApplicationLibCode/UserInterface/RiuGridCrossQwtPlot.cpp b/ApplicationLibCode/UserInterface/RiuGridCrossQwtPlot.cpp index 6b7b57b3f8..a454e4d149 100644 --- a/ApplicationLibCode/UserInterface/RiuGridCrossQwtPlot.cpp +++ b/ApplicationLibCode/UserInterface/RiuGridCrossQwtPlot.cpp @@ -145,6 +145,7 @@ void RiuGridCrossQwtPlot::updateAnnotationObjects( RimPlotAxisPropertiesInterfac m_annotationTool->attachAnnotationLine( qwtPlot(), annotation->color(), annotation->name(), + annotation->penStyle(), annotation->value(), RiaDefines::Orientation::HORIZONTAL ); } diff --git a/ApplicationLibCode/UserInterface/RiuGuiTheme.cpp b/ApplicationLibCode/UserInterface/RiuGuiTheme.cpp index e7fc123261..c2e2e5aa69 100644 --- a/ApplicationLibCode/UserInterface/RiuGuiTheme.cpp +++ b/ApplicationLibCode/UserInterface/RiuGuiTheme.cpp @@ -906,37 +906,6 @@ void RiuGuiTheme::storeQwtStyleSheetProperty( const QString& plotName, s_qwtPlotItemPropertiesMap[plotName][itemType][itemName].insert( propertyName, value ); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -Qt::PenStyle RiuGuiTheme::getPenStyleFromString( const QString& style ) -{ - if ( style == "solid" ) - { - return Qt::PenStyle::SolidLine; - } - else if ( style == "dash" ) - { - return Qt::PenStyle::DashLine; - } - else if ( style == "dot" ) - { - return Qt::PenStyle::DotLine; - } - else if ( style == "dash-dot" ) - { - return Qt::PenStyle::DashDotLine; - } - else if ( style == "dash-dot-dot" ) - { - return Qt::PenStyle::DashDotDotLine; - } - else - { - return Qt::PenStyle::NoPen; - } -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/UserInterface/RiuGuiTheme.h b/ApplicationLibCode/UserInterface/RiuGuiTheme.h index 052f053fce..c9a79bf034 100644 --- a/ApplicationLibCode/UserInterface/RiuGuiTheme.h +++ b/ApplicationLibCode/UserInterface/RiuGuiTheme.h @@ -61,17 +61,16 @@ class RiuGuiTheme static void styleQwtItem( QwtPicker* item ); private: - static void preparseStyleSheet( RiaDefines::ThemeEnum theme, QString& styleSheet ); - static QString getStyleSheetPath( RiaDefines::ThemeEnum theme ); - static void storeQwtStyleSheetProperty( const QString& plotName, - const QString& itemType, - const QString& itemName, - const QString& propertyName, - const QString& value ); - static Qt::PenStyle getPenStyleFromString( const QString& style ); - static QwtSymbol* cloneMarkerSymbol( QwtPlotMarker* marker ); - static QwtSymbol* cloneCurveSymbol( QwtPlotCurve* curve ); - static void formatStyleSheetForWriting( QString& styleSheet ); + static void preparseStyleSheet( RiaDefines::ThemeEnum theme, QString& styleSheet ); + static QString getStyleSheetPath( RiaDefines::ThemeEnum theme ); + static void storeQwtStyleSheetProperty( const QString& plotName, + const QString& itemType, + const QString& itemName, + const QString& propertyName, + const QString& value ); + static QwtSymbol* cloneMarkerSymbol( QwtPlotMarker* marker ); + static QwtSymbol* cloneCurveSymbol( QwtPlotCurve* curve ); + static void formatStyleSheetForWriting( QString& styleSheet ); private: static RiaDefines::ThemeEnum s_currentTheme; diff --git a/ApplicationLibCode/UserInterface/RiuMainWindow.cpp b/ApplicationLibCode/UserInterface/RiuMainWindow.cpp index 337385b788..7edf92da7f 100644 --- a/ApplicationLibCode/UserInterface/RiuMainWindow.cpp +++ b/ApplicationLibCode/UserInterface/RiuMainWindow.cpp @@ -34,6 +34,7 @@ #include "RimCellEdgeColors.h" #include "RimCommandObject.h" #include "RimEclipseCase.h" +#include "RimEclipseCellColors.h" #include "RimEclipseContourMapView.h" #include "RimEclipseFaultColors.h" #include "RimEclipsePropertyFilter.h" @@ -50,6 +51,7 @@ #include "RimViewWindow.h" #include "RiuDockWidgetTools.h" +#include "RiuMdiArea.h" #include "RiuMdiSubWindow.h" #include "RiuMessagePanel.h" #include "RiuMohrsCirclePlot.h" @@ -92,6 +94,7 @@ #include #include #include +#include #include #include #include @@ -138,6 +141,8 @@ RiuMainWindow::RiuMainWindow() createToolBars(); createDockPanels(); + setAcceptDrops( true ); + if ( m_undoView ) { m_undoView->setStack( caf::CmdExecCommandManager::instance()->undoStack() ); @@ -215,10 +220,7 @@ void RiuMainWindow::initializeGuiNewProjectLoaded() setPdmRoot( RimProject::current() ); restoreTreeViewState(); - if ( subWindowsAreTiled() ) - { - tileSubWindows(); - } + m_mdiArea->applyTiling(); slotRefreshFileActions(); slotRefreshUndoRedoActions(); @@ -450,6 +452,9 @@ void RiuMainWindow::createMenus() importEclipseMenu->addAction( cmdFeatureMgr->action( "RicImportInputEclipseCaseFeature" ) ); importEclipseMenu->addAction( cmdFeatureMgr->action( "RicCreateGridCaseGroupFromFilesFeature" ) ); + QMenu* importRoffMenu = importMenu->addMenu( QIcon( ":/Case48x48.png" ), "Roff Grid Models" ); + importRoffMenu->addAction( cmdFeatureMgr->action( "RicImportRoffCaseFeature" ) ); + importMenu->addSeparator(); QMenu* importSummaryMenu = importMenu->addMenu( QIcon( ":/SummaryCase.svg" ), "Summary Cases" ); importSummaryMenu->addAction( cmdFeatureMgr->action( "RicImportSummaryCaseFeature" ) ); @@ -593,7 +598,7 @@ void RiuMainWindow::createToolBars() { QToolBar* toolbar = addToolBar( tr( "Standard" ) ); toolbar->setObjectName( toolbar->windowTitle() ); - toolbar->addAction( cmdFeatureMgr->action( "RicImportGeneralDataFeature" ) ); + toolbar->addAction( cmdFeatureMgr->action( "RicImportEclipseCaseFeature" ) ); toolbar->addAction( cmdFeatureMgr->action( "RicOpenProjectFeature" ) ); toolbar->addAction( cmdFeatureMgr->action( "RicSaveProjectFeature" ) ); } @@ -1324,61 +1329,69 @@ void RiuMainWindow::selectViewInProjectTreePreservingSubItemSelection( const Rim } } - if ( is3dViewCurrentlySelected && ( previousActiveReservoirView != activatedView ) ) - { - auto tv = getTreeViewWithItem( activatedView ); - if ( !tv ) return; + auto tv = getTreeViewWithItem( activatedView ); + if ( !tv ) return; - QModelIndex newViewModelIndex = tv->findModelIndex( activatedView ); - if ( !newViewModelIndex.isValid() ) return; + QModelIndex newViewModelIndex = tv->findModelIndex( activatedView ); + if ( !newViewModelIndex.isValid() ) return; - QModelIndex newSelectionIndex = newViewModelIndex; + QModelIndex newSelectionIndex = newViewModelIndex; - if ( previousActiveReservoirView && is3dViewCurrentlySelected ) + if ( !is3dViewCurrentlySelected ) + { + std::vector objects; + + activatedView->descendantsIncludingThisOfType( objects ); + if ( !objects.empty() ) { - // Try to select the same entry in the new View, as was selected in the previous + auto candidate = tv->findModelIndex( objects.front() ); + if ( candidate.isValid() ) newSelectionIndex = candidate; + } + } + else if ( previousActiveReservoirView && is3dViewCurrentlySelected ) + { + // Try to select the same entry in the new View, as was selected in the previous - QModelIndex previousViewModelIndex = tv->findModelIndex( previousActiveReservoirView ); - QModelIndex currentSelectionIndex = tv->treeView()->selectionModel()->currentIndex(); + QModelIndex previousViewModelIndex = tv->findModelIndex( previousActiveReservoirView ); + QModelIndex currentSelectionIndex = tv->treeView()->selectionModel()->currentIndex(); - if ( currentSelectionIndex != newViewModelIndex && currentSelectionIndex.isValid() ) - { - QVector route; // Contains all model indices from current selection up to previous view + if ( currentSelectionIndex != newViewModelIndex && currentSelectionIndex.isValid() ) + { + QVector route; // Contains all model indices from current selection up to previous view - QModelIndex tmpModelIndex = currentSelectionIndex; + QModelIndex tmpModelIndex = currentSelectionIndex; - while ( tmpModelIndex.isValid() && tmpModelIndex != previousViewModelIndex ) - { - // NB! Add model index to front of vector to be able to do a for-loop with correct ordering - route.push_front( tmpModelIndex ); + while ( tmpModelIndex.isValid() && tmpModelIndex != previousViewModelIndex ) + { + // NB! Add model index to front of vector to be able to do a for-loop with correct ordering + route.push_front( tmpModelIndex ); - tmpModelIndex = tmpModelIndex.parent(); - } + tmpModelIndex = tmpModelIndex.parent(); + } - // Traverse model indices from new view index to currently selected item - int i; - for ( i = 0; i < route.size(); i++ ) + // Traverse model indices from new view index to currently selected item + int i; + for ( i = 0; i < route.size(); i++ ) + { + QModelIndex tmp = route[i]; + if ( newSelectionIndex.isValid() ) { - QModelIndex tmp = route[i]; - if ( newSelectionIndex.isValid() ) - { - newSelectionIndex = tv->treeView()->model()->index( tmp.row(), tmp.column(), newSelectionIndex ); - } + newSelectionIndex = tv->treeView()->model()->index( tmp.row(), tmp.column(), newSelectionIndex ); } + } - // Use view model index if anything goes wrong - if ( !newSelectionIndex.isValid() ) - { - newSelectionIndex = newViewModelIndex; - } + // Use view model index if anything goes wrong + if ( !newSelectionIndex.isValid() ) + { + newSelectionIndex = newViewModelIndex; } } + } - tv->treeView()->setCurrentIndex( newSelectionIndex ); - if ( newSelectionIndex != newViewModelIndex ) - { - tv->treeView()->setExpanded( newViewModelIndex, true ); - } + tv->treeView()->setCurrentIndex( newSelectionIndex ); + if ( newSelectionIndex != newViewModelIndex ) + { + tv->treeView()->setExpanded( newViewModelIndex, true ); } } @@ -1410,8 +1423,6 @@ void RiuMainWindow::slotBuildWindowActions() caf::CmdFeatureManager* cmdFeatureMgr = caf::CmdFeatureManager::instance(); m_windowMenu->addAction( cmdFeatureMgr->action( "RicShowPlotWindowFeature" ) ); m_windowMenu->addSeparator(); - - m_windowMenu->addSeparator(); } addDefaultEntriesToWindowsMenu(); @@ -1956,153 +1967,72 @@ void RiuMainWindow::customMenuRequested( const QPoint& pos ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiuMainWindow::tileSubWindows() -{ - QMdiArea::WindowOrder currentActivationOrder = m_mdiArea->activationOrder(); - - // Tile Windows so the one with the leftmost left edge gets sorted first. - std::list windowList; - for ( QMdiSubWindow* subWindow : m_mdiArea->subWindowList( currentActivationOrder ) ) - { - windowList.push_back( subWindow ); - } - - // Get the active view linker if there is one - RimProject* proj = RimProject::current(); - RimViewLinkerCollection* viewLinkerCollection = proj->viewLinkerCollection(); - RimViewLinker* viewLinker = nullptr; - if ( viewLinkerCollection && viewLinkerCollection->isActive() ) - { - viewLinker = viewLinkerCollection->viewLinker(); - } - - // Perform stable sort of list so we first sort by window position but retain activation order - // for windows with the same position. - windowList.sort( [this, viewLinker]( QMdiSubWindow* lhs, QMdiSubWindow* rhs ) { - RimViewWindow* lhsViewWindow = findViewWindowFromSubWindow( lhs ); - RimViewWindow* rhsViewWindow = findViewWindowFromSubWindow( rhs ); - RimGridView* lhsGridView = dynamic_cast( lhsViewWindow ); - RimGridView* rhsGridView = dynamic_cast( rhsViewWindow ); - - if ( viewLinker ) - { - if ( viewLinker->isFirstViewDependentOnSecondView( lhsGridView, rhsGridView ) ) - { - return true; - } - else if ( viewLinker->isFirstViewDependentOnSecondView( rhsGridView, lhsGridView ) ) - { - return false; - } - } - if ( lhs->frameGeometry().topLeft().ry() == rhs->frameGeometry().topLeft().ry() ) - { - return lhs->frameGeometry().topLeft().rx() < rhs->frameGeometry().topLeft().rx(); - } - return lhs->frameGeometry().topLeft().ry() < rhs->frameGeometry().topLeft().ry(); - } ); - - // Based on workaround described here - // https://forum.qt.io/topic/50053/qmdiarea-tilesubwindows-always-places-widgets-in-activationhistoryorder-in-subwindowview-mode - - bool prevActivationBlock = isBlockingSubWindowActivatedSignal(); - - QMdiSubWindow* a = m_mdiArea->activeSubWindow(); - - // Force activation order so they end up in the order of the loop. - m_mdiArea->setActivationOrder( QMdiArea::ActivationHistoryOrder ); - - setBlockSubWindowActivatedSignal( true ); - - // Activate in reverse order - for ( auto it = windowList.rbegin(); it != windowList.rend(); ++it ) - { - m_mdiArea->setActiveSubWindow( *it ); - } - - m_mdiArea->tileSubWindows(); - // Set back the original activation order to avoid messing with the standard ordering - m_mdiArea->setActivationOrder( currentActivationOrder ); - m_mdiArea->setActiveSubWindow( a ); - setBlockSubWindowActivatedSignal( prevActivationBlock ); - - storeSubWindowTiling( true ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiuMainWindow::storeSubWindowTiling( bool tiled ) +bool RiuMainWindow::isAnyMdiSubWindowVisible() { - RimProject::current()->setSubWindowsTiledIn3DWindow( tiled ); - refreshViewActions(); + return !m_mdiArea->subWindowList().empty(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiuMainWindow::clearWindowTiling() +RicGridCalculatorDialog* RiuMainWindow::gridCalculatorDialog( bool createIfNotPresent ) { - setBlockSubWindowActivatedSignal( true ); - QMdiArea::WindowOrder currentActivationOrder = m_mdiArea->activationOrder(); - - for ( QMdiSubWindow* subWindow : m_mdiArea->subWindowList( currentActivationOrder ) ) + if ( !m_gridCalculatorDialog && createIfNotPresent ) { - subWindow->hide(); - subWindow->showNormal(); + m_gridCalculatorDialog = std::make_unique( this ); } - storeSubWindowTiling( false ); - setBlockSubWindowActivatedSignal( false ); -} -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiuMainWindow::subWindowsAreTiled() const -{ - if ( RimProject::current() ) - { - return RimProject::current()->subWindowsTiled3DWindow(); - } - return false; + return m_gridCalculatorDialog.get(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RiuMainWindow::isAnyMdiSubWindowVisible() +QStringList RiuMainWindow::defaultDockStateNames() { - return !m_mdiArea->subWindowList().empty(); + QStringList retList = { RiuDockWidgetTools::dockState3DEclipseName(), + RiuDockWidgetTools::dockState3DGeoMechName(), + RiuDockWidgetTools::dockStateHideAll3DWindowName() }; + return retList; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RicGridCalculatorDialog* RiuMainWindow::gridCalculatorDialog( bool createIfNotPresent ) +QStringList RiuMainWindow::windowsMenuFeatureNames() { - if ( !m_gridCalculatorDialog && createIfNotPresent ) - { - m_gridCalculatorDialog = std::make_unique( this ); - } - - return m_gridCalculatorDialog.get(); + return { "RicTileWindowsFeature", "RicTileWindowsVerticallyFeature", "RicTileWindowsHorizontallyFeature" }; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QStringList RiuMainWindow::defaultDockStateNames() +void RiuMainWindow::dragEnterEvent( QDragEnterEvent* event ) { - QStringList retList = { RiuDockWidgetTools::dockState3DEclipseName(), - RiuDockWidgetTools::dockState3DGeoMechName(), - RiuDockWidgetTools::dockStateHideAll3DWindowName() }; - return retList; + if ( event->mimeData()->hasUrls() ) event->acceptProposedAction(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QAction* RiuMainWindow::tileSubWindowsAction() +void RiuMainWindow::dropEvent( QDropEvent* event ) { - return caf::CmdFeatureManager::instance()->action( "RicTileWindowsFeature" ); + if ( !event ) return; + if ( !event->mimeData()->hasUrls() ) return; + + for ( const auto& url : event->mimeData()->urls() ) + { + QString fileName = url.toLocalFile(); + + QFileInfo fi( fileName ); + if ( fi.exists() ) + { + if ( RiaGuiApplication::instance()->openFile( fileName ) ) + { + RiaGuiApplication::instance()->addToRecentFiles( fileName ); + } + } + } + + event->acceptProposedAction(); } diff --git a/ApplicationLibCode/UserInterface/RiuMainWindow.h b/ApplicationLibCode/UserInterface/RiuMainWindow.h index 317d0ea708..91a7040719 100644 --- a/ApplicationLibCode/UserInterface/RiuMainWindow.h +++ b/ApplicationLibCode/UserInterface/RiuMainWindow.h @@ -21,12 +21,12 @@ #pragma once #include "RiuMainWindowBase.h" -#include "RiuMdiArea.h" #include "cafPdmObjectHandle.h" #include #include +#include #include #include @@ -51,6 +51,7 @@ class RiuResultQwtPlot; class RiuRelativePermeabilityPlotPanel; class RiuPvtPlotPanel; class RiuMohrsCirclePlot; +class RiuMdiArea; class RicGridCalculatorDialog; @@ -115,11 +116,6 @@ class RiuMainWindow : public RiuMainWindowBase void refreshDrawStyleActions(); - void tileSubWindows() override; - void storeSubWindowTiling( bool tiled ) override; - void clearWindowTiling() override; - - bool subWindowsAreTiled() const override; bool isAnyMdiSubWindowVisible(); QMdiSubWindow* findMdiSubWindow( QWidget* viewer ) override; RimViewWindow* findViewWindowFromSubWindow( QMdiSubWindow* lhs ); @@ -140,7 +136,10 @@ class RiuMainWindow : public RiuMainWindowBase protected: void closeEvent( QCloseEvent* event ) override; QStringList defaultDockStateNames() override; - QAction* tileSubWindowsAction() override; + QStringList windowsMenuFeatureNames() override; + + void dragEnterEvent( QDragEnterEvent* event ) override; + void dropEvent( QDropEvent* event ) override; private: void createActions(); diff --git a/ApplicationLibCode/UserInterface/RiuMainWindowBase.cpp b/ApplicationLibCode/UserInterface/RiuMainWindowBase.cpp index ed719b4673..8e15de0cf0 100644 --- a/ApplicationLibCode/UserInterface/RiuMainWindowBase.cpp +++ b/ApplicationLibCode/UserInterface/RiuMainWindowBase.cpp @@ -21,6 +21,7 @@ #include "RiaApplication.h" #include "RiaDefines.h" #include "RiaPreferences.h" +#include "RiaRegressionTestRunner.h" #include "RiaVersionInfo.h" #include "RiuDockWidgetTools.h" @@ -63,6 +64,7 @@ RiuMainWindowBase::RiuMainWindowBase() , m_windowMenu( nullptr ) , m_mdiArea( nullptr ) { + ads::CDockManager::setAutoHideConfigFlags( ads::CDockManager::DefaultAutoHideConfig ); m_dockManager = new ads::CDockManager( this ); if ( RiaPreferences::current()->useUndoRedo() && RiaApplication::enableDevelopmentFeatures() ) @@ -104,6 +106,14 @@ ads::CDockManager* RiuMainWindowBase::dockManager() const return m_dockManager; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiuMdiArea* RiuMainWindowBase::mdiArea() +{ + return m_mdiArea; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -142,7 +152,6 @@ void RiuMainWindowBase::loadWinGeoAndDockToolBarLayout() QVariant winGeo = settings.value( QString( "%1/winGeometry" ).arg( registryFolderName() ) ); QVariant toolbarLayout = settings.value( QString( "%1/toolBarLayout" ).arg( registryFolderName() ) ); - QVariant dockState = settings.value( QString( "%1/dockLayout" ).arg( registryFolderName() ) ); if ( winGeo.isValid() ) { @@ -155,16 +164,24 @@ void RiuMainWindowBase::loadWinGeoAndDockToolBarLayout() } } - bool dockingOk = false; - - if ( dockState.isValid() ) + if ( !RiaRegressionTestRunner::instance()->isRunningRegressionTests() ) { - dockingOk = m_dockManager->restoreState( dockState.toByteArray(), DOCKSTATE_VERSION ); - } + // Performance of m_dockManager->restoreState() is very bad is degrading as more and more regression tests are + // launched. Disable restore of state for regression test. - if ( !dockingOk ) - { - m_dockManager->restoreState( RiuDockWidgetTools::defaultDockState( defaultDockStateNames()[0] ), DOCKSTATE_VERSION ); + bool dockingOk = false; + QVariant dockState = settings.value( QString( "%1/dockLayout" ).arg( registryFolderName() ) ); + + if ( dockState.isValid() ) + { + dockingOk = m_dockManager->restoreState( dockState.toByteArray(), DOCKSTATE_VERSION ); + } + + if ( !dockingOk ) + { + m_dockManager->restoreState( RiuDockWidgetTools::defaultDockState( defaultDockStateNames()[0] ), + DOCKSTATE_VERSION ); + } } settings.beginGroup( registryFolderName() ); @@ -325,7 +342,7 @@ bool RiuMainWindowBase::isBlockingViewSelectionOnSubWindowActivated() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiuMainWindowBase::removeViewerFromMdiArea( QMdiArea* mdiArea, QWidget* viewer ) +void RiuMainWindowBase::removeViewerFromMdiArea( RiuMdiArea* mdiArea, QWidget* viewer ) { bool removedSubWindowWasActive = false; @@ -362,10 +379,8 @@ void RiuMainWindowBase::removeViewerFromMdiArea( QMdiArea* mdiArea, QWidget* vie { mdiArea->currentSubWindow()->showMaximized(); } - else if ( subWindowsAreTiled() ) - { - tileSubWindows(); - } + + mdiArea->applyTiling(); } } @@ -400,13 +415,14 @@ void RiuMainWindowBase::slotDockWidgetToggleViewActionTriggered() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiuMainWindowBase::initializeSubWindow( QMdiArea* mdiArea, +void RiuMainWindowBase::initializeSubWindow( RiuMdiArea* mdiArea, QMdiSubWindow* mdiSubWindow, const QPoint& subWindowPos, const QSize& subWindowSize ) { - bool initialStateTiled = subWindowsAreTiled(); - bool initialStateMaximized = false; + bool initialStateMaximized = false; + auto initialState3dWindow = RimProject::current()->subWindowsTileMode3DWindow(); + auto initialStatePlotWindow = RimProject::current()->subWindowsTileModePlotWindow(); if ( m_showFirstVisibleWindowMaximized && mdiArea->subWindowList().empty() ) { @@ -434,10 +450,14 @@ void RiuMainWindowBase::initializeSubWindow( QMdiArea* mdiArea, else { mdiSubWindow->showNormal(); - if ( initialStateTiled ) + + if ( !isBlockingSubWindowActivatedSignal() ) { - tileSubWindows(); + RimProject::current()->setSubWindowsTileMode3DWindow( initialState3dWindow ); + RimProject::current()->setSubWindowsTileModePlotWindow( initialStatePlotWindow ); } + + mdiArea->applyTiling(); } } @@ -753,7 +773,14 @@ void RiuMainWindowBase::addDefaultEntriesToWindowsMenu() QAction* closeAllSubWindowsAction = new QAction( "Close All Windows", this ); connect( closeAllSubWindowsAction, SIGNAL( triggered() ), m_mdiArea, SLOT( closeAllSubWindows() ) ); - m_windowMenu->addAction( tileSubWindowsAction() ); + caf::CmdFeatureManager* cmdFeatureMgr = caf::CmdFeatureManager::instance(); + + auto featureNames = windowsMenuFeatureNames(); + for ( const auto& name : featureNames ) + { + m_windowMenu->addAction( cmdFeatureMgr->action( name ) ); + } + m_windowMenu->addAction( cascadeWindowsAction ); m_windowMenu->addAction( closeAllSubWindowsAction ); } diff --git a/ApplicationLibCode/UserInterface/RiuMainWindowBase.h b/ApplicationLibCode/UserInterface/RiuMainWindowBase.h index 63ee1858b8..8aa596b7d3 100644 --- a/ApplicationLibCode/UserInterface/RiuMainWindowBase.h +++ b/ApplicationLibCode/UserInterface/RiuMainWindowBase.h @@ -27,7 +27,7 @@ #include #include -class QMdiArea; +class RiuMdiArea; struct RimMdiWindowGeometry; class RiuMdiArea; @@ -83,11 +83,6 @@ class RiuMainWindowBase : public QMainWindow void enableShowFirstVisibleMdiWindowMaximized( bool enable ); - virtual void tileSubWindows() = 0; - virtual void storeSubWindowTiling( bool tiled ) = 0; - virtual void clearWindowTiling() = 0; - virtual bool subWindowsAreTiled() const = 0; - void setBlockSubWindowActivatedSignal( bool block ); bool isBlockingSubWindowActivatedSignal() const; @@ -96,10 +91,12 @@ class RiuMainWindowBase : public QMainWindow ads::CDockManager* dockManager() const; + RiuMdiArea* mdiArea(); + protected: void createTreeViews( int numberOfTrees ); - void removeViewerFromMdiArea( QMdiArea* mdiArea, QWidget* viewer ); - void initializeSubWindow( QMdiArea* mdiArea, + void removeViewerFromMdiArea( RiuMdiArea* mdiArea, QWidget* viewer ); + void initializeSubWindow( RiuMdiArea* mdiArea, QMdiSubWindow* mdiSubWindow, const QPoint& subWindowPos, const QSize& subWindowSize ); @@ -114,7 +111,7 @@ class RiuMainWindowBase : public QMainWindow virtual QStringList defaultDockStateNames() = 0; - virtual QAction* tileSubWindowsAction() = 0; + virtual QStringList windowsMenuFeatureNames() = 0; protected slots: void slotDockWidgetToggleViewActionTriggered(); diff --git a/ApplicationLibCode/UserInterface/RiuMdiArea.cpp b/ApplicationLibCode/UserInterface/RiuMdiArea.cpp index b2895b5eb0..5cadbfe0ba 100644 --- a/ApplicationLibCode/UserInterface/RiuMdiArea.cpp +++ b/ApplicationLibCode/UserInterface/RiuMdiArea.cpp @@ -15,8 +15,11 @@ // for more details. // ///////////////////////////////////////////////////////////////////////////////// + #include "RiuMdiArea.h" +#include "RimProject.h" + #include "RiuMainWindow.h" #include "RiuMdiSubWindow.h" #include "RiuPlotMainWindow.h" @@ -36,6 +39,24 @@ RiuMdiArea::~RiuMdiArea() { } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaDefines::WindowTileMode RiuMdiArea::tileMode() const +{ + auto proj = RimProject::current(); + if ( proj ) + { + auto* mainWindow = dynamic_cast( window() ); + if ( mainWindow ) return proj->subWindowsTileMode3DWindow(); + + auto* plotMainWindow = dynamic_cast( window() ); + if ( plotMainWindow ) return proj->subWindowsTileModePlotWindow(); + } + + return RiaDefines::WindowTileMode::UNDEFINED; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -63,82 +84,109 @@ std::list RiuMdiArea::subWindowListSortedByPosition() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiuMdiArea::resizeEvent( QResizeEvent* resizeEvent ) +std::list RiuMdiArea::subWindowListSortedByVerticalPosition() { - if ( subWindowsAreTiled() ) + std::list windowList; + for ( QMdiSubWindow* subWindow : subWindowList( QMdiArea::CreationOrder ) ) { - for ( auto subWindow : subWindowList() ) + windowList.push_back( subWindow ); + } + + windowList.sort( [this]( QMdiSubWindow* lhs, QMdiSubWindow* rhs ) { + if ( lhs->frameGeometry().topLeft().ry() == rhs->frameGeometry().topLeft().ry() ) { - auto riuWindow = dynamic_cast( subWindow ); - riuWindow->blockTilingChanges( true ); + return lhs->frameGeometry().topLeft().rx() < rhs->frameGeometry().topLeft().rx(); } + return lhs->frameGeometry().topLeft().ry() < rhs->frameGeometry().topLeft().ry(); + } ); - RiuMainWindowBase* mainWindow = dynamic_cast( window() ); - mainWindow->setBlockSubWindowActivatedSignal( true ); + return windowList; +} - // Workaround for Qt bug #51761: https://bugreports.qt.io/browse/QTBUG-51761 - // Set the first window to be the active window then perform resize event and set back. - auto a = activeSubWindow(); - setActiveSubWindow( subWindowListSortedByPosition().front() ); +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuMdiArea::tileWindowsHorizontally() +{ + QPoint position( 0, 0 ); - QMdiArea::resizeEvent( resizeEvent ); - tileSubWindows(); + for ( auto* window : subWindowListSortedByPosition() ) + { + QRect rect( 0, 0, width() / static_cast( subWindowListSortedByPosition().size() ), height() ); - setActiveSubWindow( a ); + window->setGeometry( rect ); + window->move( position ); + position.setX( position.x() + window->width() ); + } +} - mainWindow->setBlockSubWindowActivatedSignal( false ); +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuMdiArea::tileWindowsVertically() +{ + auto windowList = subWindowListSortedByVerticalPosition(); - for ( auto subWindow : subWindowList() ) - { - auto riuWindow = dynamic_cast( subWindow ); - riuWindow->blockTilingChanges( false ); - } - } - else + QPoint position( 0, 0 ); + for ( auto* window : windowList ) { - QMdiArea::resizeEvent( resizeEvent ); + QRect rect( 0, 0, width(), height() / static_cast( windowList.size() ) ); + + window->setGeometry( rect ); + window->move( position ); + position.setY( position.y() + window->height() ); } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiuMdiArea::moveEvent( QMoveEvent* event ) +void RiuMdiArea::tileWindowsDefault() { - for ( auto subWindow : subWindowList() ) - { - auto riuWindow = dynamic_cast( subWindow ); - riuWindow->blockTilingChanges( true ); - } + tileSubWindows(); +} - QMdiArea::moveEvent( event ); +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuMdiArea::resizeEvent( QResizeEvent* resizeEvent ) +{ + applyTiling(); - for ( auto subWindow : subWindowList() ) - { - auto riuWindow = dynamic_cast( subWindow ); - riuWindow->blockTilingChanges( false ); - } + QMdiArea::resizeEvent( resizeEvent ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RiuMdiArea::subWindowsAreTiled() const +void RiuMdiArea::applyTiling() { - RiuMainWindow* mainWindow = dynamic_cast( window() ); - - if ( mainWindow ) + for ( auto subWindow : subWindowList() ) { - return mainWindow->subWindowsAreTiled() && subWindowList().size() > 0; + auto riuWindow = dynamic_cast( subWindow ); + riuWindow->blockTilingChanges( true ); } - else + + switch ( tileMode() ) { - RiuPlotMainWindow* plotWindow = dynamic_cast( window() ); - if ( plotWindow ) - { - return plotWindow->subWindowsAreTiled() && subWindowList().size() > 0; - } + case RiaDefines::WindowTileMode::UNDEFINED: + break; + case RiaDefines::WindowTileMode::DEFAULT: + tileWindowsDefault(); + break; + case RiaDefines::WindowTileMode::VERTICAL: + tileWindowsVertically(); + break; + case RiaDefines::WindowTileMode::HORIZONTAL: + tileWindowsHorizontally(); + break; + default: + break; } - return false; + for ( auto subWindow : subWindowList() ) + { + auto riuWindow = dynamic_cast( subWindow ); + riuWindow->blockTilingChanges( false ); + } } diff --git a/ApplicationLibCode/UserInterface/RiuMdiArea.h b/ApplicationLibCode/UserInterface/RiuMdiArea.h index ff78ff4bc9..45af29deb3 100644 --- a/ApplicationLibCode/UserInterface/RiuMdiArea.h +++ b/ApplicationLibCode/UserInterface/RiuMdiArea.h @@ -18,8 +18,9 @@ #pragma once -#include +#include "RiaPlotDefines.h" +#include #include class QMdiSubWindow; @@ -32,11 +33,16 @@ class RiuMdiArea : public QMdiArea RiuMdiArea( QWidget* parent = nullptr ); ~RiuMdiArea() override; - std::list subWindowListSortedByPosition(); + RiaDefines::WindowTileMode tileMode() const; + void applyTiling(); -protected: +private: void resizeEvent( QResizeEvent* resizeEvent ) override; - void moveEvent( QMoveEvent* event ) override; - bool subWindowsAreTiled() const; + std::list subWindowListSortedByPosition(); + std::list subWindowListSortedByVerticalPosition(); + + void tileWindowsHorizontally(); + void tileWindowsVertically(); + void tileWindowsDefault(); }; diff --git a/ApplicationLibCode/UserInterface/RiuMdiSubWindow.cpp b/ApplicationLibCode/UserInterface/RiuMdiSubWindow.cpp index b7c7d9a616..aeb563e00d 100644 --- a/ApplicationLibCode/UserInterface/RiuMdiSubWindow.cpp +++ b/ApplicationLibCode/UserInterface/RiuMdiSubWindow.cpp @@ -19,8 +19,10 @@ #include "RiuMdiSubWindow.h" #include "RiaGuiApplication.h" +#include "RiaPlotDefines.h" #include "Rim3dView.h" +#include "RimProject.h" #include "RimSummaryPlot.h" #include "RimWellLogPlot.h" @@ -30,8 +32,6 @@ #include -#include - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -128,17 +128,7 @@ void RiuMdiSubWindow::resizeEvent( QResizeEvent* resizeEvent ) m_normalWindowGeometry = frameGeometry(); } - if ( !m_blockTilingChanges ) - { - if ( window() == RiaGuiApplication::instance()->mainWindow() ) - { - RiaGuiApplication::instance()->mainWindow()->storeSubWindowTiling( false ); - } - else if ( window() == RiaGuiApplication::instance()->mainPlotWindow() ) - { - RiaGuiApplication::instance()->mainPlotWindow()->storeSubWindowTiling( false ); - } - } + checkAndResetTilingState(); QMdiSubWindow::resizeEvent( resizeEvent ); } @@ -153,17 +143,26 @@ void RiuMdiSubWindow::moveEvent( QMoveEvent* moveEvent ) m_normalWindowGeometry = frameGeometry(); } - if ( !m_blockTilingChanges ) - { - if ( window() == RiaGuiApplication::instance()->mainWindow() ) - { - RiaGuiApplication::instance()->mainWindow()->storeSubWindowTiling( false ); - } - else if ( window() == RiaGuiApplication::instance()->mainPlotWindow() ) - { - RiaGuiApplication::instance()->mainPlotWindow()->storeSubWindowTiling( false ); - } - } + checkAndResetTilingState(); QMdiSubWindow::moveEvent( moveEvent ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuMdiSubWindow::checkAndResetTilingState() +{ + if ( m_blockTilingChanges ) return; + + if ( window() == RiaGuiApplication::instance()->mainWindow() && + !RiaGuiApplication::instance()->mainWindow()->isBlockingSubWindowActivatedSignal() ) + { + RimProject::current()->setSubWindowsTileMode3DWindow( RiaDefines::WindowTileMode::UNDEFINED ); + } + else if ( window() == RiaGuiApplication::instance()->mainPlotWindow() && + !RiaGuiApplication::instance()->mainPlotWindow()->isBlockingSubWindowActivatedSignal() ) + { + RimProject::current()->setSubWindowsTileModePlotWindow( RiaDefines::WindowTileMode::UNDEFINED ); + } +} diff --git a/ApplicationLibCode/UserInterface/RiuMdiSubWindow.h b/ApplicationLibCode/UserInterface/RiuMdiSubWindow.h index 3bcd57489f..4e69734269 100644 --- a/ApplicationLibCode/UserInterface/RiuMdiSubWindow.h +++ b/ApplicationLibCode/UserInterface/RiuMdiSubWindow.h @@ -25,7 +25,7 @@ class RiuMdiSubWindow : public QMdiSubWindow { Q_OBJECT public: - RiuMdiSubWindow( QWidget* parent = nullptr, Qt::WindowFlags flags = nullptr ); + RiuMdiSubWindow( QWidget* parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags() ); ~RiuMdiSubWindow() override; @@ -33,11 +33,13 @@ class RiuMdiSubWindow : public QMdiSubWindow void blockTilingChanges( bool block ); -protected: +private: void closeEvent( QCloseEvent* event ) override; void resizeEvent( QResizeEvent* resizeEvent ) override; void moveEvent( QMoveEvent* moveEvent ) override; + void checkAndResetTilingState(); + private: QRect m_normalWindowGeometry; bool m_blockTilingChanges; diff --git a/ApplicationLibCode/UserInterface/RiuMultiPlotPage.cpp b/ApplicationLibCode/UserInterface/RiuMultiPlotPage.cpp index 7527605b50..64869ecce2 100644 --- a/ApplicationLibCode/UserInterface/RiuMultiPlotPage.cpp +++ b/ApplicationLibCode/UserInterface/RiuMultiPlotPage.cpp @@ -25,13 +25,10 @@ #include "RiaPlotWindowRedrawScheduler.h" #include "RiaPreferences.h" -#include "WellLogCommands/RicWellLogPlotTrackFeatureImpl.h" - #include "RimContextCommandBuilder.h" #include "RimMultiPlot.h" #include "RimPlotCurve.h" #include "RimPlotWindow.h" -#include "RimWellLogTrack.h" #include "RiuDraggableOverlayFrame.h" #include "RiuMainWindow.h" @@ -109,7 +106,7 @@ RiuMultiPlotPage::RiuMultiPlotPage( RimPlotWindow* plotDefinition, QWidget* pare m_gridLayout = new QGridLayout( m_plotWidgetFrame ); m_gridLayout->setContentsMargins( 0, 0, 0, 0 ); - m_gridLayout->setSpacing( 5 ); + m_gridLayout->setSpacing( 0 ); new RiuPlotObjectPicker( m_plotTitle, m_plotDefinition ); @@ -193,7 +190,12 @@ void RiuMultiPlotPage::insertPlot( RiuPlotWidget* plotWidget, size_t index ) legend->setMaxColumns( legendColumns ); legend->horizontalScrollBar()->setVisible( false ); legend->verticalScrollBar()->setVisible( false ); - legend->setDefaultItemMode( QwtLegendData::Clickable ); + + // The legend item mode must be set before the widget is created + // See https://qwt.sourceforge.io/class_qwt_legend.html#af977ff3e749f8281ee8ad4b926542b50 + auto legendItemMode = m_plotDefinition->legendItemsClickable() ? QwtLegendData::Clickable : QwtLegendData::ReadOnly; + legend->setDefaultItemMode( legendItemMode ); + if ( qwtPlotWidget ) { legend->connect( qwtPlotWidget->qwtPlot(), @@ -448,6 +450,7 @@ void RiuMultiPlotPage::contextMenuEvent( QContextMenuEvent* event ) menuBuilder << "RicShowPlotDataFeature"; menuBuilder << "RicShowContributingWellsFromPlotFeature"; + menuBuilder << "RicNewDefaultSummaryPlotFeature"; menuBuilder.appendToMenu( &menu ); @@ -744,11 +747,17 @@ void RiuMultiPlotPage::addLegendWidget( RiuPlotWidget* plotWidget, } else { - CAF_ASSERT( m_plotDefinition->legendPosition() == RimPlotWindow::LegendPosition::INSIDE ); + auto anchor = RiuDraggableOverlayFrame::AnchorCorner::TopRight; + + if ( m_plotDefinition->legendPosition() == RimPlotWindow::LegendPosition::INSIDE_UPPER_RIGHT ) + anchor = RiuDraggableOverlayFrame::AnchorCorner::TopRight; + else if ( m_plotDefinition->legendPosition() == RimPlotWindow::LegendPosition::INSIDE_UPPER_LEFT ) + anchor = RiuDraggableOverlayFrame::AnchorCorner::TopLeft; + auto overlayFrame = new RiuQwtLegendOverlayContentFrame; overlayFrame->setLegend( legend ); legendFrame->setContentFrame( overlayFrame ); - legendFrame->setAnchorCorner( RiuDraggableOverlayFrame::AnchorCorner::TopRight ); + legendFrame->setAnchorCorner( anchor ); plotWidget->removeOverlayFrame( legendFrame ); plotWidget->addOverlayFrame( legendFrame ); } @@ -769,7 +778,8 @@ void RiuMultiPlotPage::updateLegendVisibility( RiuPlotWidget* plotWid updateLegendFont( legend ); legend->show(); - if ( m_plotDefinition->legendPosition() == RimPlotWindow::LegendPosition::INSIDE ) + if ( m_plotDefinition->legendPosition() == RimPlotWindow::LegendPosition::INSIDE_UPPER_LEFT || + m_plotDefinition->legendPosition() == RimPlotWindow::LegendPosition::INSIDE_UPPER_RIGHT ) { plotWidget->addOverlayFrame( legendFrame ); legendFrame->show(); @@ -807,7 +817,6 @@ void RiuMultiPlotPage::setDefaultAxisProperties( RiuPlotWidget* plotWidget, int { plotWidget->setAxisLabelsAndTicksEnabled( RiuPlotAxis::defaultLeft(), showYAxis( row, column ), showYAxis( row, column ) ); plotWidget->setAxisTitleEnabled( RiuPlotAxis::defaultLeft(), showYAxis( row, column ) ); - plotWidget->setAxesFontsAndAlignment( m_axisTitleFontSize, m_axisValueFontSize ); } //-------------------------------------------------------------------------------------------------- @@ -817,8 +826,15 @@ void RiuMultiPlotPage::adjustHeadingSpacing( RiuPlotWidget* plotWidget ) { // Adjust the space below a graph to make sure the heading of the row below is closest to the // corresponding graph + + if ( !m_plotDefinition ) return; + + int bottomMargin = m_plotDefinition->bottomMargin(); + if ( bottomMargin < 0 ) return; + auto margins = plotWidget->contentsMargins(); - margins.setBottom( 40 ); + + margins.setBottom( bottomMargin ); plotWidget->setContentsMargins( margins ); } diff --git a/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.cpp b/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.cpp index 51fa04a752..c1f7460352 100644 --- a/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.cpp +++ b/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.cpp @@ -18,6 +18,7 @@ #include "RiuPlotAnnotationTool.h" +#include "RimPlotAxisAnnotation.h" #include "RiuGuiTheme.h" #include "cafCategoryMapper.h" @@ -191,6 +192,7 @@ void RiuPlotAnnotationTool::attachWellPicks( QwtPlot* plot, void RiuPlotAnnotationTool::attachAnnotationLine( QwtPlot* plot, const QColor& color, const QString& annotationText, + Qt::PenStyle penStyle, const double position, RiaDefines::Orientation orientation ) { @@ -204,11 +206,29 @@ void RiuPlotAnnotationTool::attachAnnotationLine( QwtPlot* plot, textColor = RiuGuiTheme::getColorByVariableName( "textColor" ); } - RiuPlotAnnotationTool::setLineProperties( line, annotationText, orientation, position, Qt::SolidLine, color, textColor ); + RiuPlotAnnotationTool::setLineProperties( line, annotationText, orientation, position, penStyle, color, textColor ); m_plotItems.push_back( line ); line->attach( m_plot ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuPlotAnnotationTool::attachAnnotation( QwtPlot* plot, + RimPlotAxisAnnotation* annotation, + RiaDefines::Orientation orientation ) +{ + if ( annotation->annotationType() == RimPlotAxisAnnotation::AnnotationType::LINE ) + { + attachAnnotationLine( plot, + annotation->color(), + annotation->name(), + annotation->penStyle(), + annotation->value(), + orientation ); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.h b/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.h index 6c6da109b3..68957eefc4 100644 --- a/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.h +++ b/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.h @@ -32,6 +32,7 @@ class QString; class QwtPlot; +class RimPlotAxisAnnotation; class RiuPlotAnnotationTool { @@ -55,9 +56,12 @@ class RiuPlotAnnotationTool void attachAnnotationLine( QwtPlot* plot, const QColor& color, const QString& annotationText, + Qt::PenStyle penStyle, const double position, RiaDefines::Orientation orientation ); + void attachAnnotation( QwtPlot* plot, RimPlotAxisAnnotation* annotation, RiaDefines::Orientation orientation ); + void attachAnnotationRange( QwtPlot* plot, const QColor& color, const QString& annotationText, diff --git a/ApplicationLibCode/UserInterface/RiuPlotCurveInfoTextProvider.h b/ApplicationLibCode/UserInterface/RiuPlotCurveInfoTextProvider.h index 70fe084dc9..32604339f4 100644 --- a/ApplicationLibCode/UserInterface/RiuPlotCurveInfoTextProvider.h +++ b/ApplicationLibCode/UserInterface/RiuPlotCurveInfoTextProvider.h @@ -30,4 +30,5 @@ class RiuPlotCurveInfoTextProvider { public: virtual QString curveInfoText( RiuPlotCurve* curve ) const = 0; + virtual QString additionalText( RiuPlotCurve* curve, int sampleIndex ) const { return {}; }; }; diff --git a/ApplicationLibCode/UserInterface/RiuPlotMainWindow.cpp b/ApplicationLibCode/UserInterface/RiuPlotMainWindow.cpp index 1064b135f5..769edad1a8 100644 --- a/ApplicationLibCode/UserInterface/RiuPlotMainWindow.cpp +++ b/ApplicationLibCode/UserInterface/RiuPlotMainWindow.cpp @@ -50,6 +50,7 @@ #include "RiuDockWidgetTools.h" #include "RiuDragDrop.h" +#include "RiuMdiArea.h" #include "RiuMdiSubWindow.h" #include "RiuMessagePanel.h" #include "RiuMultiPlotPage.h" @@ -198,10 +199,7 @@ void RiuPlotMainWindow::initializeGuiNewProjectLoaded() } } - if ( subWindowsAreTiled() ) - { - tileSubWindows(); - } + m_mdiArea->applyTiling(); if ( m_activePlotViewWindow && m_activePlotViewWindow->viewWidget() && !RiaRegressionTestRunner::instance()->isRunningRegressionTests() ) @@ -407,7 +405,7 @@ QStringList RiuPlotMainWindow::toolbarCommandIds( const QString& toolbarName ) if ( toolbarName.isEmpty() || toolbarName == "Standard" ) { - commandIds << "RicImportGeneralDataFeature"; + commandIds << "RicImportEclipseCaseFeature"; commandIds << "RicImportSummaryCaseFeature"; commandIds << "RicImportEnsembleFeature"; commandIds << "RicOpenProjectFeature"; @@ -1061,91 +1059,6 @@ void RiuPlotMainWindow::customMenuRequested( const QPoint& pos ) } } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiuPlotMainWindow::tileSubWindows() -{ - QMdiArea::WindowOrder currentActivationOrder = m_mdiArea->activationOrder(); - - std::list windowList; - for ( QMdiSubWindow* subWindow : m_mdiArea->subWindowList( currentActivationOrder ) ) - { - windowList.push_back( subWindow ); - } - - // Perform stable sort of list so we first sort by window position but retain activation order - // for windows with the same position. - windowList.sort( []( const QMdiSubWindow* lhs, const QMdiSubWindow* rhs ) { - if ( lhs->frameGeometry().topLeft().ry() == rhs->frameGeometry().topLeft().ry() ) - { - return lhs->frameGeometry().topLeft().rx() < rhs->frameGeometry().topLeft().rx(); - } - return lhs->frameGeometry().topLeft().ry() < rhs->frameGeometry().topLeft().ry(); - } ); - - // Based on workaround described here - // https://forum.qt.io/topic/50053/qmdiarea-tilesubwindows-always-places-widgets-in-activationhistoryorder-in-subwindowview-mode - - bool prevActivationBlock = isBlockingSubWindowActivatedSignal(); - // Force activation order so they end up in the order of the loop. - m_mdiArea->setActivationOrder( QMdiArea::ActivationHistoryOrder ); - QMdiSubWindow* a = m_mdiArea->activeSubWindow(); - - setBlockSubWindowActivatedSignal( true ); - // Activate in reverse order - for ( auto it = windowList.rbegin(); it != windowList.rend(); ++it ) - { - m_mdiArea->setActiveSubWindow( *it ); - } - - m_mdiArea->tileSubWindows(); - // Set back the original activation order to avoid messing with the standard ordering - m_mdiArea->setActivationOrder( currentActivationOrder ); - m_mdiArea->setActiveSubWindow( a ); - setBlockSubWindowActivatedSignal( prevActivationBlock ); - - storeSubWindowTiling( true ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiuPlotMainWindow::storeSubWindowTiling( bool tiled ) -{ - RimProject::current()->setSubWindowsTiledInPlotWindow( tiled ); - refreshToolbars(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiuPlotMainWindow::clearWindowTiling() -{ - setBlockSubWindowActivatedSignal( true ); - QMdiArea::WindowOrder currentActivationOrder = m_mdiArea->activationOrder(); - - for ( QMdiSubWindow* subWindow : m_mdiArea->subWindowList( currentActivationOrder ) ) - { - subWindow->hide(); - subWindow->showNormal(); - } - storeSubWindowTiling( false ); - setBlockSubWindowActivatedSignal( false ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiuPlotMainWindow::subWindowsAreTiled() const -{ - if ( RimProject::current() ) - { - return RimProject::current()->subWindowsTiledPlotWindow(); - } - return false; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1190,31 +1103,31 @@ QStringList RiuPlotMainWindow::defaultDockStateNames() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiuPlotMainWindow::enable3DSelectionLink( bool enable ) +QStringList RiuPlotMainWindow::windowsMenuFeatureNames() { - m_selection3DLinkEnabled = enable; + return { "RicTilePlotWindowsFeature", "RicTilePlotWindowsVerticallyFeature", "RicTilePlotWindowsHorizontallyFeature" }; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RiuPlotMainWindow::selection3DLinkEnabled() +void RiuPlotMainWindow::enable3DSelectionLink( bool enable ) { - return m_selection3DLinkEnabled; + m_selection3DLinkEnabled = enable; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiuPlotMainWindow::slotToggleSelectionLink() +bool RiuPlotMainWindow::selection3DLinkEnabled() { - m_selection3DLinkEnabled = !m_selection3DLinkEnabled; + return m_selection3DLinkEnabled; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QAction* RiuPlotMainWindow::tileSubWindowsAction() +void RiuPlotMainWindow::slotToggleSelectionLink() { - return caf::CmdFeatureManager::instance()->action( "RicTilePlotWindowsFeature" ); + m_selection3DLinkEnabled = !m_selection3DLinkEnabled; } diff --git a/ApplicationLibCode/UserInterface/RiuPlotMainWindow.h b/ApplicationLibCode/UserInterface/RiuPlotMainWindow.h index 5883b7af49..29f5cbb81c 100644 --- a/ApplicationLibCode/UserInterface/RiuPlotMainWindow.h +++ b/ApplicationLibCode/UserInterface/RiuPlotMainWindow.h @@ -19,10 +19,10 @@ #pragma once #include "RiuMainWindowBase.h" -#include "RiuMdiArea.h" #include "cafPdmPointer.h" +#include #include #include @@ -76,11 +76,6 @@ class RiuPlotMainWindow : public RiuMainWindowBase void enable3DSelectionLink( bool enable ); bool selection3DLinkEnabled(); - void tileSubWindows() override; - void storeSubWindowTiling( bool tiled ) override; - void clearWindowTiling() override; - bool subWindowsAreTiled() const override; - bool isAnyMdiSubWindowVisible(); QMdiSubWindow* findMdiSubWindow( QWidget* viewer ) override; RimViewWindow* findViewWindowFromSubWindow( QMdiSubWindow* subWindow ); @@ -106,7 +101,7 @@ class RiuPlotMainWindow : public RiuMainWindowBase void dropEvent( QDropEvent* event ) override; QStringList defaultDockStateNames() override; - QAction* tileSubWindowsAction() override; + QStringList windowsMenuFeatureNames() override; private: void setPdmRoot( caf::PdmObject* pdmRoot ); diff --git a/ApplicationLibCode/UserInterface/RiuPlotWidget.cpp b/ApplicationLibCode/UserInterface/RiuPlotWidget.cpp index b1e1ff5ee2..e91fc627f7 100644 --- a/ApplicationLibCode/UserInterface/RiuPlotWidget.cpp +++ b/ApplicationLibCode/UserInterface/RiuPlotWidget.cpp @@ -264,6 +264,10 @@ bool RiuPlotWidget::handleDragDropEvent( QEvent* event ) if ( RiuDragDrop::handleGenericDropEvent( event, objects ) ) { if ( m_plotDefinition ) m_plotDefinition->handleDroppedObjects( objects ); + + RiuPlotMainWindow* mainPlotWindow = RiaGuiApplication::instance()->mainPlotWindow(); + if ( mainPlotWindow ) mainPlotWindow->updateMultiPlotToolBar(); + return true; } diff --git a/ApplicationLibCode/UserInterface/RiuPlotWidget.h b/ApplicationLibCode/UserInterface/RiuPlotWidget.h index a900b711e8..3994f93fff 100644 --- a/ApplicationLibCode/UserInterface/RiuPlotWidget.h +++ b/ApplicationLibCode/UserInterface/RiuPlotWidget.h @@ -115,8 +115,8 @@ class RiuPlotWidget : public QWidget, public RiuInterfaceToViewWindow virtual void setPlotTitle( const QString& plotTitle ) = 0; const QString& plotTitle() const; - void setPlotTitleEnabled( bool enabled ); - bool plotTitleEnabled() const; + virtual void setPlotTitleEnabled( bool enabled ) = 0; + virtual bool plotTitleEnabled() const = 0; virtual void setPlotTitleFontSize( int titleFontSize ) = 0; virtual void setLegendFontSize( int fontSize ) = 0; @@ -179,7 +179,7 @@ class RiuPlotWidget : public QWidget, public RiuInterfaceToViewWindow virtual void updateAxes() = 0; - virtual RiuPlotCurve* createPlotCurve( RimPlotCurve* ownerRimCurve, const QString& title, const QColor& color ) = 0; + virtual RiuPlotCurve* createPlotCurve( RimPlotCurve* ownerRimCurve, const QString& title ) = 0; virtual const QColor& backgroundColor() const = 0; diff --git a/ApplicationLibCode/UserInterface/RiuQtChartsPlotWidget.cpp b/ApplicationLibCode/UserInterface/RiuQtChartsPlotWidget.cpp index 8eedb07b43..b4e7d5e9a1 100644 --- a/ApplicationLibCode/UserInterface/RiuQtChartsPlotWidget.cpp +++ b/ApplicationLibCode/UserInterface/RiuQtChartsPlotWidget.cpp @@ -832,7 +832,7 @@ void RiuQtChartsPlotWidget::updateAxes() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RiuPlotCurve* RiuQtChartsPlotWidget::createPlotCurve( RimPlotCurve* ownerRimCurve, const QString& title, const QColor& color ) +RiuPlotCurve* RiuQtChartsPlotWidget::createPlotCurve( RimPlotCurve* ownerRimCurve, const QString& title ) { return new RiuQtChartsPlotCurve( ownerRimCurve, title ); } diff --git a/ApplicationLibCode/UserInterface/RiuQtChartsPlotWidget.h b/ApplicationLibCode/UserInterface/RiuQtChartsPlotWidget.h index ca11c07151..dc58d711e3 100644 --- a/ApplicationLibCode/UserInterface/RiuQtChartsPlotWidget.h +++ b/ApplicationLibCode/UserInterface/RiuQtChartsPlotWidget.h @@ -112,8 +112,8 @@ class RiuQtChartsPlotWidget : public RiuPlotWidget void setPlotTitle( const QString& plotTitle ) override; const QString& plotTitle() const; - void setPlotTitleEnabled( bool enabled ); - bool plotTitleEnabled() const; + void setPlotTitleEnabled( bool enabled ) override; + bool plotTitleEnabled() const override; void setPlotTitleFontSize( int titleFontSize ) override; void setLegendFontSize( int fontSize ) override; @@ -166,7 +166,7 @@ class RiuQtChartsPlotWidget : public RiuPlotWidget void updateLegend() override; void updateAxes() override; - RiuPlotCurve* createPlotCurve( RimPlotCurve* ownerRimCurve, const QString& title, const QColor& color ) override; + RiuPlotCurve* createPlotCurve( RimPlotCurve* ownerRimCurve, const QString& title ) override; QtCharts::QChart* qtChart(); diff --git a/ApplicationLibCode/UserInterface/RiuQwtCurvePointTracker.cpp b/ApplicationLibCode/UserInterface/RiuQwtCurvePointTracker.cpp index 29ab863aba..676c02a9cf 100644 --- a/ApplicationLibCode/UserInterface/RiuQwtCurvePointTracker.cpp +++ b/ApplicationLibCode/UserInterface/RiuQwtCurvePointTracker.cpp @@ -219,6 +219,18 @@ QPointF RiuQwtCurvePointTracker::closestCurvePoint( const QPoint& cursorPosition { *valueAxisValueString = valueAxisScaleDraw->label( valueAxisSampleVal ).text(); } + + if ( m_curveInfoTextProvider ) + { + auto additionalText = m_curveInfoTextProvider->additionalText( dynamic_cast( closestCurve ), + closestPointSampleIndex ); + + if ( !additionalText.isEmpty() ) + { + *valueAxisValueString += "\n"; + *valueAxisValueString += additionalText; + } + } } return samplePoint; diff --git a/ApplicationLibCode/UserInterface/RiuQwtPlotLegend.cpp b/ApplicationLibCode/UserInterface/RiuQwtPlotLegend.cpp index ec518927cb..2c42c7555b 100644 --- a/ApplicationLibCode/UserInterface/RiuQwtPlotLegend.cpp +++ b/ApplicationLibCode/UserInterface/RiuQwtPlotLegend.cpp @@ -35,9 +35,9 @@ //-------------------------------------------------------------------------------------------------- RiuQwtPlotLegend::RiuQwtPlotLegend( QWidget* parent /*= nullptr */ ) : QwtLegend( parent ) - , m_columnCount( 1 ) + { - QwtDynGridLayout* legendLayout = qobject_cast( contentsWidget()->layout() ); + auto* legendLayout = qobject_cast( contentsWidget()->layout() ); if ( legendLayout ) { legendLayout->setExpandingDirections( Qt::Horizontal | Qt::Vertical ); @@ -51,15 +51,15 @@ RiuQwtPlotLegend::RiuQwtPlotLegend( QWidget* parent /*= nullptr */ ) void RiuQwtPlotLegend::resizeEvent( QResizeEvent* event ) { QWidget::resizeEvent( event ); - QSize size = event->size(); + + QSize size = event->size(); + + // Avoid updating geometry if height is very small + if ( size.height() < 10 ) return; + const QwtDynGridLayout* legendLayout = qobject_cast( contentsWidget()->layout() ); if ( legendLayout ) { - QMargins margins = this->contentsMargins(); - - m_columnCount = - std::max( 1, (int)legendLayout->columnsForWidth( size.width() - margins.left() - margins.right() ) ); - updateGeometry(); } } @@ -70,40 +70,43 @@ void RiuQwtPlotLegend::resizeEvent( QResizeEvent* event ) QSize RiuQwtPlotLegend::sizeHint() const { QSize fullSizeHint = QwtLegend::sizeHint(); - // Update width + const QwtDynGridLayout* legendLayout = qobject_cast( contentsWidget()->layout() ); if ( legendLayout ) { - int numColumns = m_columnCount; - int numRows = legendLayout->itemCount() / numColumns; + QMargins margins = this->contentsMargins(); + + auto widgetSize = size(); + + int numColumns = + std::max( 1, (int)legendLayout->columnsForWidth( widgetSize.width() - margins.left() - margins.right() ) ); + int numRows = legendLayout->itemCount() / numColumns; if ( numRows == 0 ) { - return QSize( 0, 0 ); + return { 0, 0 }; } - else - { - if ( legendLayout->itemCount() % numColumns ) numRows++; - int width = numColumns * legendLayout->maxItemWidth(); + if ( legendLayout->itemCount() % numColumns ) numRows++; + + int width = numColumns * legendLayout->maxItemWidth(); - int maxHeight = 0; - for ( unsigned int i = 0; i < legendLayout->itemCount(); ++i ) - { - auto itemSize = legendLayout->itemAt( i )->sizeHint(); - maxHeight = std::max( maxHeight, itemSize.height() ); - } - QMargins margins = legendLayout->contentsMargins(); - int totalSpacing = ( numRows + 2 ) * legendLayout->spacing() + margins.top() + margins.bottom(); + int maxHeight = 0; + for ( unsigned int i = 0; i < legendLayout->itemCount(); ++i ) + { + auto itemSize = legendLayout->itemAt( i )->sizeHint(); + maxHeight = std::max( maxHeight, itemSize.height() ); + } + int totalSpacing = ( numRows + 2 ) * legendLayout->spacing() + margins.top() + margins.bottom(); - int height = maxHeight * numRows + totalSpacing; + int height = maxHeight * numRows + totalSpacing; - QSize layoutSize( width, height ); - QSize frameSize = layoutSize + QSize( 2 * frameWidth(), 2 * frameWidth() ); + QSize layoutSize( width, height ); + QSize frameSize = layoutSize + QSize( 2 * frameWidth(), 2 * frameWidth() ); - fullSizeHint.setWidth( std::max( fullSizeHint.width(), frameSize.width() ) ); - fullSizeHint.setHeight( std::max( fullSizeHint.height(), frameSize.height() ) ); - } + fullSizeHint.setWidth( std::max( fullSizeHint.width(), frameSize.width() ) ); + fullSizeHint.setHeight( std::max( fullSizeHint.height(), frameSize.height() ) ); } + return fullSizeHint; } diff --git a/ApplicationLibCode/UserInterface/RiuQwtPlotLegend.h b/ApplicationLibCode/UserInterface/RiuQwtPlotLegend.h index e5db48035b..afc8855132 100644 --- a/ApplicationLibCode/UserInterface/RiuQwtPlotLegend.h +++ b/ApplicationLibCode/UserInterface/RiuQwtPlotLegend.h @@ -35,7 +35,4 @@ public slots: private: void deleteAll(); - -private: - int m_columnCount; }; diff --git a/ApplicationLibCode/UserInterface/RiuQwtPlotWidget.cpp b/ApplicationLibCode/UserInterface/RiuQwtPlotWidget.cpp index 06f5137e0e..8fbac9e99e 100644 --- a/ApplicationLibCode/UserInterface/RiuQwtPlotWidget.cpp +++ b/ApplicationLibCode/UserInterface/RiuQwtPlotWidget.cpp @@ -22,10 +22,12 @@ #include "RiaColorTools.h" #include "RiaDefines.h" #include "RiaGuiApplication.h" +#include "RiaLogging.h" #include "RiaPlotDefines.h" #include "RiaPlotWindowRedrawScheduler.h" #include "RimPlot.h" +#include "RimPlotCurve.h" #include "RiuDraggableOverlayFrame.h" #include "RiuGuiTheme.h" @@ -71,8 +73,6 @@ #include #include -#include "RiaLogging.h" - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -601,11 +601,17 @@ bool RiuQwtPlotWidget::eventFilter( QObject* watched, QEvent* event ) !m_clickPosition.isNull() ) { endZoomOperations(); - selectClosestPlotItem( mouseEvent->pos(), toggleItemInSelection ); + + if ( m_plotDefinition->isCurveHighlightSupported() ) + { + selectClosestPlotItem( mouseEvent->pos(), toggleItemInSelection ); + } m_clickPosition = QPoint(); return true; } } + + onMouseMoveEvent( mouseEvent ); } return false; } @@ -1005,8 +1011,6 @@ void RiuQwtPlotWidget::highlightPlotItems( const std::set& c symbol->setPen( blendedSymbolLineColor, symbol->pen().width(), symbol->pen().style() ); } } - CurveProperties properties = { curveColor, symbolColor, symbolLineColor, penWidth }; - m_originalCurveProperties.insert( std::make_pair( plotCurve, properties ) ); m_originalZValues.insert( std::make_pair( plotCurve, zValue ) ); continue; @@ -1031,43 +1035,40 @@ void RiuQwtPlotWidget::highlightPlotItems( const std::set& c //-------------------------------------------------------------------------------------------------- void RiuQwtPlotWidget::resetPlotItemHighlighting( bool doUpdateCurveOrder ) { - auto plotItemList = m_plot->itemList(); - for ( QwtPlotItem* plotItem : plotItemList ) + if ( !m_originalZValues.empty() ) { - auto* plotCurve = dynamic_cast( plotItem ); - if ( plotCurve && m_originalCurveProperties.count( plotCurve ) ) + auto plotItemList = m_plot->itemList(); + for ( QwtPlotItem* plotItem : plotItemList ) { - const QPen& existingPen = plotCurve->pen(); - auto properties = m_originalCurveProperties[plotCurve]; - double zValue = m_originalZValues[plotCurve]; - - plotCurve->setPen( properties.lineColor, properties.lineWidth, existingPen.style() ); - plotCurve->setZ( zValue ); - auto* symbol = const_cast( plotCurve->symbol() ); - if ( symbol ) + if ( auto* plotCurve = dynamic_cast( plotItem ) ) { - symbol->setColor( properties.symbolColor ); - symbol->setPen( properties.symbolLineColor, symbol->pen().width(), symbol->pen().style() ); - } + auto* riuPlotCurve = dynamic_cast( plotItem ); - continue; - } + if ( auto rimPlotCurve = + dynamic_cast( m_plotDefinition->findPdmObjectFromPlotCurve( riuPlotCurve ) ) ) + { + rimPlotCurve->updateCurveAppearance(); + double zValue = m_originalZValues[plotCurve]; + riuPlotCurve->setZ( zValue ); + continue; + } + } - auto* plotShapeItem = dynamic_cast( plotItem ); - if ( plotShapeItem ) - { - QPen pen = plotShapeItem->pen(); + auto* plotShapeItem = dynamic_cast( plotItem ); + if ( plotShapeItem ) + { + QPen pen = plotShapeItem->pen(); - auto color = RiuGuiTheme::getColorByVariableName( "markerColor" ); + auto color = RiuGuiTheme::getColorByVariableName( "markerColor" ); - pen.setColor( color ); - pen.setWidth( 1 ); - plotShapeItem->setPen( pen ); - plotShapeItem->setZ( plotShapeItem->z() - 100.0 ); + pen.setColor( color ); + pen.setWidth( 1 ); + plotShapeItem->setPen( pen ); + plotShapeItem->setZ( plotShapeItem->z() - 100.0 ); + } } + m_originalZValues.clear(); } - m_originalCurveProperties.clear(); - m_originalZValues.clear(); resetPlotAxisHighlighting(); @@ -1325,7 +1326,7 @@ RiuPlotAxis RiuQwtPlotWidget::createNextPlotAxis( RiaDefines::PlotAxis axis ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RiuPlotCurve* RiuQwtPlotWidget::createPlotCurve( RimPlotCurve* ownerRimCurve, const QString& title, const QColor& color ) +RiuPlotCurve* RiuQwtPlotWidget::createPlotCurve( RimPlotCurve* ownerRimCurve, const QString& title ) { return new RiuQwtPlotCurve( ownerRimCurve, title ); } @@ -1386,6 +1387,13 @@ RiuPlotAxis RiuQwtPlotWidget::findPlotAxisForQwtAxis( const QwtAxisId& qwtAxisId return RiuPlotAxis::defaultLeft(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuQwtPlotWidget::onMouseMoveEvent( QMouseEvent* event ) +{ +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/UserInterface/RiuQwtPlotWidget.h b/ApplicationLibCode/UserInterface/RiuQwtPlotWidget.h index aec51a3dd3..033138a23b 100644 --- a/ApplicationLibCode/UserInterface/RiuQwtPlotWidget.h +++ b/ApplicationLibCode/UserInterface/RiuQwtPlotWidget.h @@ -101,8 +101,8 @@ class RiuQwtPlotWidget : public RiuPlotWidget void setPlotTitle( const QString& plotTitle ) override; const QString& plotTitle() const; - void setPlotTitleEnabled( bool enabled ); - bool plotTitleEnabled() const; + void setPlotTitleEnabled( bool enabled ) override; + bool plotTitleEnabled() const override; void setPlotTitleFontSize( int titleFontSize ) override; void setLegendFontSize( int fontSize ) override; @@ -157,7 +157,7 @@ class RiuQwtPlotWidget : public RiuPlotWidget void updateLegend() override; void updateAxes() override; - RiuPlotCurve* createPlotCurve( RimPlotCurve* ownerRimCurve, const QString& title, const QColor& color ) override; + RiuPlotCurve* createPlotCurve( RimPlotCurve* ownerRimCurve, const QString& title ) override; void detachItems( RiuPlotWidget::PlotItemType plotItemType ) override; @@ -207,6 +207,8 @@ public slots: RiuPlotAxis findPlotAxisForQwtAxis( const QwtAxisId& qwtAxisId ) const; + virtual void onMouseMoveEvent( QMouseEvent* event ); + private: void selectClosestPlotItem( const QPoint& pos, bool toggleItemInSelection = false ); static int defaultMinimumWidth(); @@ -233,9 +235,8 @@ public slots: int lineWidth; }; - std::map m_originalCurveProperties; - std::map m_originalZValues; - std::map m_axisMapping; + std::map m_originalZValues; + std::map m_axisMapping; QPointer m_plot; }; diff --git a/ApplicationLibCode/UserInterface/RiuResultInfoPanel.cpp b/ApplicationLibCode/UserInterface/RiuResultInfoPanel.cpp index 99fe053705..b8e6544621 100644 --- a/ApplicationLibCode/UserInterface/RiuResultInfoPanel.cpp +++ b/ApplicationLibCode/UserInterface/RiuResultInfoPanel.cpp @@ -43,6 +43,12 @@ RiuResultInfoPanel::RiuResultInfoPanel( QWidget* parent ) QVBoxLayout* layout = new QVBoxLayout(); layout->addWidget( m_textEdit ); + // Use a nonexisting font family to trigger the use of QFont::Monospace + // https://forum.qt.io/topic/35999/solved-qplaintextedit-how-to-change-the-font-to-be-monospaced/7 + QFont font( "does not exist" ); + font.setStyleHint( QFont::Monospace ); + m_textEdit->setFont( font ); + layout->setContentsMargins( 0, 0, 0, 0 ); setLayout( layout ); diff --git a/ApplicationLibCode/UserInterface/RiuResultTextBuilder.cpp b/ApplicationLibCode/UserInterface/RiuResultTextBuilder.cpp index 1e862ce447..e53eb56d7e 100644 --- a/ApplicationLibCode/UserInterface/RiuResultTextBuilder.cpp +++ b/ApplicationLibCode/UserInterface/RiuResultTextBuilder.cpp @@ -41,6 +41,7 @@ #include "RimIntersectionResultDefinition.h" #include "RimRegularLegendConfig.h" #include "RimReservoirCellResultsStorage.h" +#include "RimViewLinker.h" #include "RivExtrudedCurveIntersectionPartMgr.h" @@ -57,12 +58,12 @@ RiuResultTextBuilder::RiuResultTextBuilder( RimGridView* settings { CVF_ASSERT( eclResDef ); - m_displayCoordView = settingsView; - m_viewWithFaultsSettings = dynamic_cast( settingsView ); - m_eclResDef = eclResDef; - m_gridIndex = gridIndex; - m_cellIndex = cellIndex; - m_timeStepIndex = timeStepIndex; + m_displayCoordView = settingsView; + m_eclipseView = dynamic_cast( settingsView ); + m_eclResDef = eclResDef; + m_gridIndex = gridIndex; + m_cellIndex = cellIndex; + m_timeStepIndex = timeStepIndex; m_nncIndex = cvf::UNDEFINED_SIZE_T; m_intersectionPointInDisplay = cvf::Vec3d::UNDEFINED; @@ -79,12 +80,12 @@ RiuResultTextBuilder::RiuResultTextBuilder( RimGridView* settings { CVF_ASSERT( eclResDef ); - m_displayCoordView = settingsView; - m_viewWithFaultsSettings = dynamic_cast( settingsView ); - m_eclResDef = eclResDef; - m_gridIndex = 0; - m_cellIndex = 0; - m_timeStepIndex = timeStepIndex; + m_displayCoordView = settingsView; + m_eclipseView = dynamic_cast( settingsView ); + m_eclResDef = eclResDef; + m_gridIndex = 0; + m_cellIndex = 0; + m_timeStepIndex = timeStepIndex; RimEclipseCase* eclipseCase = eclResDef->eclipseCase(); if ( eclipseCase && eclipseCase->eclipseCaseData() ) @@ -283,20 +284,48 @@ QString RiuResultTextBuilder::geometrySelectionText( QString itemSeparator ) //-------------------------------------------------------------------------------------------------- QString RiuResultTextBuilder::gridResultDetails() { - QString text; + std::vector resultDefinitions; - if ( m_eclResDef->eclipseCase() && m_eclResDef->eclipseCase()->eclipseCaseData() ) - { - RigEclipseCaseData* eclipseCaseData = m_eclResDef->eclipseCase()->eclipseCaseData(); + std::vector> tmp; - this->appendTextFromResultColors( eclipseCaseData, m_gridIndex, m_cellIndex, m_timeStepIndex, m_eclResDef, &text ); + QStringList additionalCellResultText; + resultDefinitions.push_back( m_eclResDef ); + if ( m_eclipseView ) + { + std::vector resultAddresses = m_eclipseView->additionalResultsForResultInfo(); - if ( !text.isEmpty() ) + for ( const auto& result : resultAddresses ) { - text.prepend( "-- Grid cell result details --\n" ); + auto myResDef = std::make_unique(); + myResDef->setEclipseCase( m_eclResDef->eclipseCase() ); + myResDef->simpleCopy( m_eclResDef ); + myResDef->setFromEclipseResultAddress( result ); + myResDef->loadResult(); + + resultDefinitions.push_back( myResDef.get() ); + tmp.push_back( std::move( myResDef ) ); } } + const auto [hasMultipleCases, linkedViewText] = resultTextFromLinkedViews(); + QString text = cellResultText( resultDefinitions, hasMultipleCases ); + + for ( const auto& txt : additionalCellResultText ) + { + text += "\n" + txt; + } + + for ( const auto& txt : linkedViewText ) + { + text += "\n" + txt; + } + + if ( !text.isEmpty() ) + { + text.prepend( "-- Grid cell result details --\n" ); + } + text += "\n"; + return text; } @@ -323,9 +352,9 @@ QString RiuResultTextBuilder::faultResultDetails() cvf::StructGridInterface::FaceEnum faceHelper( m_face ); text += "Fault Face : " + faceHelper.text() + "\n"; - if ( m_viewWithFaultsSettings && m_viewWithFaultsSettings->faultResultSettings()->hasValidCustomResult() ) + if ( m_eclipseView && m_eclipseView->faultResultSettings()->hasValidCustomResult() ) { - if ( m_viewWithFaultsSettings->faultResultSettings()->customFaultResult()->resultType() != + if ( m_eclipseView->faultResultSettings()->customFaultResult()->resultType() != RiaDefines::ResultCatType::ALLAN_DIAGRAMS ) { text += "Fault result data:\n"; @@ -333,7 +362,7 @@ QString RiuResultTextBuilder::faultResultDetails() m_gridIndex, m_cellIndex, m_timeStepIndex, - m_viewWithFaultsSettings->currentFaultResultColors(), + m_eclipseView->currentFaultResultColors(), &text ); } } @@ -392,7 +421,8 @@ QString RiuResultTextBuilder::formationDetails() //-------------------------------------------------------------------------------------------------- QString RiuResultTextBuilder::gridResultText() { - QString text = cellResultText( m_eclResDef ); + QString text = cellResultText( { m_eclResDef } ); + text.replace( "\n", " " ); return text; } @@ -416,9 +446,9 @@ QString RiuResultTextBuilder::faultResultText() if ( fault ) { cvf::StructGridInterface::FaceEnum faceHelper( m_face ); - if ( m_viewWithFaultsSettings && m_viewWithFaultsSettings->faultResultSettings()->hasValidCustomResult() ) + if ( m_eclipseView && m_eclipseView->faultResultSettings()->hasValidCustomResult() ) { - text = cellResultText( m_viewWithFaultsSettings->currentFaultResultColors() ); + text = cellResultText( { m_eclipseView->currentFaultResultColors() } ); } } } @@ -451,12 +481,11 @@ QString RiuResultTextBuilder::nncResultText() cvf::StructGridInterface::FaceEnum face( conn.face() ); - if ( m_viewWithFaultsSettings && m_viewWithFaultsSettings->currentFaultResultColors() ) + if ( m_eclipseView && m_eclipseView->currentFaultResultColors() ) { RigEclipseResultAddress eclipseResultAddress = - m_viewWithFaultsSettings->currentFaultResultColors()->eclipseResultAddress(); - RiaDefines::ResultCatType resultType = - m_viewWithFaultsSettings->currentFaultResultColors()->resultType(); + m_eclipseView->currentFaultResultColors()->eclipseResultAddress(); + RiaDefines::ResultCatType resultType = m_eclipseView->currentFaultResultColors()->resultType(); const std::vector* nncValues = nullptr; @@ -475,7 +504,7 @@ QString RiuResultTextBuilder::nncResultText() if ( nncValues && ( m_nncIndex < nncValues->size() ) ) { - QString resultVar = m_viewWithFaultsSettings->currentFaultResultColors()->resultVariableUiName(); + QString resultVar = m_eclipseView->currentFaultResultColors()->resultVariableUiName(); double scalarValue = ( *nncValues )[m_nncIndex]; text = QString( "%1 : %2" ).arg( resultVar ).arg( scalarValue ); @@ -486,7 +515,7 @@ QString RiuResultTextBuilder::nncResultText() nncValues = nncData->staticConnectionScalarResult( eclipseResultAddress ); QString resultValueText; - if ( m_viewWithFaultsSettings->currentFaultResultColors()->resultVariable() == + if ( m_eclipseView->currentFaultResultColors()->resultVariable() == RiaResultNames::formationAllanResultName() ) { std::pair fmIndexPair = @@ -505,13 +534,13 @@ QString RiuResultTextBuilder::nncResultText() } // clang-format on } - else if ( m_viewWithFaultsSettings->currentFaultResultColors()->resultVariable() == + else if ( m_eclipseView->currentFaultResultColors()->resultVariable() == RiaResultNames::formationBinaryAllanResultName() ) { resultValueText = ( *nncValues )[m_nncIndex] == 0 ? "Same formation" : "Different formation"; } - QString resultVar = m_viewWithFaultsSettings->currentFaultResultColors()->resultVariableUiName(); + QString resultVar = m_eclipseView->currentFaultResultColors()->resultVariableUiName(); text = QString( "%1 : %2" ).arg( resultVar ).arg( resultValueText ); } } @@ -722,7 +751,45 @@ void RiuResultTextBuilder::appendTextFromResultColors( RigEclipseCaseData* } } - resultInfoText->append( cellResultText( resultColors ) ); + resultInfoText->append( cellResultText( { resultColors } ) ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair RiuResultTextBuilder::resultTextFromLinkedViews() const +{ + if ( !m_eclipseView || !m_eclipseView->assosiatedViewLinker() ) return {}; + + QStringList additionalCellResultText; + bool hasMultipleCases = false; + RimEclipseCase* primaryEclipseCase = m_eclipseView->eclipseCase(); + + auto views = m_eclipseView->assosiatedViewLinker()->allViews(); + for ( auto view : views ) + { + auto eclView = dynamic_cast( view ); + if ( !eclView || eclView == m_eclipseView ) continue; + + // Match on IJK size, as the cell index is used to identify the grid cell to extract the result from + auto otherEclipseCase = eclView->eclipseCase(); + if ( !primaryEclipseCase->isGridSizeEqualTo( otherEclipseCase ) ) continue; + + RiuResultTextBuilder textBuilder( eclView, eclView->cellResult(), m_cellIndex, m_timeStepIndex ); + auto text = textBuilder.gridResultText(); + + if ( primaryEclipseCase != otherEclipseCase ) + { + hasMultipleCases = true; + + auto caseName = otherEclipseCase->caseUserDescription(); + text += "( " + caseName + " )"; + } + + additionalCellResultText.push_back( text ); + } + + return { hasMultipleCases, additionalCellResultText }; } //-------------------------------------------------------------------------------------------------- @@ -732,14 +799,14 @@ QString RiuResultTextBuilder::cellEdgeResultDetails() { QString text; - if ( m_viewWithFaultsSettings && m_viewWithFaultsSettings->cellEdgeResult()->showTextResult() ) + if ( m_eclipseView && m_eclipseView->cellEdgeResult()->showTextResult() ) { - m_viewWithFaultsSettings->cellEdgeResult()->loadResult(); + m_eclipseView->cellEdgeResult()->loadResult(); text += "-- Cell edge result data --\n"; std::vector metaData; - m_viewWithFaultsSettings->cellEdgeResult()->cellEdgeMetaData( &metaData ); + m_eclipseView->cellEdgeResult()->cellEdgeMetaData( &metaData ); std::set uniqueResultAddresses; @@ -880,9 +947,46 @@ void RiuResultTextBuilder::appendDetails( QString& text, const QString& details //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QString RiuResultTextBuilder::cellResultText( RimEclipseResultDefinition* eclResDef ) +QString RiuResultTextBuilder::cellResultText( const std::vector& resultDefinitions, + bool appendCaseName ) { + std::map keyValues; + + int maxKeyLength = 0; + for ( const auto& resDef : resultDefinitions ) + { + auto resultTextAndValues = cellResultTextAndValueText( resDef ); + for ( const auto& [key, value] : resultTextAndValues ) + { + maxKeyLength = std::max( maxKeyLength, key.length() ); + keyValues[key] = value; + } + } + QString text; + for ( const auto& [key, value] : keyValues ) + { + if ( !text.isEmpty() ) text += "\n"; + text += QString( "%1 : %2" ).arg( key, -maxKeyLength ).arg( value ); + + if ( appendCaseName && m_eclipseView && m_eclipseView->eclipseCase() ) + { + auto caseName = m_eclipseView->eclipseCase()->caseUserDescription(); + text += "( " + caseName + " )"; + } + } + + return text; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::map RiuResultTextBuilder::cellResultTextAndValueText( RimEclipseResultDefinition* eclResDef ) +{ + if ( !eclResDef ) return {}; + + std::map keyValues; if ( m_eclResDef->eclipseCase() && m_eclResDef->eclipseCase()->eclipseCaseData() ) { @@ -930,19 +1034,21 @@ QString RiuResultTextBuilder::cellResultText( RimEclipseResultDefinition* eclRes scalarValue = dataAccessObjectX->cellScalar( m_cellIndex ); else scalarValue = 0.0; - text += QString( "SOIL : %1 " ).arg( scalarValue ); + + keyValues["SOIL"] = QString( "%1" ).arg( scalarValue ); if ( dataAccessObjectY.notNull() ) scalarValue = dataAccessObjectY->cellScalar( m_cellIndex ); else scalarValue = 0.0; - text += QString( "SGAS : %1 " ).arg( scalarValue ); + + keyValues["SGAS"] = QString( "%1" ).arg( scalarValue ); if ( dataAccessObjectZ.notNull() ) scalarValue = dataAccessObjectZ->cellScalar( m_cellIndex ); else scalarValue = 0.0; - text += QString( "SWAT : %1 " ).arg( scalarValue ); + keyValues["SWAT"] = QString( "%1" ).arg( scalarValue ); } } else @@ -981,19 +1087,22 @@ QString RiuResultTextBuilder::cellResultText( RimEclipseResultDefinition* eclRes } } - resultValueText += legendConfig->categoryNameFromCategoryValue( scalarValue ); + if ( legendConfig ) + resultValueText += legendConfig->categoryNameFromCategoryValue( scalarValue ); + else + resultValueText += QString( "%1" ).arg( scalarValue ); } else { resultValueText = QString( "%1" ).arg( scalarValue ); } - text = QString( "%1 : %2" ).arg( resultDescriptionText ).arg( resultValueText ); + keyValues[resultDescriptionText] = resultValueText; } } } - return text; + return keyValues; } //-------------------------------------------------------------------------------------------------- @@ -1020,7 +1129,8 @@ QString RiuResultTextBuilder::wellResultText() wellResultFrame->findResultCellWellHeadIncluded( m_gridIndex, m_cellIndex ); if ( wellResultCell ) { - text += QString( "-- Well-cell connection info --\n Well Name: %1\n Branch Id: %2\n Segment Id: %3\n" ) + text += QString( "-- Well-cell connection info --\n Well Name: %1\n Branch Id: %2\n Segment " + "Id: %3\n" ) .arg( singleWellResultData->m_wellName ) .arg( wellResultCell->m_ertBranchId ) .arg( wellResultCell->m_ertSegmentId ); diff --git a/ApplicationLibCode/UserInterface/RiuResultTextBuilder.h b/ApplicationLibCode/UserInterface/RiuResultTextBuilder.h index 050f73df21..69469d1790 100644 --- a/ApplicationLibCode/UserInterface/RiuResultTextBuilder.h +++ b/ApplicationLibCode/UserInterface/RiuResultTextBuilder.h @@ -22,6 +22,8 @@ #include "cafPdmPointer.h" #include "cvfStructGrid.h" +#include + class RimEclipseView; class RimEclipseCellColors; class Rim2dIntersectionView; @@ -76,7 +78,8 @@ class RiuResultTextBuilder QString nncResultText(); QString wellResultText(); - QString cellResultText( RimEclipseResultDefinition* resultColors ); + QString cellResultText( const std::vector& resultDefinitions, bool appendCaseName = false ); + std::map cellResultTextAndValueText( RimEclipseResultDefinition* resultDefinition ); void appendTextFromResultColors( RigEclipseCaseData* eclipseCase, size_t gridIndex, @@ -85,9 +88,11 @@ class RiuResultTextBuilder RimEclipseResultDefinition* resultColors, QString* resultInfoText ); + std::pair resultTextFromLinkedViews() const; + private: caf::PdmPointer m_displayCoordView; - caf::PdmPointer m_viewWithFaultsSettings; + caf::PdmPointer m_eclipseView; caf::PdmPointer m_eclResDef; caf::PdmPointer m_2dIntersectionView; diff --git a/ApplicationLibCode/UserInterface/RiuSummaryPlot.cpp b/ApplicationLibCode/UserInterface/RiuSummaryPlot.cpp index 1e5a4a920e..f8c6755d8f 100644 --- a/ApplicationLibCode/UserInterface/RiuSummaryPlot.cpp +++ b/ApplicationLibCode/UserInterface/RiuSummaryPlot.cpp @@ -22,6 +22,8 @@ #include "RimEnsembleCurveSet.h" #include "RimPlot.h" +#include "RimSummaryCase.h" +#include "RimSummaryCaseCollection.h" #include "RimSummaryCurve.h" #include "RimSummaryPlot.h" diff --git a/ApplicationLibCode/UserInterface/RiuSummaryQuantityNameInfoProvider.cpp b/ApplicationLibCode/UserInterface/RiuSummaryQuantityNameInfoProvider.cpp index c7c779dd9c..fb448e5d0b 100644 --- a/ApplicationLibCode/UserInterface/RiuSummaryQuantityNameInfoProvider.cpp +++ b/ApplicationLibCode/UserInterface/RiuSummaryQuantityNameInfoProvider.cpp @@ -54,8 +54,9 @@ bool is_region_to_region( const std::string& keyword ) //-------------------------------------------------------------------------------------------------- RiuSummaryQuantityNameInfoProvider* RiuSummaryQuantityNameInfoProvider::instance() { - static auto* singleton = new RiuSummaryQuantityNameInfoProvider; - return singleton; + static RiuSummaryQuantityNameInfoProvider theInstance; + + return &theInstance; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/UserInterface/RiuSummaryQwtPlot.cpp b/ApplicationLibCode/UserInterface/RiuSummaryQwtPlot.cpp index 8b166615f0..ccfa9edb2b 100644 --- a/ApplicationLibCode/UserInterface/RiuSummaryQwtPlot.cpp +++ b/ApplicationLibCode/UserInterface/RiuSummaryQwtPlot.cpp @@ -162,6 +162,7 @@ void RiuSummaryQwtPlot::updateAnnotationObjects( RimPlotAxisPropertiesInterface* m_annotationTool->attachAnnotationLine( m_plotWidget->qwtPlot(), annotation->color(), annotation->name(), + annotation->penStyle(), annotation->value(), orientation ); } diff --git a/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionUi.cpp b/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionUi.cpp index 32b2e8686a..9914a2172b 100644 --- a/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionUi.cpp +++ b/ApplicationLibCode/UserInterface/RiuSummaryVectorSelectionUi.cpp @@ -22,6 +22,7 @@ #include "RiaOptionItemFactory.h" #include "RiaStdStringTools.h" #include "RiaSummaryCurveDefinition.h" +#include "RiaSummaryDefines.h" #include "RifEclipseSummaryAddress.h" #include "RifReaderEclipseSummary.h" @@ -873,7 +874,7 @@ void RiuSummaryVectorSelectionUi::defineUiOrdering( QString uiConfigName, caf::P else if ( sumCategory == RifEclipseSummaryAddress::SUMMARY_AQUIFER ) { { - caf::PdmUiGroup* myGroup = uiOrdering.addNewGroup( "Aquifers" ); + caf::PdmUiGroup* myGroup = uiOrdering.addNewGroup( RiaDefines::summaryAquifer() + "s" ); myGroup->add( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_AQUIFER][0]->pdmField() ); } @@ -890,7 +891,7 @@ void RiuSummaryVectorSelectionUi::defineUiOrdering( QString uiConfigName, caf::P else if ( sumCategory == RifEclipseSummaryAddress::SUMMARY_REGION ) { { - caf::PdmUiGroup* myGroup = uiOrdering.addNewGroup( "Regions" ); + caf::PdmUiGroup* myGroup = uiOrdering.addNewGroup( RiaDefines::summaryRegion() + "s" ); myGroup->add( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_REGION][0]->pdmField() ); } @@ -908,7 +909,7 @@ void RiuSummaryVectorSelectionUi::defineUiOrdering( QString uiConfigName, caf::P else if ( sumCategory == RifEclipseSummaryAddress::SUMMARY_GROUP ) { { - caf::PdmUiGroup* myGroup = uiOrdering.addNewGroup( "Groups" ); + caf::PdmUiGroup* myGroup = uiOrdering.addNewGroup( RiaDefines::summaryWellGroup() + "s" ); myGroup->add( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_GROUP][0]->pdmField() ); } @@ -917,7 +918,7 @@ void RiuSummaryVectorSelectionUi::defineUiOrdering( QString uiConfigName, caf::P else if ( sumCategory == RifEclipseSummaryAddress::SUMMARY_WELL ) { { - caf::PdmUiGroup* myGroup = uiOrdering.addNewGroup( "Wells" ); + caf::PdmUiGroup* myGroup = uiOrdering.addNewGroup( RiaDefines::summaryWell() + "s" ); myGroup->add( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL][0]->pdmField() ); } @@ -926,7 +927,7 @@ void RiuSummaryVectorSelectionUi::defineUiOrdering( QString uiConfigName, caf::P else if ( sumCategory == RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION ) { { - caf::PdmUiGroup* myGroup = uiOrdering.addNewGroup( "Completions" ); + caf::PdmUiGroup* myGroup = uiOrdering.addNewGroup( RiaDefines::summaryCompletion() + "s" ); myGroup->add( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION][0]->pdmField() ); myGroup->add( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION][1]->pdmField() ); } @@ -936,7 +937,7 @@ void RiuSummaryVectorSelectionUi::defineUiOrdering( QString uiConfigName, caf::P else if ( sumCategory == RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION_LGR ) { { - caf::PdmUiGroup* myGroup = uiOrdering.addNewGroup( "LGR Completions" ); + caf::PdmUiGroup* myGroup = uiOrdering.addNewGroup( RiaDefines::summaryLgrCompletion() + "s" ); myGroup->add( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION_LGR][0]->pdmField() ); myGroup->add( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION_LGR][1]->pdmField() ); myGroup->add( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION_LGR][2]->pdmField() ); @@ -947,7 +948,7 @@ void RiuSummaryVectorSelectionUi::defineUiOrdering( QString uiConfigName, caf::P else if ( sumCategory == RifEclipseSummaryAddress::SUMMARY_WELL_LGR ) { { - caf::PdmUiGroup* myGroup = uiOrdering.addNewGroup( "LGR Wells" ); + caf::PdmUiGroup* myGroup = uiOrdering.addNewGroup( RiaDefines::summaryLgrWell() + "s" ); myGroup->add( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL_LGR][0]->pdmField() ); myGroup->add( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL_LGR][1]->pdmField() ); } @@ -957,7 +958,7 @@ void RiuSummaryVectorSelectionUi::defineUiOrdering( QString uiConfigName, caf::P else if ( sumCategory == RifEclipseSummaryAddress::SUMMARY_WELL_SEGMENT ) { { - caf::PdmUiGroup* myGroup = uiOrdering.addNewGroup( "Well Segments" ); + caf::PdmUiGroup* myGroup = uiOrdering.addNewGroup( RiaDefines::summaryWellSegment() + "s" ); myGroup->add( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL_SEGMENT][0]->pdmField() ); myGroup->add( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_WELL_SEGMENT][1]->pdmField() ); } @@ -967,7 +968,7 @@ void RiuSummaryVectorSelectionUi::defineUiOrdering( QString uiConfigName, caf::P else if ( sumCategory == RifEclipseSummaryAddress::SUMMARY_BLOCK ) { { - caf::PdmUiGroup* myGroup = uiOrdering.addNewGroup( "Blocks" ); + caf::PdmUiGroup* myGroup = uiOrdering.addNewGroup( RiaDefines::summaryBlock() + "s" ); myGroup->add( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_BLOCK][0]->pdmField() ); } @@ -976,7 +977,7 @@ void RiuSummaryVectorSelectionUi::defineUiOrdering( QString uiConfigName, caf::P else if ( sumCategory == RifEclipseSummaryAddress::SUMMARY_BLOCK_LGR ) { { - caf::PdmUiGroup* myGroup = uiOrdering.addNewGroup( "LGR Blocks" ); + caf::PdmUiGroup* myGroup = uiOrdering.addNewGroup( RiaDefines::summaryLgrBlock() + "s" ); myGroup->add( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_BLOCK_LGR][0]->pdmField() ); myGroup->add( m_identifierFieldsMap[RifEclipseSummaryAddress::SUMMARY_BLOCK_LGR][1]->pdmField() ); } @@ -1505,7 +1506,7 @@ void RiuSummaryVectorSelectionUi::appendOptionItemsForSubCategoriesAndVectors( Q } else if ( i == CALCULATED_CURVES ) { - headerText = QString( "Calculated" ); + headerText = QString( RiaDefines::summaryCalculated() ); } if ( !headerText.isEmpty() ) diff --git a/ApplicationLibCode/UserInterface/RiuViewer.cpp b/ApplicationLibCode/UserInterface/RiuViewer.cpp index b302415dd4..3034bc4939 100644 --- a/ApplicationLibCode/UserInterface/RiuViewer.cpp +++ b/ApplicationLibCode/UserInterface/RiuViewer.cpp @@ -354,24 +354,21 @@ void RiuViewer::slotSetCurrentFrame( int frameIndex ) { setCurrentFrame( frameIndex ); - if ( m_rimView ) + auto* view = dynamic_cast( m_rimView.p() ); + if ( view ) { - RimViewLinker* viewLinker = m_rimView->assosiatedViewLinker(); + RimViewLinker* viewLinker = view->assosiatedViewLinker(); if ( viewLinker ) { - viewLinker->updateTimeStep( dynamic_cast( m_rimView.p() ), frameIndex ); + viewLinker->updateTimeStep( view, frameIndex ); } // Update views using this as comparison - Rim3dView* view = dynamic_cast( m_rimView.p() ); - if ( view ) - { - std::set containingViews = view->viewsUsingThisAsComparisonView(); + std::set containingViews = view->viewsUsingThisAsComparisonView(); - for ( auto contView : containingViews ) - { - contView->updateDisplayModelForCurrentTimeStepAndRedraw(); - } + for ( auto contView : containingViews ) + { + contView->updateDisplayModelForCurrentTimeStepAndRedraw(); } } } @@ -982,7 +979,7 @@ void RiuViewer::navigationPolicyUpdate() RimViewLinker* viewLinker = m_rimView->assosiatedViewLinker(); if ( viewLinker ) { - viewLinker->updateCamera( dynamic_cast( m_rimView.p() ) ); + viewLinker->updateCamera( dynamic_cast( m_rimView.p() ) ); } } } @@ -1090,7 +1087,8 @@ void RiuViewer::mouseMoveEvent( QMouseEvent* mouseEvent ) cvf::ref trans = m_rimView->displayCoordTransform(); cvf::Vec3d domainCoord = trans->transformToDomainCoord( displayCoord ); - viewLinker->updateCursorPosition( dynamic_cast( m_rimView.p() ), domainCoord ); + auto view = dynamic_cast( m_rimView.p() ); + if ( view ) viewLinker->updateCursorPosition( view, domainCoord ); } } } @@ -1120,7 +1118,9 @@ void RiuViewer::leaveEvent( QEvent* ) if ( m_rimView && m_rimView->assosiatedViewLinker() ) { RimViewLinker* viewLinker = m_rimView->assosiatedViewLinker(); - viewLinker->updateCursorPosition( dynamic_cast( m_rimView.p() ), cvf::Vec3d::UNDEFINED ); + + auto view = dynamic_cast( m_rimView.p() ); + if ( view ) viewLinker->updateCursorPosition( view, cvf::Vec3d::UNDEFINED ); } } diff --git a/ApplicationLibCode/UserInterface/RiuViewerCommands.cpp b/ApplicationLibCode/UserInterface/RiuViewerCommands.cpp index ad3b5694e2..d0ffbacfd9 100644 --- a/ApplicationLibCode/UserInterface/RiuViewerCommands.cpp +++ b/ApplicationLibCode/UserInterface/RiuViewerCommands.cpp @@ -46,7 +46,6 @@ #include "RimContextCommandBuilder.h" #include "RimEclipseCase.h" #include "RimEclipseCellColors.h" -#include "RimEclipseContourMapView.h" #include "RimEclipseFaultColors.h" #include "RimEclipseView.h" #include "RimEllipseFractureTemplate.h" @@ -56,7 +55,6 @@ #include "RimFracture.h" #include "RimGeoMechCase.h" #include "RimGeoMechCellColors.h" -#include "RimGeoMechContourMapView.h" #include "RimGeoMechView.h" #include "RimIntersectionResultDefinition.h" #include "RimLegendConfig.h" @@ -108,7 +106,6 @@ #include "cvfPart.h" #include "cvfRay.h" #include "cvfScene.h" -#include "cvfTransform.h" #include #include @@ -133,6 +130,7 @@ RiuViewerCommands::RiuViewerCommands( RiuViewer* ownerViewer ) , m_currentCellIndex( -1 ) , m_currentFaceIndex( cvf::StructGridInterface::NO_FACE ) , m_currentPickPositionInDomainCoords( cvf::Vec3d::UNDEFINED ) + , m_isCurrentPickInComparisonView( false ) , m_viewer( ownerViewer ) { if ( sm_defaultPickEventHandlers.empty() ) @@ -162,7 +160,7 @@ void RiuViewerCommands::setOwnerView( Rim3dView* owner ) void RiuViewerCommands::addCompareToViewMenu( caf::CmdFeatureMenuBuilder* menuBuilder ) { - RimGridView* mainGridView = dynamic_cast( m_reservoirView.p() ); + auto* mainGridView = m_reservoirView.p(); if ( mainGridView && !mainGridView->activeComparisonView() ) { std::vector validComparisonViews; @@ -171,17 +169,13 @@ void RiuViewerCommands::addCompareToViewMenu( caf::CmdFeatureMenuBuilder* menuBu RimProject::current()->allViews( views ); for ( auto view : views ) { - if ( !dynamic_cast( view ) ) continue; - if ( dynamic_cast( view ) ) continue; - if ( dynamic_cast( view ) ) continue; - if ( view != mainGridView ) { validComparisonViews.push_back( view ); } } - if ( validComparisonViews.size() ) + if ( !validComparisonViews.empty() ) { menuBuilder->subMenuStart( "Compare To ...", QIcon( ":/ComparisonView16x16.png" ) ); for ( auto view : validComparisonViews ) @@ -223,7 +217,7 @@ void RiuViewerCommands::displayContextMenu( QMouseEvent* event ) uint firstPartTriangleIndex = cvf::UNDEFINED_UINT; m_currentPickPositionInDomainCoords = cvf::Vec3d::UNDEFINED; - if ( pickItemInfos.size() ) + if ( !pickItemInfos.empty() ) { cvf::Vec3d globalIntersectionPoint = pickItemInfos[0].globalPickedPoint(); @@ -453,22 +447,6 @@ void RiuViewerCommands::displayContextMenu( QMouseEvent* event ) QVariant( fault->name() ) ); menuBuilder.addSeparator(); - - if ( eclipseView->faultCollection() && eclipseView->faultCollection()->faultRAEnabled() ) - { - menuBuilder.subMenuStart( "Reactivation Assessment" ); - menuBuilder.addCmdFeatureWithUserData( "RicRunBasicFaultReactAssessment3dFeature", - "Run Basic Processing", - QVariant( fault->name() ) ); - if ( eclipseView->faultCollection()->faultRAAdvancedEnabled() ) - { - menuBuilder.addCmdFeatureWithUserData( "RicRunAdvFaultReactAssessment3dFeature", - "Run Advanced Processing", - QVariant( fault->name() ) ); - } - menuBuilder.subMenuEnd(); - menuBuilder.addSeparator(); - } } } @@ -616,7 +594,7 @@ void RiuViewerCommands::displayContextMenu( QMouseEvent* event ) // View Link commands if ( !firstHitPart ) { - if ( gridView ) + if ( gridView || int2dView ) { menuBuilder << "RicLinkViewFeature"; menuBuilder << "RicShowLinkOptionsFeature"; @@ -625,9 +603,7 @@ void RiuViewerCommands::displayContextMenu( QMouseEvent* event ) menuBuilder.addSeparator(); menuBuilder << "RicUnLinkViewFeature"; menuBuilder << "RicRemoveComparison3dViewFeature"; - } - else if ( int2dView ) - { + menuBuilder.addSeparator(); menuBuilder << "RicSelectColorResult"; } } @@ -657,9 +633,6 @@ void RiuViewerCommands::displayContextMenu( QMouseEvent* event ) menuBuilder << "RicShowGridStatisticsFeature"; menuBuilder << "RicSelectColorResult"; } - else if ( int2dView ) - { - } menuBuilder << "RicExportContourMapToTextFeature"; @@ -711,7 +684,7 @@ void RiuViewerCommands::handlePickAction( int winPosX, int winPosY, Qt::Keyboard // Make pickEventHandlers do their stuff - if ( pickItemInfos.size() ) + if ( !pickItemInfos.empty() ) { Ric3dPickEvent viewerEventObject( pickItemInfos, mainOrComparisonView, keyboardModifiers ); @@ -739,7 +712,7 @@ void RiuViewerCommands::handlePickAction( int winPosX, int winPosY, Qt::Keyboard uint firstPartTriangleIndex = cvf::UNDEFINED_UINT; cvf::Vec3d globalIntersectionPoint( cvf::Vec3d::ZERO ); - if ( pickItemInfos.size() ) + if ( !pickItemInfos.empty() ) { size_t indexToFirstNoneNncItem = cvf::UNDEFINED_SIZE_T; size_t indexToNncItemNearFirstItem = cvf::UNDEFINED_SIZE_T; @@ -1129,7 +1102,7 @@ void RiuViewerCommands::findFirstItems( Rim3dView* main size_t* indexToFirstNoneNncItem, size_t* indexToNncItemNearFirsItem ) { - CVF_ASSERT( pickItemInfos.size() > 0 ); + CVF_ASSERT( !pickItemInfos.empty() ); CVF_ASSERT( indexToFirstNoneNncItem ); CVF_ASSERT( indexToNncItemNearFirsItem ); diff --git a/ApplicationLibCode/UserInterface/RiuWellLogPlot.cpp b/ApplicationLibCode/UserInterface/RiuWellLogPlot.cpp index 47fb3c94bb..a1fbacb8d0 100644 --- a/ApplicationLibCode/UserInterface/RiuWellLogPlot.cpp +++ b/ApplicationLibCode/UserInterface/RiuWellLogPlot.cpp @@ -2,6 +2,7 @@ #include "RimDepthTrackPlot.h" #include "RimPlotWindow.h" +#include "RimWellLogTrack.h" #include "RiuQwtPlotWidget.h" #include "RiuWellLogTrack.h" @@ -39,7 +40,7 @@ RiuWellLogPlot::RiuWellLogPlot( RimDepthTrackPlot* plotDefinition, QWidget* pare //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimDepthTrackPlot* RiuWellLogPlot::depthTrackPlot() +RimDepthTrackPlot* RiuWellLogPlot::depthTrackPlot() const { auto* wellLogPlot = dynamic_cast( m_plotDefinition.p() ); CAF_ASSERT( wellLogPlot ); @@ -90,7 +91,7 @@ void RiuWellLogPlot::renderTo( QPaintDevice* paintDevice ) RiuMultiPlotPage::renderTo( paintDevice ); - if ( depthTrackPlot() && depthTrackPlot()->depthOrientation() == RimDepthTrackPlot::DepthOrientation::HORIZONTAL ) + if ( depthTrackPlot() && depthTrackPlot()->depthOrientation() == RiaDefines::Orientation::HORIZONTAL ) m_horizontalTrackScrollBar->setVisible( true ); else m_verticalTrackScrollBar->setVisible( true ); @@ -101,7 +102,25 @@ void RiuWellLogPlot::renderTo( QPaintDevice* paintDevice ) //-------------------------------------------------------------------------------------------------- bool RiuWellLogPlot::showYAxis( int row, int column ) const { - return column == 0; + if ( depthTrackPlot() ) + { + if ( depthTrackPlot()->depthOrientation() == RiaDefines::Orientation::VERTICAL ) + { + return column == 0; + } + + auto index = static_cast( std::max( row, column ) ); + if ( index < depthTrackPlot()->visiblePlots().size() ) + { + auto track = dynamic_cast( depthTrackPlot()->visiblePlots()[index] ); + if ( track ) + { + return track->isPropertyAxisEnabled(); + } + } + } + + return true; } //-------------------------------------------------------------------------------------------------- @@ -113,7 +132,7 @@ void RiuWellLogPlot::reinsertScrollbar() int colCount = this->m_gridLayout->columnCount(); int rowCount = this->m_gridLayout->rowCount(); - if ( depthTrackPlot() && depthTrackPlot()->depthOrientation() == RimDepthTrackPlot::DepthOrientation::HORIZONTAL ) + if ( depthTrackPlot() && depthTrackPlot()->depthOrientation() == RiaDefines::Orientation::HORIZONTAL ) { m_gridLayout->addLayout( m_horizontalTrackScrollBarLayout, rowCount, 0, 1, colCount ); m_horizontalTrackScrollBar->setVisible( !plotWidgets.empty() ); @@ -162,4 +181,5 @@ void RiuWellLogPlot::performUpdate( RiaDefines::MultiPlotPageUpdateType /* whatT int axisShift = alignCanvasTops(); alignScrollbar( axisShift ); alignAxes(); + updatePlotLayouts(); } diff --git a/ApplicationLibCode/UserInterface/RiuWellLogPlot.h b/ApplicationLibCode/UserInterface/RiuWellLogPlot.h index 9be0f46575..e0f2a16c8a 100644 --- a/ApplicationLibCode/UserInterface/RiuWellLogPlot.h +++ b/ApplicationLibCode/UserInterface/RiuWellLogPlot.h @@ -41,7 +41,7 @@ class RiuWellLogPlot : public RiuMultiPlotPage void alignScrollbar( int offset ); private: - RimDepthTrackPlot* depthTrackPlot(); + RimDepthTrackPlot* depthTrackPlot() const; private slots: void slotSetMinDepth( int value ); diff --git a/ApplicationLibCode/UserInterface/RiuWellLogTrack.cpp b/ApplicationLibCode/UserInterface/RiuWellLogTrack.cpp index a26818c3a3..2bb3f09eb7 100644 --- a/ApplicationLibCode/UserInterface/RiuWellLogTrack.cpp +++ b/ApplicationLibCode/UserInterface/RiuWellLogTrack.cpp @@ -21,11 +21,16 @@ #include "RiaDefines.h" #include "RiaPlotDefines.h" + +#include "RimPlotAxisAnnotation.h" #include "RimWellLogCurve.h" #include "RimWellLogExtractionCurve.h" #include "RimWellLogTrack.h" +#include "RigWellLogCurveData.h" + #include "RiuGuiTheme.h" +#include "RiuPlotAnnotationTool.h" #include "RiuPlotCurve.h" #include "RiuPlotCurveInfoTextProvider.h" #include "RiuQwtCurvePointTracker.h" @@ -35,6 +40,7 @@ #include "qwt_plot_curve.h" #include "qwt_scale_draw.h" #include "qwt_scale_engine.h" +#include "qwt_scale_map.h" #include "qwt_scale_widget.h" #include @@ -73,13 +79,13 @@ class RiuWellLogCurvePointTracker : public RiuQwtCurvePointTracker RimWellLogPlot* wlp = nullptr; m_wellLogTrack->firstAncestorOfType( wlp ); - if ( wlp && wlp->depthOrientation() == RimDepthTrackPlot::DepthOrientation::VERTICAL ) + if ( wlp && wlp->depthOrientation() == RiaDefines::Orientation::HORIZONTAL ) { - str = QString( "%1\nDepth: %2" ).arg( xAxisValueString ).arg( depthAxisValueString ); + str = QString( "%1\nDepth: %2" ).arg( depthAxisValueString ).arg( xAxisValueString ); } else { - str = QString( "%1\nDepth: %2" ).arg( depthAxisValueString ).arg( xAxisValueString ); + str = QString( "%1\nDepth: %2" ).arg( xAxisValueString ).arg( depthAxisValueString ); } if ( !curveInfoText.isEmpty() ) @@ -114,10 +120,9 @@ class WellLogCurveInfoTextProvider : public RiuPlotCurveInfoTextProvider //-------------------------------------------------------------------------------------------------- QString curveInfoText( RiuPlotCurve* riuCurve ) const override { - RimWellLogCurve* wlCurve = nullptr; if ( riuCurve ) { - wlCurve = dynamic_cast( riuCurve->ownerRimCurve() ); + RimWellLogCurve* wlCurve = dynamic_cast( riuCurve->ownerRimCurve() ); if ( wlCurve ) { return QString( "%1" ).arg( wlCurve->curveName() ); @@ -126,6 +131,50 @@ class WellLogCurveInfoTextProvider : public RiuPlotCurveInfoTextProvider return ""; } + + //-------------------------------------------------------------------------------------------------- + /// + //-------------------------------------------------------------------------------------------------- + QString additionalText( RiuPlotCurve* curve, int sampleIndex ) const override + { + if ( !curve ) return {}; + + std::vector> propertyNameValues; + + auto* sourceCurve = curve->ownerRimCurve(); + if ( !sourceCurve ) return {}; + + auto annotationCurves = sourceCurve->additionalDataSources(); + for ( auto annotationCurve : annotationCurves ) + { + RimDepthTrackPlot* depthTrackPlot = nullptr; + annotationCurve->firstAncestorOfType( depthTrackPlot ); + if ( depthTrackPlot ) + { + auto [xValue, yValue] = curve->sample( sampleIndex ); + + auto depth = depthTrackPlot->depthOrientation() == RiaDefines::Orientation::VERTICAL ? yValue : xValue; + + auto propertyValue = annotationCurve->closestYValueForX( depth ); + + // Use template to get as short label as possible. The default curve name will often + // contain too much and redundant information. + QString templateText = RiaDefines::namingVariableResultName() + ", " + + RiaDefines::namingVariableResultType(); + auto resultName = annotationCurve->createCurveNameFromTemplate( templateText ); + + propertyNameValues.push_back( std::make_pair( resultName, propertyValue ) ); + } + } + + QString txt; + for ( const auto& [name, value] : propertyNameValues ) + { + txt += QString( "%1 : %2\n" ).arg( name ).arg( value ); + } + + return txt; + } }; static WellLogCurveInfoTextProvider wellLogCurveInfoTextProvider; @@ -138,12 +187,14 @@ RiuWellLogTrack::RiuWellLogTrack( RimWellLogTrack* track, QWidget* parent /*= nu RimWellLogPlot* wlp = nullptr; track->firstAncestorOfType( wlp ); - bool isVertical = ( wlp && wlp->depthOrientation() == RimDepthTrackPlot::DepthOrientation::VERTICAL ); + bool isVertical = ( wlp && wlp->depthOrientation() == RiaDefines::Orientation::VERTICAL ); setAxisEnabled( QwtAxis::YLeft, true ); setAxisEnabled( QwtAxis::YRight, false ); setAxisEnabled( QwtAxis::XTop, !isVertical ); setAxisEnabled( QwtAxis::XBottom, isVertical ); + m_annotationTool = std::make_unique(); + new RiuWellLogCurvePointTracker( this->qwtPlot(), &wellLogCurveInfoTextProvider, track ); } @@ -174,3 +225,71 @@ void RiuWellLogTrack::setAxisEnabled( QwtAxis::Position axis, bool enabled ) setAxisTitleEnabled( plotAxis, enabled ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuWellLogTrack::createAnnotationsInPlot( const std::vector& annotations ) +{ + m_annotationTool->detachAllAnnotations(); + + // Not required to update annotations in an invisible plot + if ( !plotDefinition()->showWindow() ) return; + + RimDepthTrackPlot* depthTrackPlot = nullptr; + m_plotDefinition->firstAncestorOfType( depthTrackPlot ); + if ( !depthTrackPlot ) return; + + auto orientation = depthTrackPlot->depthOrientation() == RiaDefines::Orientation::HORIZONTAL + ? RiaDefines::Orientation::VERTICAL + : RiaDefines::Orientation::HORIZONTAL; + for ( auto annotation : annotations ) + { + m_annotationTool->attachAnnotation( qwtPlot(), annotation, orientation ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuWellLogTrack::onMouseMoveEvent( QMouseEvent* mouseEvent ) +{ + // The mouse move event here is a mouse move event local to one track. The depth information here must be + // communicated to all tracks in the same depth track plot. And then, after the depth information has been updated, + // all well log tracks must be updated with the new depth marker line location. + + if ( !m_plotDefinition ) return; + if ( mouseEvent->type() != QMouseEvent::MouseMove ) return; + + RimDepthTrackPlot* depthTrackPlot = nullptr; + m_plotDefinition->firstAncestorOfType( depthTrackPlot ); + if ( !depthTrackPlot || !depthTrackPlot->isDepthMarkerLineEnabled() ) return; + + auto plotwidget = dynamic_cast( m_plotDefinition->plotWidget() ); + if ( !plotwidget ) return; + + auto qwtPlot = plotwidget->qwtPlot(); + if ( !qwtPlot ) return; + + auto riuPlotAxis = depthTrackPlot->depthAxis(); + auto qwtAxis = plotwidget->toQwtPlotAxis( riuPlotAxis ); + const QwtScaleMap axisMap = qwtPlot->canvasMap( qwtAxis ); + + double depth = 0.0; + if ( depthTrackPlot->depthOrientation() == RiaDefines::Orientation::HORIZONTAL ) + { + depth = axisMap.invTransform( mouseEvent->pos().x() ); + } + else + { + depth = axisMap.invTransform( mouseEvent->pos().y() ); + } + + depthTrackPlot->setDepthMarkerPosition( depth ); + + for ( auto p : depthTrackPlot->plots() ) + { + auto wellLogTrack = dynamic_cast( p ); + if ( wellLogTrack ) wellLogTrack->updateDepthMarkerLine(); + } +} diff --git a/ApplicationLibCode/UserInterface/RiuWellLogTrack.h b/ApplicationLibCode/UserInterface/RiuWellLogTrack.h index 60dda603c6..16979d4230 100644 --- a/ApplicationLibCode/UserInterface/RiuWellLogTrack.h +++ b/ApplicationLibCode/UserInterface/RiuWellLogTrack.h @@ -23,7 +23,10 @@ #include "qwt_plot.h" class RimWellLogTrack; +class RiuPlotAnnotationTool; +class RimPlotAxisAnnotation; class QWheelEvent; +class QMouseEvent; //================================================================================================== // @@ -39,4 +42,12 @@ class RiuWellLogTrack : public RiuQwtPlotWidget ~RiuWellLogTrack() override; void setAxisEnabled( QwtAxis::Position axis, bool enabled ); + + void createAnnotationsInPlot( const std::vector& annotations ); + +private: + void onMouseMoveEvent( QMouseEvent* event ) override; + +private: + std::unique_ptr m_annotationTool; }; diff --git a/ApplicationLibCode/UserInterface/RiuWellPathComponentPlotItem.cpp b/ApplicationLibCode/UserInterface/RiuWellPathComponentPlotItem.cpp index 0928c99922..e82e30aa8d 100644 --- a/ApplicationLibCode/UserInterface/RiuWellPathComponentPlotItem.cpp +++ b/ApplicationLibCode/UserInterface/RiuWellPathComponentPlotItem.cpp @@ -54,7 +54,7 @@ RiuWellPathComponentPlotItem::RiuWellPathComponentPlotItem( const RimWellPath* w , m_componentType( RiaDefines::WellPathComponentType::WELL_PATH ) , m_columnOffset( 0.0 ) , m_depthType( RiaDefines::DepthTypeEnum::MEASURED_DEPTH ) - , m_depthOrientation( RimWellLogPlot::DepthOrientation::VERTICAL ) + , m_depthOrientation( RiaDefines::Orientation::VERTICAL ) , m_maxColumnOffset( 0.0 ) , m_showLabel( false ) { @@ -186,7 +186,7 @@ void RiuWellPathComponentPlotItem::onLoadDataAndUpdate( bool updateParentPlot ) addColumnFeature( -posMax, -posMin, startDepth, endDepth, componentColor() ); addColumnFeature( posMin, posMax, startDepth, endDepth, componentColor() ); - if ( m_depthOrientation == RimWellLogPlot::DepthOrientation::VERTICAL ) + if ( m_depthOrientation == RiaDefines::Orientation::VERTICAL ) { addMarker( -posMax, endDepth, 12, RiuPlotCurveSymbol::SYMBOL_LEFT_ANGLED_TRIANGLE, componentColor() ); addMarker( posMax, endDepth, 12, RiuPlotCurveSymbol::SYMBOL_RIGHT_ANGLED_TRIANGLE, componentColor() ); @@ -227,7 +227,7 @@ void RiuWellPathComponentPlotItem::onLoadDataAndUpdate( bool updateParentPlot ) auto plotSymbol1 = RiuPlotCurveSymbol::SYMBOL_LEFT_ALIGNED_TRIANGLE; auto plotSymbol2 = RiuPlotCurveSymbol::SYMBOL_RIGHT_ALIGNED_TRIANGLE; - if ( m_depthOrientation == RimWellLogPlot::DepthOrientation::HORIZONTAL ) + if ( m_depthOrientation == RiaDefines::Orientation::HORIZONTAL ) { plotSymbol1 = RiuPlotCurveSymbol::SYMBOL_DOWN_TRIANGLE; plotSymbol2 = RiuPlotCurveSymbol::SYMBOL_UP_TRIANGLE; @@ -456,7 +456,7 @@ QwtPlotItem* marker->setSymbol( symbol ); marker->setSpacing( 6 ); - if ( m_depthOrientation == RimWellLogPlot::DepthOrientation::HORIZONTAL ) + if ( m_depthOrientation == RiaDefines::Orientation::HORIZONTAL ) { marker->setXValue( depth ); marker->setYValue( position ); @@ -483,7 +483,7 @@ QwtPlotItem* if ( drawLine ) { - if ( m_depthOrientation == RimWellLogPlot::DepthOrientation::HORIZONTAL ) + if ( m_depthOrientation == RiaDefines::Orientation::HORIZONTAL ) { marker->setLineStyle( QwtPlotMarker::HLine ); } @@ -512,7 +512,7 @@ void RiuWellPathComponentPlotItem::addColumnFeature( double startPositio double startY = startDepth; double endY = endDepth; - if ( m_depthOrientation == RimWellLogPlot::DepthOrientation::HORIZONTAL ) + if ( m_depthOrientation == RiaDefines::Orientation::HORIZONTAL ) { startX = startDepth; endX = endDepth; @@ -612,7 +612,7 @@ void RiuWellPathComponentPlotItem::setDepthType( RimWellLogPlot::DepthTypeEnum d //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiuWellPathComponentPlotItem::setDepthOrientation( RimWellLogPlot::DepthOrientation depthOrientation ) +void RiuWellPathComponentPlotItem::setDepthOrientation( RiaDefines::Orientation depthOrientation ) { m_depthOrientation = depthOrientation; } @@ -658,7 +658,7 @@ void RiuWellPathComponentPlotItem::attachToQwt() auto riuAxis = RimDepthTrackPlot::annotationAxis( m_depthOrientation ); auto qwtAxis = RiuQwtPlotTools::toQwtPlotAxisEnum( riuAxis.axis() ); - if ( m_depthOrientation == RimWellLogPlot::DepthOrientation::VERTICAL ) + if ( m_depthOrientation == RiaDefines::Orientation::VERTICAL ) { m_combinedComponentGroup.setXAxis( qwtAxis ); } diff --git a/ApplicationLibCode/UserInterface/RiuWellPathComponentPlotItem.h b/ApplicationLibCode/UserInterface/RiuWellPathComponentPlotItem.h index 82e297934b..d36b160c6a 100644 --- a/ApplicationLibCode/UserInterface/RiuWellPathComponentPlotItem.h +++ b/ApplicationLibCode/UserInterface/RiuWellPathComponentPlotItem.h @@ -65,7 +65,7 @@ class RiuWellPathComponentPlotItem void setShowLabel( bool showLabel ); void setDepthType( RimWellLogPlot::DepthTypeEnum depthType ); - void setDepthOrientation( RimWellLogPlot::DepthOrientation depthOrientation ); + void setDepthOrientation( RiaDefines::Orientation depthOrientation ); void setContributeToLegend( bool contributeToLegend ); void setParentPlotNoReplot( QwtPlot* plot ); @@ -124,10 +124,10 @@ class RiuWellPathComponentPlotItem double m_columnOffset; double m_maxColumnOffset; - RimWellLogPlot::DepthTypeEnum m_depthType; - RimWellLogPlot::DepthOrientation m_depthOrientation; - QPointer m_parentQwtPlot; - RiuQwtPlotItemGroup m_combinedComponentGroup; + RimWellLogPlot::DepthTypeEnum m_depthType; + RiaDefines::Orientation m_depthOrientation; + QPointer m_parentQwtPlot; + RiuQwtPlotItemGroup m_combinedComponentGroup; bool m_showLabel; }; diff --git a/CMakeLists.txt b/CMakeLists.txt index 26154330f1..a5d2d22a73 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -385,7 +385,9 @@ list(APPEND OPM_LIBRARIES custom-opm-flowdiagnostics custom-opm-flowdiag-app custom-opm-common ) -set_property(TARGET ${OPM_LIBRARIES} PROPERTY FOLDER "Thirdparty/OPM") +set_property( + TARGET ${OPM_LIBRARIES} opm-parser-tests PROPERTY FOLDER "Thirdparty/OPM" +) # ############################################################################## # NRLib @@ -401,14 +403,7 @@ list(APPEND THIRD_PARTY_LIBRARIES NRLib) set(RI_QT_MINIMUM_VERSION 5.12) find_package( - Qt5 ${RI_QT_MINIMUM_VERSION} - COMPONENTS Core - Gui - OpenGL - Network - Script - ScriptTools - Widgets + Qt5 ${RI_QT_MINIMUM_VERSION} COMPONENTS Core Gui OpenGL Network Widgets ) # Open GL @@ -451,7 +446,7 @@ list(APPEND THIRD_PARTY_LIBRARIES qwt) # ############################################################################## set(ADS_VERSION "3.8.2") -add_subdirectory(ThirdParty/qtadvanceddocking) +add_subdirectory(ThirdParty/qtadvanceddocking EXCLUDE_FROM_ALL) if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") target_compile_options(qtadvanceddocking PRIVATE -Wno-deprecated-copy) @@ -500,6 +495,13 @@ endif() list(APPEND THIRD_PARTY_LIBRARIES clipper) +# ############################################################################## +# roffcpp +# ############################################################################## + +add_subdirectory(ThirdParty/roffcpp) +list(APPEND THIRD_PARTY_LIBRARIES roffcpp) + # ############################################################################## # Thirdparty libraries are put in ThirdParty solution folder # ############################################################################## diff --git a/Fwk/AppFwk/CommonCode/cvfStructGrid.cpp b/Fwk/AppFwk/CommonCode/cvfStructGrid.cpp index 08d947dbb6..fb7d30d48b 100644 --- a/Fwk/AppFwk/CommonCode/cvfStructGrid.cpp +++ b/Fwk/AppFwk/CommonCode/cvfStructGrid.cpp @@ -36,6 +36,7 @@ #include "cvfStructGrid.h" #include "cvfBase.h" +#include "cvfBoundingBox.h" namespace caf { @@ -360,6 +361,16 @@ void StructGridInterface::characteristicCellSizes( double* iSize, double* jSize, size_t cellIndex = cellIndexFromIJK( i, j, k ); cellCornerVertices( cellIndex, cornerVerts ); + cvf::BoundingBox bb; + for ( const auto& v : cornerVerts ) + { + bb.add( v ); + } + + // Exclude cells with very small volumes + const double tolerance = 0.2; + if ( bb.extent().z() < tolerance ) continue; + iLengthAccumulated += ( cornerVerts[faceConnPosI[0]] - cornerVerts[faceConnNegI[0]] ).lengthSquared(); iLengthAccumulated += diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiFieldHandle.cpp b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiFieldHandle.cpp index 28522d5ea1..83708df874 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiFieldHandle.cpp +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiFieldHandle.cpp @@ -212,27 +212,21 @@ std::vector> PdmUiFieldHandle::attributes() const //-------------------------------------------------------------------------------------------------- void PdmUiFieldHandle::setAttributes( const std::vector>& attributes ) { - for ( auto [key, valueString] : attributes ) + for ( const auto& [key, valueString] : attributes ) { - valueString = valueString.toUpper(); + if ( valueString.toUpper() != "TRUE" ) continue; if ( key == "autoValueEnabled" ) { - if ( valueString == "TRUE" ) - { - // If notifyFieldChanged equals true, recursion will happen. Triggered by - // RimSummaryPlot::copyMatchingAxisPropertiesFromOther(), where data from one object is copied and set - // in another object using readObjectFromXmlString() - bool notifyFieldChanged = false; - enableAutoValue( true, notifyFieldChanged ); - } + // If notifyFieldChanged equals true, recursion will happen. Triggered by + // RimSummaryPlot::copyMatchingAxisPropertiesFromOther(), where data from one object is copied and set + // in another object using readObjectFromXmlString() + bool notifyFieldChanged = false; + enableAutoValue( true, notifyFieldChanged ); } else if ( key == "autoValueSupported" ) { - if ( valueString == "TRUE" ) - { - enableAutoValueSupport( true ); - } + enableAutoValueSupport( true ); } } } diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiComboBoxEditor.cpp b/Fwk/AppFwk/cafUserInterface/cafPdmUiComboBoxEditor.cpp index 58f994f22f..1f51f29ec4 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiComboBoxEditor.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiComboBoxEditor.cpp @@ -386,7 +386,7 @@ QWidget* PdmUiComboBoxEditor::createEditorWidget( QWidget* parent ) connect( m_comboBox, SIGNAL( activated( int ) ), this, SLOT( slotIndexActivated( int ) ) ); - m_autoValueToolButton = new QToolButton(); + m_autoValueToolButton = new QToolButton( m_placeholder ); m_autoValueToolButton->setCheckable( true ); m_autoValueToolButton->setToolButtonStyle( Qt::ToolButtonIconOnly ); diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.cpp b/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.cpp index cee18b48d1..6f6e08721e 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiLineEditor.cpp @@ -98,7 +98,7 @@ QWidget* PdmUiLineEditor::createEditorWidget( QWidget* parent ) m_layout->setSpacing( 0 ); m_layout->addWidget( m_lineEdit ); - m_autoValueToolButton = new QToolButton(); + m_autoValueToolButton = new QToolButton( m_placeholder ); m_autoValueToolButton->setCheckable( true ); m_autoValueToolButton->setToolButtonStyle( Qt::ToolButtonIconOnly ); diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiPropertyView.cpp b/Fwk/AppFwk/cafUserInterface/cafPdmUiPropertyView.cpp index 598e750fd8..cb30269632 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiPropertyView.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiPropertyView.cpp @@ -151,7 +151,15 @@ void PdmUiPropertyView::showProperties( PdmObjectHandle* object ) { if ( object ) { - PdmUiObjectHandle* uiObject1 = uiObj( m_defaultObjectEditor->pdmObject() ); + // Avoid using uiObj( m_defaultObjectEditor->pdmObject() ), as the ui capability can be removed by a + // delete operation. See RicDeleteItemExec::redo() and use of obj->prepareForDelete() + PdmUiObjectHandle* uiObject1 = m_defaultObjectEditor->pdmObject()->capability(); + if ( !uiObject1 ) + { + rebuildWidget = true; + m_defaultObjectEditor->setPdmObject( nullptr ); + } + PdmUiObjectHandle* uiObject2 = uiObj( object ); if ( uiObject1 && uiObject2 && @@ -192,7 +200,7 @@ void PdmUiPropertyView::showProperties( PdmObjectHandle* object ) m_defaultObjectEditor->updateUi( m_uiConfigName ); m_scrollArea->updateGeometry(); -} +} // namespace caf //-------------------------------------------------------------------------------------------------- /// diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiTableViewEditor.cpp b/Fwk/AppFwk/cafUserInterface/cafPdmUiTableViewEditor.cpp index bd490f6ba1..c369dbf64b 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiTableViewEditor.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiTableViewEditor.cpp @@ -58,6 +58,38 @@ namespace caf { +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TableView::TableView( QWidget* parent /*= nullptr */ ) + : QTableView( parent ) + , m_heightHint( -1 ) +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QSize TableView::sizeHint() const +{ + QSize mySize = QTableView::sizeHint(); + + if ( m_heightHint > 0 ) + { + mySize.setHeight( m_heightHint ); + } + + return mySize; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void TableView::setHeightHint( int heightHint ) +{ + m_heightHint = heightHint; +} + CAF_PDM_UI_FIELD_EDITOR_SOURCE_INIT( PdmUiTableViewEditor ); //-------------------------------------------------------------------------------------------------- @@ -100,7 +132,7 @@ QWidget* PdmUiTableViewEditor::createEditorWidget( QWidget* parent ) m_delegate = new PdmUiTableViewDelegate( nullptr, m_tableModelPdm ); - m_tableView = new QTableView( parent ); + m_tableView = new TableView( parent ); m_tableView->setShowGrid( true ); m_tableView->setModel( m_tableModelPdm ); m_tableView->installEventFilter( this ); @@ -246,6 +278,11 @@ void PdmUiTableViewEditor::configureAndUpdateUi( const QString& uiConfigName ) } } + if ( editorAttrib.heightHint > -1 ) + { + m_tableView->setHeightHint( editorAttrib.heightHint ); + } + m_previousFieldHandle = childArrayFH; // Set default row heights diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiTableViewEditor.h b/Fwk/AppFwk/cafUserInterface/cafPdmUiTableViewEditor.h index 413938ccdd..f66fe42eb6 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiTableViewEditor.h +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiTableViewEditor.h @@ -42,11 +42,11 @@ #include #include +#include #include class QItemSelection; class QLabel; -class QTableView; namespace caf { @@ -57,6 +57,18 @@ class PdmUiTableViewDelegate; class PdmUiTableViewQModel; class PdmChildArrayFieldHandle; +class TableView : public QTableView +{ +public: + explicit TableView( QWidget* parent = nullptr ); + + QSize sizeHint() const override; + void setHeightHint( int heightHint ); + +private: + int m_heightHint; +}; + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -90,6 +102,7 @@ class PdmUiTableViewEditorAttribute : public PdmUiEditorAttribute , rowSelectionLevel( 1 ) , enableHeaderText( true ) , minimumHeight( -1 ) + , heightHint( -1 ) , alwaysEnforceResizePolicy( false ) , resizePolicy( NO_AUTOMATIC_RESIZE ) , enableDropTarget( false ) @@ -104,6 +117,7 @@ class PdmUiTableViewEditorAttribute : public PdmUiEditorAttribute bool enableHeaderText; std::vector columnWidths; int minimumHeight; ///< Not used if If < 0 + int heightHint; ///< Not used if If < 0 QColor baseColor; bool alwaysEnforceResizePolicy; ResizePolicy resizePolicy; @@ -155,7 +169,7 @@ private slots: QPointer m_tableHeading; QPointer m_tableHeadingIcon; - QTableView* m_tableView; + TableView* m_tableView; PdmUiTableViewQModel* m_tableModelPdm; PdmUiTableViewDelegate* m_delegate; diff --git a/Fwk/AppFwk/cafViewer/cafOpenGLWidget.h b/Fwk/AppFwk/cafViewer/cafOpenGLWidget.h index 0da8fe54cc..7237990f98 100644 --- a/Fwk/AppFwk/cafViewer/cafOpenGLWidget.h +++ b/Fwk/AppFwk/cafViewer/cafOpenGLWidget.h @@ -58,7 +58,7 @@ class OpenGLWidget : public QGLWidget const QGLFormat& format, QWidget* parent, OpenGLWidget* shareWidget = nullptr, - Qt::WindowFlags f = nullptr ); + Qt::WindowFlags f = Qt::WindowFlags() ); OpenGLWidget( OpenGLWidget* shareWidget, QWidget* parent, Qt::WindowFlags f = Qt::WindowFlags() ); cvf::OpenGLContext* cvfOpenGLContext() const; diff --git a/Fwk/VizFwk/LibGeometry/cvfBoundingBoxTree.cpp b/Fwk/VizFwk/LibGeometry/cvfBoundingBoxTree.cpp index 7fbc9d3e8b..54666fd83a 100644 --- a/Fwk/VizFwk/LibGeometry/cvfBoundingBoxTree.cpp +++ b/Fwk/VizFwk/LibGeometry/cvfBoundingBoxTree.cpp @@ -134,10 +134,11 @@ namespace cvf { public: AABBTreeNodeLeaf(); - size_t index() const; - void setIndex(size_t index); + std::vector ids() const; + void setIds(const std::vector& ids); + private: - size_t m_index; ///< An index of the leaf node. The interpretation of this index is depending on which tree the node is in. + std::vector m_ids; ///< An list of IDs of the leaf node. The interpretation of these values depends on which tree the node is in. }; //================================================================================================================================= @@ -168,7 +169,7 @@ namespace cvf { size_t leavesCount() const; bool boundingBox(cvf::BoundingBox* pBox) const; - cvf::String treeInfo() const; + std::string treeInfo() const; protected: virtual cvf::BoundingBox createLeaves() = 0; @@ -185,7 +186,7 @@ namespace cvf { bool intersect(const AABBTreeNode* pA, const AABBTreeNode* pB) const; AABBTreeNodeInternal* createNode(); - AABBTreeNodeLeaf* createOrAssignLeaf(size_t leafIndex, size_t bbId); + AABBTreeNodeLeaf* createOrAssignLeaf(size_t leafIndex, const std::vector& bbIds); private: static void deleteInternalNodesBottomUp(AABBTreeNode* node); @@ -218,6 +219,8 @@ namespace cvf { class BoundingBoxTreeImpl : public AABBTree { BoundingBoxTreeImpl() {} + + void buildTree(const std::vector& boundingBoxes, const std::vector>& ids); private: friend class BoundingBoxTree; @@ -225,10 +228,10 @@ namespace cvf { cvf::BoundingBox createLeaves(); void findIntersections(const cvf::BoundingBox& bb, std::vector& bbIds) const; - void findIntersections(const cvf::BoundingBox& bb, const AABBTreeNode* node, std::vector& indices) const; + void findIntersections(const cvf::BoundingBox& bb, const AABBTreeNode* node, std::vector& ids) const; std::vector m_validBoundingBoxes; - std::vector m_validOptionalBoundingBoxIds; + std::vector> m_validOptionalBoundingBoxIds; }; } @@ -411,25 +414,23 @@ void AABBTreeNodeInternal::setRight(AABBTreeNode* right) AABBTreeNodeLeaf::AABBTreeNodeLeaf() { m_type = AB_LEAF; - - m_index = std::numeric_limits::max(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -size_t AABBTreeNodeLeaf::index() const +std::vector AABBTreeNodeLeaf::ids() const { - return m_index; + return m_ids; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void AABBTreeNodeLeaf::setIndex(size_t index) +void AABBTreeNodeLeaf::setIds(const std::vector& ids) { - m_index = index; + m_ids = ids; } //-------------------------------------------------------------------------------------------------- @@ -711,32 +712,29 @@ size_t AABBTree::treeHeight(const AABBTreeNode* pNode, size_t iLevel, size_t* pi //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -cvf::String AABBTree::treeInfo() const +std::string AABBTree::treeInfo() const { - cvf::String sInfo; - - /* - sInfo = cvf::String("Tree size: %1 \n").arg(static_cast(treeSize())); - sInfo += cvf::String("Num leaves: %1 \n").arg(static_cast(leavesCount())); + size_t treeSizeInMB = treeSize() / (1024u *1024u); + auto text = "Tree size : " + std::to_string(treeSizeInMB) + "[MB] \n"; + + text += "Num leaves: " + std::to_string(leavesCount()) + "\n"; size_t iMin = cvf::UNDEFINED_UINT; size_t iMax = 0; size_t iSumHeight = treeHeight(m_pRoot, 1, &iMin, &iMax); size_t iAvgHeigth = 0; - size_t iIdealHeigth = 0; if (leavesCount() > 0 ) iAvgHeigth = iSumHeight/leavesCount(); + + auto iIdealHeigth = (cvf::uint)ceil((log((float)leavesCount())/log(2.0f))); - sInfo += VTString::MakeForm("Tree height: Min: %d - Max: %d - Avg: %d - Ideal: %d\n", iMin, iMax, iAvgHeigth, (VTint)ceil((log((VTfloat)GetNumLeaves())/log(2.0f)))); - iIdealHeigth = (cvf::uint)ceil((log((float)leavesCount())/log(2.0f))); - sInfo = cvf::String("Tree height: Min: %1 - Max: %2 - Avg: %3 - Ideal: %4\n").arg(iMin).arg(iMax).arg(iAvgHeigth).arg(iIdealHeigth); - - cvf::BoundingBox bb; - boundingBox(&bb); - sInfo += bb.debugString(); - */ - - return sInfo; + text += "Tree height: \n"; + text += " Min : " + std::to_string(iMin) + "\n"; + text += " Max : " + std::to_string(iMax) + "\n"; + text += " Avg : " + std::to_string(iAvgHeigth) + "\n"; + text += " Ideal : " + std::to_string(iIdealHeigth) + "\n"; + + return text; } //-------------------------------------------------------------------------------------------------- @@ -780,10 +778,10 @@ cvf::AABBTreeNodeInternal* AABBTree::createNode() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -cvf::AABBTreeNodeLeaf* AABBTree::createOrAssignLeaf(size_t leafIndex, size_t bbId) +cvf::AABBTreeNodeLeaf* AABBTree::createOrAssignLeaf(size_t leafIndex, const std::vector& bbIds) { cvf::AABBTreeNodeLeaf* leaf = &m_leafPool[leafIndex]; - leaf->setIndex(bbId); + leaf->setIds(bbIds); return leaf; } @@ -805,6 +803,22 @@ void AABBTree::deleteInternalNodesBottomUp(AABBTreeNode* node) delete internalNode; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void BoundingBoxTreeImpl::buildTree(const std::vector& boundingBoxes, const std::vector>& ids) +{ + // Assign data used in the tree construction + m_validBoundingBoxes = boundingBoxes; + m_validOptionalBoundingBoxIds = ids; + + AABBTree::buildTree(); + + // Release the memory used by the bounding boxes and ids, as this information is now distributed in the tree + m_validBoundingBoxes.clear(); + m_validOptionalBoundingBoxIds.clear(); +} + //-------------------------------------------------------------------------------------------------- /// Creates leafs for the supplied valid bounding boxes, keeping the original index //-------------------------------------------------------------------------------------------------- @@ -821,10 +835,10 @@ cvf::BoundingBox BoundingBoxTreeImpl::createLeaves() #pragma omp for for (int i = 0; i < (int)m_validBoundingBoxes.size(); i++) { - size_t bbId = i; - if (!m_validOptionalBoundingBoxIds.empty()) bbId = m_validOptionalBoundingBoxIds[i]; + std::vector bbIds = {i}; + if (!m_validOptionalBoundingBoxIds.empty()) bbIds = m_validOptionalBoundingBoxIds[i]; - AABBTreeNodeLeaf* leaf = createOrAssignLeaf(i, bbId); + AABBTreeNodeLeaf* leaf = createOrAssignLeaf(i, bbIds); leaf->setBoundingBox(m_validBoundingBoxes[i]); @@ -856,7 +870,7 @@ void BoundingBoxTreeImpl::findIntersections(const cvf::BoundingBox& bb, std::vec //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void BoundingBoxTreeImpl::findIntersections(const cvf::BoundingBox& bb, const AABBTreeNode* node, std::vector& cvIndices) const +void BoundingBoxTreeImpl::findIntersections(const cvf::BoundingBox& bb, const AABBTreeNode* node, std::vector& ids) const { CVF_TIGHT_ASSERT(bb.isValid()); @@ -866,7 +880,9 @@ void BoundingBoxTreeImpl::findIntersections(const cvf::BoundingBox& bb, const AA { const AABBTreeNodeLeaf* leaf = static_cast(node); { - cvIndices.push_back(leaf->index()); + auto leafIds = leaf->ids(); + + ids.insert(ids.end(), leafIds.begin(), leafIds.end()); return; } } @@ -874,8 +890,8 @@ void BoundingBoxTreeImpl::findIntersections(const cvf::BoundingBox& bb, const AA { const AABBTreeNodeInternal* internalNode = static_cast(node); - findIntersections(bb, internalNode->left(), cvIndices); - findIntersections(bb, internalNode->right(), cvIndices); + findIntersections(bb, internalNode->left(), ids); + findIntersections(bb, internalNode->right(), ids); } } } @@ -906,23 +922,50 @@ void BoundingBoxTree::buildTreeFromBoundingBoxes(const std::vectorsize()); - m_implTree->m_validBoundingBoxes.clear(); - m_implTree->m_validBoundingBoxes.reserve(boundingBoxes.size()); + std::vector validBoundingBoxes; + std::vector> validOptionalBoundingBoxIds; + + validBoundingBoxes.reserve(boundingBoxes.size()); if (optionalBoundingBoxIds) - m_implTree->m_validOptionalBoundingBoxIds.reserve(optionalBoundingBoxIds->size()); + validOptionalBoundingBoxIds.reserve(optionalBoundingBoxIds->size()); - for (int i = 0; i < (int)boundingBoxes.size(); ++i) + for (size_t i = 0; i < boundingBoxes.size(); ++i) { if (boundingBoxes[i].isValid()) { - m_implTree->m_validBoundingBoxes.push_back(boundingBoxes[i]); + validBoundingBoxes.push_back(boundingBoxes[i]); if (optionalBoundingBoxIds) { - m_implTree->m_validOptionalBoundingBoxIds.push_back((*optionalBoundingBoxIds)[i]); + const auto& id = (*optionalBoundingBoxIds)[i]; + + std::vector ids = {static_cast(id)}; + validOptionalBoundingBoxIds.push_back(ids); } } } - m_implTree->buildTree(); + + m_implTree->buildTree(validBoundingBoxes, validOptionalBoundingBoxIds); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void BoundingBoxTree::buildTreeFromBoundingBoxesOptimized(const std::vector& boundingBoxes, + const std::vector>& optionalBoundingBoxIds) +{ + std::vector validBoundingBoxes; + std::vector> validOptionalBoundingBoxIds; + + for (int i = 0; i < (int)boundingBoxes.size(); ++i) + { + if (boundingBoxes[i].isValid()) + { + validBoundingBoxes.push_back(boundingBoxes[i]); + validOptionalBoundingBoxIds.push_back(optionalBoundingBoxIds[i]); + } + } + + m_implTree->buildTree(validBoundingBoxes, validOptionalBoundingBoxIds); } //-------------------------------------------------------------------------------------------------- @@ -935,5 +978,13 @@ void BoundingBoxTree::findIntersections(const cvf::BoundingBox& bb, std::vector< m_implTree->findIntersections(bb, *bbIdsOrIndices); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::string BoundingBoxTree::info() const +{ + return m_implTree->treeInfo(); +} + } // namespace cvf diff --git a/Fwk/VizFwk/LibGeometry/cvfBoundingBoxTree.h b/Fwk/VizFwk/LibGeometry/cvfBoundingBoxTree.h index 041ea5e8de..070c95fc5c 100644 --- a/Fwk/VizFwk/LibGeometry/cvfBoundingBoxTree.h +++ b/Fwk/VizFwk/LibGeometry/cvfBoundingBoxTree.h @@ -57,9 +57,14 @@ class BoundingBoxTree : public cvf::Object void buildTreeFromBoundingBoxes(const std::vector& boundingBoxes, const std::vector* optionalBoundingBoxIds); - + + void buildTreeFromBoundingBoxesOptimized(const std::vector& boundingBoxes, + const std::vector>& optionalBoundingBoxIds); + void findIntersections(const cvf::BoundingBox& inputBB, std::vector* bbIdsOrIndexesIntersected) const; + std::string info() const; + private: BoundingBoxTreeImpl* m_implTree; diff --git a/Fwk/VizFwk/LibGuiQt/cvfqtUtils.cpp b/Fwk/VizFwk/LibGuiQt/cvfqtUtils.cpp index 2d9b315772..2c777b26a4 100644 --- a/Fwk/VizFwk/LibGuiQt/cvfqtUtils.cpp +++ b/Fwk/VizFwk/LibGuiQt/cvfqtUtils.cpp @@ -232,10 +232,11 @@ void Utils::toTextureImageRegion(const QImage& qImage, const cvf::Vec2ui& srcPos // Check if QImage has format QImage::Format_ARGB32, and use a more optimized path if (qImage.format() == QImage::Format_ARGB32) { - for (cvf::uint y = 0; y < sizeY; ++y) +#pragma omp for + for (int y = 0; y < static_cast(sizeY); ++y) { const cvf::uint scanLineIdx = srcPosY + sizeY - y - 1; - const QRgb* qWholeScanLine = reinterpret_cast(qImage.scanLine(scanLineIdx)); + const QRgb* qWholeScanLine = reinterpret_cast(qImage.constScanLine(scanLineIdx)); const QRgb* qPixels = &qWholeScanLine[srcPosX]; const cvf::uint dstStartIdx = 4*(y*sizeX); @@ -254,7 +255,8 @@ void Utils::toTextureImageRegion(const QImage& qImage, const cvf::Vec2ui& srcPos else { cvf::Color4ub cvfRgbVal; - for (cvf::uint y = 0; y < sizeY; ++y) +#pragma omp for + for (int y = 0; y < static_cast(sizeY); ++y) { const cvf::uint qImageYPos = srcPosY + sizeY - y - 1; for (cvf::uint x = 0; x < sizeX; ++x) diff --git a/GrpcInterface/Python/rips/PythonExamples/create_surface_from_thermal_fracture.py b/GrpcInterface/Python/rips/PythonExamples/create_surface_from_thermal_fracture.py new file mode 100644 index 0000000000..ad75dacb17 --- /dev/null +++ b/GrpcInterface/Python/rips/PythonExamples/create_surface_from_thermal_fracture.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python +# coding: utf-8 + +import rips +import tempfile +from os.path import expanduser +from pathlib import Path +import numpy as np +import pyvista as pv + + +def generate_surface_from_file(path): + point_cloud_data = np.loadtxt(path, delimiter=" ", skiprows=1) + + # Get [x, y, z] components in separate matrix + num_rows = point_cloud_data.shape[0] + xyz = point_cloud_data[0:num_rows, 0:3] + + # Generate surface + cloud = pv.PolyData(xyz) + surf = cloud.delaunay_2d() + + # Read properties names from header data + f = open(path) + header = f.readline() + properties = header.strip().split(" ") + + return (surf, point_cloud_data, properties) + + +def export_surface_as_ts_file(surf, point_cloud, properties, path): + + # open text file + text_file = open(path, "w") + + # write GOCAD header + top_header = """GOCAD TSurf 1 +HEADER { +name:MF_027_SU +} +""" + + properties_str = "PROPERTIES " + " ".join(properties) + + bottom_header = """ +GOCAD_ORIGINAL_COORDINATE_SYSTEM +NAME Default +AXIS_NAME "X" "Y" "Z" +AXIS_UNIT "m" "m" "m" +ZPOSITIVE Depth +END_ORIGINAL_COORDINATE_SYSTEM +TFACE +""" + + text_file.write(top_header) + text_file.write(properties_str) + text_file.write(bottom_header) + + i = 1 + (num_rows, num_props) = point_cloud.shape + for row in range(0, num_rows): + x = point_cloud[row, 0] + y = point_cloud[row, 1] + z = point_cloud[row, 2] + txt = "PVRTX {} {:.3f} {:.3f} {:.3f} ".format(i, x, y, z) + for property_index in range(0, num_props): + txt += "{:.3f} ".format(point_cloud[row, property_index]) + txt += "\n" + text_file.write(txt) + i += 1 + + mysurface = surf.faces.reshape(-1, 4) + for p in mysurface: + txt = "TRGL {} {} {}\n".format(p[1] + 1, p[2] + 1, p[3] + 1) + text_file.write(txt) + + text_file.write("END") + text_file.close() + + +# Connect to ResInsight instance +resinsight = rips.Instance.find() +project = resinsight.project + + +fractures = project.descendants(rips.ThermalFractureTemplate) +print("Number of thermal fractures: ", len(fractures)) + + +temp_folder = tempfile.gettempdir() + +# Write results to a suitable directory +home_dir = expanduser("~") + +for fracture in fractures: + + fracture_name = fracture.user_description + + # Create the ouput directory + output_directory = ( + Path(home_dir) / "thermal_fracture_surfaces" / "{}".format(fracture_name) + ) + + output_directory.mkdir(parents=True, exist_ok=True) + print("Creating result directory: ", output_directory.as_posix()) + + time_steps = fracture.time_steps().values + for time_step_index, time_step in enumerate(time_steps): + print( + "Generating surface for time step #{}: {}".format( + time_step_index, time_step + ) + ) + temp_file_path = Path(temp_folder) / "output.xyz" + fracture.export_to_file( + file_path=temp_file_path.as_posix(), time_step=time_step_index + ) + + # Reconstruct a surface from the exported values file + (surface, point_cloud, properties) = generate_surface_from_file( + temp_file_path.as_posix() + ) + + # Export surface ts file from the surface data + output_file_path = output_directory / "time_step_{:03d}.ts".format( + time_step_index + ) + export_surface_as_ts_file( + surface, point_cloud, properties, output_file_path.as_posix() + ) + print( + "Wrote surface for time step #{} to {}".format( + time_step, output_file_path.as_posix() + ) + ) diff --git a/GrpcInterface/Python/rips/PythonExamples/import_fractures_on_well.py b/GrpcInterface/Python/rips/PythonExamples/import_fractures_on_well.py index 97eb8456a7..a73cbd9c0b 100644 --- a/GrpcInterface/Python/rips/PythonExamples/import_fractures_on_well.py +++ b/GrpcInterface/Python/rips/PythonExamples/import_fractures_on_well.py @@ -46,4 +46,25 @@ # Call update() to propagate changes from the Python object back to ResInsight fracture_template.orientation = "Azimuth" fracture_template.azimuth_angle = 60.0 +fracture_template.user_defined_perforation_length = True +fracture_template.conductivity_type = "InfiniteConductivity" +fracture_template.perforation_length = 12.3 fracture_template.update() + +# Scale the template +fracture_template.set_scale_factors( + half_length=2.0, height=2.0, d_factor=1.1, conductivity=1.2 +) + +# Output scale factors for all fracture templates +fmt_collection = project.descendants(rips.FractureTemplate) +for fracture_template in fmt_collection: + print( + "Fracture: '{}' Scale factors: Height={} Half Length={} D Factor={} Conductivity={}".format( + fracture_template.user_description, + fracture_template.height_scale_factor, + fracture_template.width_scale_factor, + fracture_template.d_factor_scale_factor, + fracture_template.conductivity_factor, + ) + ) diff --git a/GrpcInterface/Python/rips/PythonExamples/import_thermal_fracture_on_well.py b/GrpcInterface/Python/rips/PythonExamples/import_thermal_fracture_on_well.py new file mode 100644 index 0000000000..9502760eed --- /dev/null +++ b/GrpcInterface/Python/rips/PythonExamples/import_thermal_fracture_on_well.py @@ -0,0 +1,44 @@ +# Load ResInsight Processing Server Client Library +import rips +import tempfile +from os.path import expanduser +from pathlib import Path + +# Connect to ResInsight instance +resinsight = rips.Instance.find() +project = resinsight.project + +# Look for input files in the home directory of the user +home_dir = expanduser("~") +fracture_file_path = (Path(home_dir) / "fracture.csv").as_posix() +print("Thermal fracture file path:", fracture_file_path) + +# Find a case +cases = resinsight.project.cases() +case = cases[0] + +# Create thermal template +fmt_collection = project.descendants(rips.FractureTemplateCollection)[0] +fracture_template = fmt_collection.append_thermal_fracture_template( + file_path=fracture_file_path +) + +well_name = "F-1 H" + +# Find a well +well_path = project.well_path_by_name(well_name) +print("Well path:", well_path.name) + +# Create fracture and place it using data from the fracture template +fracture = well_path.add_thermal_fracture( + fracture_template=fracture_template, + place_using_template_data=True, +) + + +time_steps = fracture_template.time_steps().values +for time_step_index, time_stamp in enumerate(time_steps): + print("Time step #{}: {}".format(time_step_index, time_stamp)) + fracture_template.active_time_step_index = time_step_index + fracture_template.conductivity_result_name = "Conductivity" + fracture_template.update() diff --git a/GrpcInterface/Python/rips/tests/test_grids.py b/GrpcInterface/Python/rips/tests/test_grids.py index 002c9b342f..65027727c8 100644 --- a/GrpcInterface/Python/rips/tests/test_grids.py +++ b/GrpcInterface/Python/rips/tests/test_grids.py @@ -58,3 +58,40 @@ def test_10k(rips_instance, initialize_test): check_corner(cell_corners[cell_index].c5, expected_corners[5]) check_corner(cell_corners[cell_index].c6, expected_corners[6]) check_corner(cell_corners[cell_index].c7, expected_corners[7]) + + +def check_reek_grid_box(case): + assert len(case.grids()) == 1 + grid = case.grid(index=0) + + dimensions = grid.dimensions() + assert dimensions.i == 21 + assert dimensions.j == 23 + assert dimensions.k == 14 + + cell_centers = grid.cell_centers() + total_size = dimensions.i * dimensions.j * dimensions.k + assert len(cell_centers) == total_size + + poro = case.active_cell_property("INPUT_PROPERTY", "PORO", 0) + assert len(poro) == total_size + assert math.isclose(min(poro), 0.000928084715269506) + assert math.isclose(max(poro), 0.351595014333725) + + +def test_load_roff_binary_grid(rips_instance, initialize_test): + casePath = dataroot.PATH + "/reek/reek_box_grid_w_props.roff" + case = rips_instance.project.load_case(path=casePath) + check_reek_grid_box(case) + + +def test_load_roff_ascii_grid(rips_instance, initialize_test): + casePath = dataroot.PATH + "/reek/reek_box_grid_w_props.roffasc" + case = rips_instance.project.load_case(path=casePath) + check_reek_grid_box(case) + + +def test_load_grdecl_grid(rips_instance, initialize_test): + casePath = dataroot.PATH + "/reek/reek_box_grid_w_props.grdecl" + case = rips_instance.project.load_case(path=casePath) + check_reek_grid_box(case) diff --git a/GrpcInterface/RiaGrpcCallbacks.h b/GrpcInterface/RiaGrpcCallbacks.h index fdef188e9d..faebbb56cf 100644 --- a/GrpcInterface/RiaGrpcCallbacks.h +++ b/GrpcInterface/RiaGrpcCallbacks.h @@ -17,8 +17,6 @@ ////////////////////////////////////////////////////////////////////////////////// #pragma once -#include "RiaLogging.h" - #include #include #include diff --git a/GrpcInterface/RiaGrpcServer.cpp b/GrpcInterface/RiaGrpcServer.cpp index defc116527..6ca1062d92 100644 --- a/GrpcInterface/RiaGrpcServer.cpp +++ b/GrpcInterface/RiaGrpcServer.cpp @@ -208,13 +208,9 @@ void RiaGrpcServerImpl::quit() if ( m_server ) { RiaLogging::info( "Shutting down gRPC server" ); - // Clear unhandled requests - while ( !m_unprocessedRequests.empty() ) - { - RiaGrpcCallbackInterface* method = m_unprocessedRequests.front(); - m_unprocessedRequests.pop_front(); - delete method; - } + + // See the following link for details on how to shut down a GRPC server + // https://github.com/grpc/grpc/blob/master/include/grpcpp/server_builder.h#L147 // Shutdown server and queue m_server->Shutdown(); @@ -223,15 +219,40 @@ void RiaGrpcServerImpl::quit() // Wait for thread to join after handling the shutdown call m_thread.join(); - // Must destroy server before services - m_server.reset(); - m_completionQueue.reset(); + // Drain the completion queue + void* ignored_tag; + bool ignored_ok; + while ( m_completionQueue->Next( &ignored_tag, &ignored_ok ) ) + { + } - for ( auto c : m_allocatedCallbakcs ) { - delete c; + // Create a set of callbacks to be deleted. The same object may be present in both unprocessed and + // allocated. Delete the callbacks before deleting the server and completion queue to avoid crash. + + std::set toBeDeleted; + for ( auto r : m_unprocessedRequests ) + { + toBeDeleted.insert( r ); + } + + for ( auto r : m_allocatedCallbakcs ) + { + toBeDeleted.insert( r ); + } + + m_unprocessedRequests.clear(); + m_allocatedCallbakcs.clear(); + + for ( auto r : toBeDeleted ) + { + delete r; + } } - m_allocatedCallbakcs.clear(); + + // Must destroy server before services + m_server.reset(); + m_completionQueue.reset(); // Finally clear services m_services.clear(); diff --git a/GrpcInterface/RiaGrpcServiceInterface.cpp b/GrpcInterface/RiaGrpcServiceInterface.cpp index 308a5cd761..fcc94a592d 100644 --- a/GrpcInterface/RiaGrpcServiceInterface.cpp +++ b/GrpcInterface/RiaGrpcServiceInterface.cpp @@ -222,7 +222,7 @@ bool RiaGrpcServiceInterface::assignFieldValue( const QString& string CAF_ASSERT( oldValue && newValue ); auto scriptability = field->template capability(); - if ( field && scriptability != nullptr ) + if ( field && scriptability != nullptr && scriptability->isIOWriteable() ) { auto* valueField = dynamic_cast( field ); QTextStream stream( stringValue.toLatin1() ); diff --git a/ResInsightVersion.cmake b/ResInsightVersion.cmake index fd0eacf618..d7a9f9fe82 100644 --- a/ResInsightVersion.cmake +++ b/ResInsightVersion.cmake @@ -1,7 +1,7 @@ -set(RESINSIGHT_MAJOR_VERSION 2022) -set(RESINSIGHT_MINOR_VERSION 06) -set(RESINSIGHT_PATCH_VERSION 2) +set(RESINSIGHT_MAJOR_VERSION 2023) +set(RESINSIGHT_MINOR_VERSION 01) +set(RESINSIGHT_PATCH_VERSION 0) # Opional text with no restrictions #set(RESINSIGHT_VERSION_TEXT "-dev") @@ -11,7 +11,7 @@ set(RESINSIGHT_PATCH_VERSION 2) # Must be unique and increasing within one combination of major/minor/patch version # The uniqueness of this text is independent of RESINSIGHT_VERSION_TEXT # Format of text must be ".xx" -# set(RESINSIGHT_DEV_VERSION ".01") +#set(RESINSIGHT_DEV_VERSION ".07") # https://github.com/CRAVA/crava/tree/master/libs/nrlib set(NRLIB_GITHUB_SHA "ba35d4359882f1c6f5e9dc30eb95fe52af50fd6f") diff --git a/TestModels/reek/reek_box_grid_w_props.grdecl b/TestModels/reek/reek_box_grid_w_props.grdecl new file mode 100644 index 0000000000..5620009581 --- /dev/null +++ b/TestModels/reek/reek_box_grid_w_props.grdecl @@ -0,0 +1,15709 @@ +NOECHO + +-- ============================================================================= +-- +-- Exported from reek_grd_w_props +-- +-- Exported by user hhgs from RMS13 at 2022-12-12 22:51:01 +-- +-- ============================================================================= + +MAPUNITS +'METRES ' / + +MAPAXES +456510.625 5938935.500 +456510.625 5926880.172 +467216.753 5926880.172 / + +GRIDUNIT +'METRES ' ' ' / + +SPECGRID + 21 23 14 1 F / + +GDORIENT +INC INC INC DOWN RIGHT / + +COORD + 4303.157 7461.756 1627.402 4390.573 7451.828 1671.817 + 4436.038 7543.923 1628.720 4518.425 7534.058 1678.040 + 4589.559 7623.495 1642.102 4655.010 7615.537 1692.020 + 4745.012 7702.503 1657.648 4789.065 7698.094 1705.033 + 4874.187 7782.075 1639.690 4922.490 7782.831 1714.014 + 5021.082 7859.563 1640.968 5058.235 7868.799 1721.001 + 5166.913 7938.291 1647.416 5186.530 7949.973 1694.117 + 5308.051 8017.819 1651.675 5334.779 8038.769 1697.670 + 5443.619 8094.781 1649.600 5481.988 8125.337 1694.568 + 5573.307 8168.120 1646.130 5625.516 8207.796 1692.069 + 5702.553 8241.863 1646.796 5765.671 8287.662 1693.781 + 5827.422 8312.275 1648.370 5947.804 8398.018 1727.270 + 6012.400 8425.068 1686.640 6081.568 8473.198 1731.843 + 6137.274 8495.345 1685.093 6208.723 8544.816 1730.469 + 6264.244 8566.773 1682.068 6347.355 8625.063 1734.056 + 6407.600 8649.461 1684.920 6480.769 8701.755 1734.013 + 6543.628 8726.889 1683.472 6609.090 8774.544 1732.557 + 6682.527 8806.409 1687.980 6745.529 8852.958 1739.149 + 6833.824 8895.263 1705.801 6884.723 8933.274 1749.205 + 6976.897 8978.153 1716.544 7024.791 9014.154 1760.561 + 7117.517 9059.292 1724.545 7162.461 9093.148 1770.941 + 7251.932 9135.860 1730.627 7291.035 9165.237 1773.635 + 4371.498 7326.109 1627.606 4466.672 7313.676 1674.232 + 4515.779 7407.004 1631.082 4597.523 7395.655 1680.479 + 4672.373 7485.702 1643.271 4731.782 7477.891 1691.588 + 4826.202 7564.545 1655.798 4866.530 7561.321 1702.970 + 4954.460 7643.049 1634.548 5002.252 7646.985 1711.116 + 5101.358 7720.959 1636.446 5122.752 7727.910 1682.266 + 5246.860 7800.631 1643.395 5268.671 7814.160 1690.120 + 5388.887 7881.325 1647.488 5417.970 7903.695 1693.576 + 5528.036 7961.098 1648.319 5566.740 7991.671 1693.285 + 5661.485 8036.856 1645.455 5711.459 8075.393 1691.208 + 5792.117 8110.760 1643.390 5849.784 8154.131 1689.104 + 5917.901 8180.655 1641.903 6024.848 8261.134 1718.700 + 6045.895 8252.882 1641.915 6159.723 8337.297 1722.476 + 6222.677 8361.087 1675.972 6291.049 8411.017 1723.244 + 6352.975 8434.632 1674.871 6425.702 8488.104 1723.652 + 6490.992 8513.602 1675.034 6558.487 8564.008 1722.633 + 6623.542 8588.342 1671.645 6686.943 8636.466 1720.525 + 6759.939 8665.944 1674.594 6824.538 8715.617 1727.643 + 6905.945 8751.046 1687.714 6965.529 8797.275 1739.266 + 7053.420 8837.458 1702.612 7103.730 8876.683 1749.370 + 7195.493 8919.770 1712.755 7240.146 8954.619 1758.919 + 7330.356 8996.543 1719.623 7368.519 9026.247 1761.639 + 4450.775 7189.422 1631.582 4543.347 7175.152 1676.627 + 4597.402 7269.821 1632.241 4670.049 7258.077 1678.507 + 4753.632 7347.814 1641.453 4806.534 7340.763 1689.149 + 4908.459 7426.321 1654.257 4944.467 7425.285 1700.906 + 5035.221 7503.210 1629.154 5082.358 7512.381 1707.774 + 5181.583 7581.573 1631.626 5203.816 7591.742 1677.677 + 5325.584 7661.515 1635.818 5349.582 7678.379 1682.233 + 5467.194 7742.316 1638.564 5498.399 7767.526 1684.994 + 5607.124 7822.783 1640.484 5647.108 7855.502 1686.617 + 5740.464 7898.248 1636.360 5789.034 7937.147 1681.657 + 5872.508 7972.901 1633.213 5929.592 8017.703 1680.438 + 6002.351 8045.522 1631.752 6062.884 8093.057 1679.251 + 6130.888 8117.117 1631.603 6239.330 8202.427 1714.286 + 6306.652 8226.186 1667.324 6369.805 8274.714 1715.267 + 6437.434 8299.847 1667.223 6505.129 8351.909 1716.356 + 6572.598 8376.621 1667.135 6636.927 8426.721 1714.430 + 6704.451 8450.635 1663.987 6768.022 8500.844 1713.750 + 6839.311 8526.958 1665.478 6902.990 8577.802 1718.312 + 6984.253 8611.424 1677.380 7044.756 8660.074 1730.467 + 7134.510 8700.320 1695.269 7184.910 8740.981 1742.647 + 7275.934 8782.181 1705.854 7319.557 8817.382 1750.938 + 7409.917 8858.103 1712.922 7447.229 8888.139 1753.405 + 4534.081 7052.561 1635.160 4617.177 7036.520 1677.737 + 4678.015 7133.137 1630.220 4739.208 7120.984 1673.840 + 4835.568 7209.710 1638.356 4880.198 7203.733 1685.343 + 4989.694 7288.089 1650.926 5019.821 7289.908 1696.038 + 5115.402 7362.125 1622.000 5160.241 7378.780 1701.035 + 5260.394 7440.418 1623.881 5284.240 7456.166 1670.531 + 5402.656 7520.103 1625.025 5428.878 7542.366 1670.832 + 5541.493 7598.975 1623.711 5575.200 7629.397 1671.188 + 5679.574 7678.135 1624.811 5720.615 7714.488 1671.199 + 5811.804 7752.648 1620.008 5862.619 7796.047 1666.676 + 5948.263 7830.973 1619.680 6005.625 7878.502 1667.831 + 6081.434 7906.279 1618.825 6137.219 7951.958 1665.465 + 6211.680 7978.584 1619.923 6319.745 8067.830 1707.785 + 6388.784 8090.178 1659.366 6448.482 8138.133 1708.800 + 6519.895 8163.865 1660.623 6582.038 8213.532 1709.652 + 6653.059 8238.955 1661.118 6716.240 8289.933 1709.704 + 6787.985 8315.301 1661.422 6849.961 8365.907 1710.607 + 6921.589 8390.526 1661.408 6983.776 8441.768 1713.663 + 7060.434 8470.112 1667.526 7121.465 8520.689 1721.990 + 7212.824 8561.040 1687.697 7264.802 8604.228 1737.153 + 7357.957 8646.018 1702.922 7398.913 8680.058 1745.140 + 7490.423 8720.508 1709.890 7526.049 8750.077 1747.554 + 4616.704 6916.988 1635.618 4684.084 6898.679 1675.558 + 4761.228 6997.462 1626.782 4809.683 6983.326 1669.982 + 4919.276 7071.860 1634.750 4951.435 7066.097 1680.656 + 5070.492 7149.806 1646.697 5093.010 7154.358 1691.455 + 5195.414 7218.948 1613.137 5237.846 7246.974 1696.599 + 5336.805 7295.295 1612.813 5362.039 7319.267 1659.094 + 5475.941 7372.982 1609.885 5505.410 7404.232 1655.668 + 5614.906 7452.646 1608.941 5653.229 7493.001 1658.528 + 5752.645 7532.183 1610.150 5797.478 7576.751 1657.630 + 5885.983 7607.941 1607.018 5941.068 7659.364 1655.325 + 6023.640 7687.857 1607.047 6082.322 7739.931 1655.675 + 6159.311 7765.710 1606.884 6213.563 7812.298 1653.859 + 6291.473 7839.829 1609.194 6400.241 7932.713 1703.222 + 6472.291 7955.516 1655.093 6528.213 8002.162 1704.615 + 6603.081 8028.728 1657.268 6660.060 8075.708 1706.090 + 6734.116 8101.975 1658.022 6796.474 8153.686 1708.549 + 6871.025 8179.928 1661.077 6931.696 8230.735 1710.240 + 7002.172 8253.006 1658.431 7062.692 8304.081 1710.192 + 7142.290 8333.668 1665.120 7202.574 8384.810 1720.070 + 7293.680 8423.987 1685.100 7341.523 8464.698 1731.145 + 7441.232 8511.111 1703.672 7478.472 8542.846 1741.812 + 7571.832 8583.810 1709.707 7605.811 8612.778 1744.615 + 4703.498 6783.264 1634.509 4754.599 6758.924 1676.141 + 4854.350 6862.620 1626.690 4882.854 6843.237 1670.698 + 5007.479 6935.061 1632.994 5019.379 6926.387 1677.723 + 5151.786 7011.484 1642.500 5160.530 7016.970 1687.396 + 5278.341 7073.665 1605.154 5312.186 7117.076 1694.328 + 5413.084 7145.925 1603.485 5439.859 7182.050 1649.575 + 5551.285 7224.619 1601.077 5584.743 7269.096 1646.691 + 5689.064 7304.260 1598.068 5732.861 7358.954 1647.711 + 5827.595 7385.862 1599.064 5879.012 7444.489 1647.968 + 5964.640 7466.047 1599.185 6025.814 7529.678 1649.322 + 6104.022 7548.369 1600.317 6165.388 7607.537 1649.458 + 6239.970 7627.036 1599.851 6295.865 7677.914 1648.656 + 6372.371 7702.108 1601.548 6480.674 7797.427 1700.518 + 6504.881 7777.300 1606.230 6608.145 7866.085 1702.108 + 6685.011 7892.748 1655.569 6737.800 7937.390 1704.382 + 6814.832 7964.880 1657.075 6873.650 8014.690 1707.428 + 6951.702 8042.818 1661.323 7011.400 8093.739 1710.974 + 7085.677 8118.230 1660.525 7143.462 8167.850 1711.012 + 7227.183 8200.106 1668.167 7286.983 8251.736 1724.064 + 7375.592 8288.007 1686.328 7424.073 8330.042 1733.465 + 7522.202 8374.411 1704.623 7559.737 8407.068 1742.670 + 7652.263 8446.419 1710.453 7687.279 8476.969 1745.296 + 4800.048 6651.698 1634.467 4822.854 6616.116 1678.699 + 4956.302 6730.877 1628.724 4949.832 6699.751 1672.832 + 5102.147 6801.367 1633.007 5078.841 6781.825 1676.278 + 5235.702 6874.018 1639.618 5215.145 6873.076 1683.298 + 5370.964 6929.435 1599.626 5375.577 6985.116 1690.589 + 5492.881 6995.057 1598.677 5521.465 7050.631 1646.383 + 5629.910 7076.435 1595.762 5665.256 7136.723 1640.692 + 5764.870 7154.111 1589.473 5813.814 7228.142 1640.123 + 5907.058 7242.715 1593.179 5965.655 7320.685 1644.071 + 6046.802 7327.059 1595.245 6113.679 7405.750 1646.650 + 6185.901 7409.933 1596.587 6250.943 7478.840 1646.560 + 6320.971 7488.301 1595.671 6377.828 7543.666 1644.988 + 6453.160 7563.973 1596.417 6506.008 7612.256 1646.877 + 6583.412 7637.706 1600.892 6688.056 7729.555 1701.377 + 6765.392 7755.553 1654.947 6815.524 7798.824 1704.386 + 6895.522 7827.880 1658.391 6952.630 7877.035 1709.850 + 7033.676 7906.976 1665.128 7092.973 7958.230 1715.687 + 7169.899 7984.324 1666.415 7226.823 8033.808 1716.915 + 7311.883 8066.646 1674.561 7369.731 8117.239 1729.630 + 7455.282 8150.225 1688.360 7505.785 8194.665 1737.891 + 7599.461 8234.529 1704.126 7640.804 8271.123 1745.729 + 7731.440 8308.015 1711.313 7769.103 8341.539 1747.959 + 4905.334 6522.810 1636.162 4883.384 6469.030 1682.434 + 5069.071 6606.618 1629.577 5005.785 6550.461 1675.944 + 5207.717 6674.147 1632.522 5127.440 6630.051 1673.855 + 5322.673 6737.776 1637.954 5244.848 6712.699 1678.920 + 5488.086 6794.696 1594.808 5410.482 6839.747 1686.825 + 5580.610 6843.937 1593.957 5599.508 6918.278 1642.277 + 5713.379 6928.698 1590.261 5743.503 7003.951 1634.961 + 5847.090 7008.403 1584.039 5894.073 7100.326 1635.509 + 5988.025 7099.715 1587.898 6048.903 7196.846 1640.204 + 6127.720 7186.064 1590.979 6197.682 7280.359 1643.238 + 6265.958 7269.237 1593.030 6333.089 7347.830 1643.068 + 6399.972 7347.272 1592.147 6457.245 7407.143 1641.206 + 6532.913 7424.559 1593.318 6584.187 7473.470 1643.526 + 6662.119 7498.427 1597.932 6768.162 7593.019 1702.848 + 6844.748 7617.487 1655.086 6893.987 7660.725 1706.184 + 6978.529 7692.978 1663.640 7032.936 7740.432 1714.846 + 7114.006 7769.821 1669.583 7172.556 7820.935 1720.526 + 7251.158 7847.998 1672.926 7308.876 7898.620 1724.369 + 7392.687 7929.934 1681.124 7450.263 7980.776 1736.070 + 7534.429 8012.034 1692.596 7586.448 8058.346 1744.190 + 7677.810 8095.612 1706.668 7720.533 8133.978 1749.824 + 7811.891 8170.814 1714.418 7850.306 8205.609 1751.594 + 5010.187 6393.237 1639.884 4939.289 6320.220 1686.515 + 5189.250 6487.550 1629.955 5048.897 6393.267 1683.102 + 5311.312 6546.882 1634.355 5179.074 6478.492 1674.541 + 5409.695 6603.156 1637.816 5279.741 6551.704 1677.506 + 5634.120 6685.233 1589.135 5425.564 6669.603 1683.366 + 5684.440 6705.669 1588.252 5657.733 6850.055 1687.436 + 5803.117 6784.885 1583.407 5817.914 6868.078 1630.317 + 5934.118 6869.308 1579.880 5969.526 6967.222 1630.335 + 6070.194 6957.484 1582.372 6126.222 7066.314 1635.485 + 6208.341 7044.444 1586.775 6276.900 7149.798 1639.579 + 6344.778 7126.921 1589.718 6413.004 7214.445 1640.410 + 6477.849 7204.908 1589.423 6536.647 7270.447 1639.434 + 6612.661 7285.037 1592.365 6663.296 7335.434 1642.876 + 6742.118 7360.075 1597.642 6850.978 7459.140 1708.424 + 6926.600 7481.639 1658.861 6976.863 7526.484 1712.933 + 7063.055 7559.511 1671.334 7116.600 7606.763 1723.461 + 7196.020 7634.199 1676.371 7252.868 7684.243 1726.808 + 7332.940 7712.210 1681.371 7389.825 7762.457 1732.458 + 7473.564 7793.357 1689.622 7530.222 7843.781 1744.265 + 7614.764 7874.949 1699.844 7663.746 7918.988 1749.632 + 7759.023 7959.309 1713.590 7798.491 7995.200 1754.250 + 7892.259 8033.607 1718.272 7931.318 8069.539 1756.547 + 5105.749 6259.464 1645.178 5000.037 6174.738 1690.624 + 5285.849 6355.343 1635.954 5098.789 6240.816 1690.058 + 5403.743 6415.140 1636.704 5227.483 6325.665 1682.758 + 5494.942 6469.197 1638.528 5348.413 6409.128 1680.328 + 5641.125 6547.973 1624.346 5488.644 6519.775 1682.942 + 5800.998 6581.697 1576.795 5700.615 6669.444 1675.115 + 5899.496 6650.479 1575.362 5890.802 6721.817 1622.957 + 6022.255 6732.708 1573.890 6042.459 6826.976 1625.251 + 6153.170 6816.866 1576.206 6198.926 6925.056 1629.896 + 6289.152 6903.793 1582.562 6351.489 7010.358 1635.557 + 6423.116 6984.412 1586.494 6489.405 7075.448 1637.442 + 6558.608 7066.257 1590.049 6618.349 7136.140 1641.264 + 6695.160 7148.620 1595.452 6744.633 7199.670 1646.124 + 6823.747 7223.005 1600.403 6934.930 7326.758 1716.878 + 7011.413 7348.568 1667.173 7064.088 7396.317 1724.416 + 7150.177 7428.478 1681.711 7201.555 7474.346 1732.935 + 7282.149 7502.276 1686.459 7337.250 7551.188 1736.642 + 7414.848 7576.571 1689.535 7469.511 7625.198 1739.772 + 7552.702 7655.250 1696.370 7606.850 7703.804 1750.318 + 7691.447 7734.575 1703.837 7742.303 7780.727 1757.822 + 7832.979 7816.377 1713.654 7879.421 7859.111 1763.219 + 7970.892 7894.818 1721.000 8014.416 7935.448 1764.826 + 5193.950 6123.499 1650.622 5068.759 6033.481 1695.107 + 5351.691 6207.679 1646.601 5168.375 6099.065 1695.649 + 5470.971 6271.773 1644.044 5287.856 6178.133 1692.343 + 5566.093 6329.073 1643.425 5419.062 6266.577 1688.031 + 5742.597 6418.088 1615.376 5556.845 6370.438 1686.707 + 5914.879 6468.773 1566.107 5768.926 6500.593 1663.975 + 6000.417 6524.240 1565.500 5936.829 6624.570 1664.705 + 6111.353 6599.513 1567.001 6115.236 6677.712 1618.609 + 6238.683 6684.930 1572.968 6270.710 6775.887 1624.143 + 6372.257 6769.228 1580.368 6425.765 6866.411 1633.037 + 6504.840 6848.084 1585.823 6567.605 6936.872 1637.223 + 6642.827 6932.924 1593.854 6701.942 7003.611 1645.431 + 6777.525 7012.812 1598.979 6826.070 7063.987 1650.038 + 6905.599 7086.415 1603.945 7016.088 7191.568 1722.987 + 7094.778 7214.283 1673.790 7147.280 7262.485 1731.236 + 7234.572 7295.124 1688.792 7284.931 7340.584 1740.399 + 7365.540 7367.984 1692.924 7418.841 7415.728 1743.263 + 7495.491 7439.803 1694.943 7549.163 7487.940 1746.160 + 7632.246 7517.475 1702.032 7683.444 7563.781 1755.534 + 7782.035 7606.873 1722.262 7817.412 7639.302 1761.940 + 7917.995 7683.604 1725.150 7959.953 7722.687 1772.131 + 8056.189 7762.303 1730.486 8097.124 7801.087 1773.545 + 5273.454 5983.842 1656.702 5139.722 5891.958 1701.193 + 5417.975 6062.470 1654.802 5247.096 5960.510 1701.666 + 5533.308 6126.482 1652.567 5366.514 6037.233 1699.706 + 5634.740 6186.966 1650.001 5488.451 6118.603 1697.627 + 5842.051 6291.619 1607.792 5623.714 6214.842 1694.030 + 5933.542 6350.271 1607.517 5850.589 6342.551 1655.951 + 6099.237 6405.785 1557.002 6007.126 6452.832 1654.657 + 6200.225 6469.453 1558.476 6191.559 6523.264 1609.016 + 6321.957 6552.891 1568.402 6345.629 6627.717 1621.558 + 6456.193 6639.561 1580.024 6502.088 6721.050 1632.657 + 6589.753 6718.545 1587.776 6651.178 6802.830 1641.977 + 6730.792 6805.472 1600.563 6787.525 6871.994 1650.921 + 6861.143 6879.297 1603.538 6908.795 6929.244 1653.781 + 6989.492 6952.379 1608.404 7096.283 7054.493 1726.220 + 7178.146 7079.956 1679.101 7229.003 7126.828 1735.539 + 7315.783 7158.896 1691.350 7364.781 7203.497 1743.479 + 7447.709 7232.610 1696.518 7498.983 7278.975 1747.262 + 7577.684 7304.394 1699.541 7630.017 7351.805 1751.819 + 7712.610 7380.378 1706.054 7764.882 7428.176 1763.154 + 7874.014 7480.642 1741.150 7903.457 7507.961 1775.791 + 8014.388 7561.662 1749.038 8042.899 7588.591 1782.751 + 8148.150 7636.329 1747.028 8180.653 7667.623 1783.341 + 5355.354 5847.248 1659.483 5224.007 5758.221 1704.102 + 5490.015 5921.587 1659.935 5340.899 5829.327 1704.334 + 5603.048 5985.010 1658.987 5458.701 5901.204 1704.246 + 5709.575 6046.948 1655.605 5571.103 5972.045 1704.837 + 5938.156 6170.498 1601.951 5701.815 6057.683 1701.198 + 6025.206 6221.626 1602.051 5939.926 6192.555 1651.060 + 6190.421 6292.260 1551.588 6087.453 6290.718 1648.561 + 6286.804 6347.861 1552.835 6257.349 6401.812 1648.182 + 6403.261 6422.200 1562.905 6421.025 6473.840 1615.245 + 6539.989 6511.870 1581.129 6581.076 6575.333 1634.084 + 6680.087 6597.014 1594.882 6735.897 6665.751 1647.423 + 6815.571 6674.979 1603.652 6871.002 6735.235 1653.513 + 6944.160 6746.210 1606.463 6992.267 6794.345 1656.700 + 7072.953 6818.914 1611.394 7174.413 6913.852 1725.306 + 7203.360 6892.496 1617.428 7306.147 6986.145 1733.545 + 7394.780 7020.580 1689.993 7442.207 7063.829 1742.786 + 7528.188 7095.680 1696.521 7577.906 7141.015 1748.501 + 7659.150 7168.300 1701.001 7709.415 7214.366 1753.752 + 7799.635 7249.380 1714.806 7852.389 7298.268 1774.534 + 7954.122 7343.507 1743.569 7994.293 7381.333 1792.457 + 8095.409 7425.416 1753.284 8125.522 7454.321 1790.652 + 8231.360 7502.146 1753.105 8262.578 7532.750 1790.200 + 5430.411 5706.280 1662.141 5304.780 5621.875 1708.603 + 5563.087 5781.484 1663.217 5431.000 5695.692 1706.936 + 5678.491 5846.629 1662.800 5550.039 5763.759 1707.906 + 5790.840 5909.995 1659.021 5665.637 5829.445 1708.670 + 6026.076 6051.395 1598.657 5795.019 5904.942 1705.401 + 6112.697 6096.426 1599.692 6032.781 6049.307 1648.333 + 6220.364 6156.868 1600.924 6173.685 6135.904 1645.308 + 6369.831 6229.767 1549.291 6338.183 6238.523 1641.984 + 6482.639 6293.998 1557.539 6498.429 6323.653 1609.125 + 6620.164 6379.589 1578.915 6662.213 6428.301 1635.563 + 6761.891 6464.096 1593.977 6816.664 6519.194 1647.234 + 6896.642 6540.849 1602.581 6952.818 6593.546 1653.348 + 7026.550 6613.424 1607.599 7075.550 6657.666 1658.203 + 7157.004 6686.893 1613.977 7200.922 6725.667 1663.946 + 7287.908 6760.314 1620.323 7381.875 6843.294 1728.200 + 7471.672 6880.277 1684.582 7517.771 6921.908 1738.367 + 7608.677 6958.723 1694.810 7656.243 7002.277 1747.562 + 7741.540 7033.039 1701.371 7789.368 7077.377 1754.211 + 7894.876 7126.229 1731.150 7930.972 7160.185 1773.429 + 8038.719 7210.641 1748.774 8070.895 7241.459 1788.933 + 8173.149 7285.976 1750.211 8203.870 7316.014 1789.365 + 8309.173 7362.666 1749.926 8341.292 7394.796 1789.218 + 5503.256 5563.240 1663.466 5389.821 5489.338 1711.737 + 5644.717 5646.791 1661.870 5521.936 5563.452 1707.586 + 5761.617 5713.556 1662.551 5648.046 5631.426 1706.817 + 5875.157 5775.526 1660.183 5766.642 5691.613 1708.211 + 6109.959 5934.575 1596.448 5892.095 5755.029 1706.624 + 6199.644 5976.008 1598.056 6123.147 5909.161 1648.307 + 6306.542 6028.097 1599.055 6259.208 5984.535 1647.747 + 6449.923 6115.146 1546.256 6421.535 6082.639 1641.382 + 6559.052 6168.932 1550.696 6591.172 6186.353 1648.587 + 6690.124 6240.737 1565.131 6731.369 6269.815 1619.408 + 6831.905 6322.021 1582.237 6890.159 6364.837 1638.362 + 6973.499 6403.789 1597.468 7033.790 6448.816 1651.195 + 7108.358 6480.628 1607.275 7159.308 6519.495 1658.893 + 7240.714 6555.096 1615.181 7283.971 6589.596 1664.878 + 7372.502 6628.382 1622.410 7459.320 6701.417 1723.016 + 7548.023 6739.522 1676.954 7592.329 6778.639 1730.912 + 7688.201 6820.840 1690.659 7734.872 6863.521 1745.592 + 7826.195 6899.894 1702.891 7872.807 6943.574 1757.155 + 7970.853 6985.056 1723.235 8009.830 7022.323 1770.403 + 8113.908 7068.724 1739.716 8143.969 7098.064 1777.895 + 8250.009 7145.545 1742.962 8280.576 7176.055 1782.183 + 8386.260 7222.322 1743.116 8418.607 7255.419 1782.668 + 5579.642 5420.934 1661.614 5482.593 5363.454 1711.582 + 5722.087 5508.621 1660.610 5618.057 5436.496 1705.244 + 5842.405 5579.470 1662.300 5741.025 5497.678 1706.016 + 5959.542 5642.657 1660.415 5861.745 5551.963 1707.675 + 6197.444 5827.510 1593.414 5986.392 5604.531 1706.459 + 6290.067 5866.798 1594.482 6207.546 5766.978 1652.701 + 6393.958 5909.339 1595.945 6342.314 5831.934 1655.967 + 6515.226 5964.760 1599.724 6504.705 5927.704 1648.644 + 6634.004 6050.010 1548.559 6672.810 6028.528 1649.317 + 6761.604 6110.546 1558.447 6804.256 6122.471 1610.281 + 6903.817 6185.908 1574.921 6962.557 6213.939 1628.660 + 7046.619 6265.804 1589.894 7112.002 6302.305 1645.909 + 7189.423 6347.130 1605.850 7244.521 6380.757 1659.596 + 7324.377 6423.224 1615.537 7368.361 6453.550 1665.676 + 7457.182 6496.221 1623.454 7540.451 6562.253 1720.736 + 7627.789 6601.794 1672.421 7672.772 6640.363 1728.835 + 7770.759 6685.662 1689.246 7815.382 6726.267 1744.684 + 7911.917 6767.789 1705.001 7949.713 6803.565 1751.288 + 8051.967 6848.696 1719.724 8085.032 6880.859 1760.879 + 8189.950 6927.435 1729.450 8220.749 6958.114 1768.919 + 8326.945 7005.026 1733.712 8358.238 7036.970 1773.908 + 8463.152 7081.603 1734.559 8495.985 7116.038 1774.697 + 5655.981 5275.904 1658.393 5579.572 5240.371 1708.292 + 5797.151 5367.441 1659.438 5713.632 5311.010 1702.493 + 5924.438 5446.681 1660.956 5832.403 5365.802 1705.870 + 6047.470 5515.875 1658.954 5958.494 5419.444 1706.459 + 6277.770 5719.325 1591.686 6090.070 5471.703 1704.805 + 6374.212 5760.254 1593.654 6234.686 5534.126 1704.287 + 6475.347 5792.421 1597.425 6424.962 5677.273 1668.308 + 6594.454 5835.485 1604.233 6588.163 5767.651 1663.518 + 6707.226 5934.364 1551.129 6754.482 5875.444 1650.850 + 6834.620 5985.053 1558.990 6881.702 5981.318 1610.328 + 6976.819 6052.831 1572.022 7037.747 6069.058 1623.420 + 7119.686 6129.294 1584.002 7190.571 6158.452 1641.306 + 7269.830 6212.505 1603.874 7329.346 6241.589 1658.994 + 7407.653 6290.247 1615.133 7453.907 6317.557 1666.412 + 7541.929 6363.750 1623.342 7621.667 6423.044 1718.476 + 7709.483 6465.559 1669.836 7753.305 6502.559 1725.778 + 7850.824 6548.142 1684.190 7892.807 6586.271 1739.041 + 7992.668 6630.996 1700.524 8025.161 6662.050 1742.437 + 8131.773 6711.049 1713.472 8161.428 6740.398 1751.489 + 8267.999 6788.010 1720.389 8298.800 6819.345 1760.212 + 8404.630 6865.143 1724.180 8436.539 6898.488 1765.421 + 8540.028 6940.698 1725.047 8573.372 6976.595 1766.267 + 5723.757 5125.401 1660.122 5663.949 5110.991 1713.082 + 5869.781 5222.484 1658.659 5802.769 5182.449 1703.028 + 6002.728 5309.642 1660.307 5924.500 5238.243 1706.390 + 6132.674 5387.961 1658.002 6055.690 5294.239 1706.098 + 6257.210 5451.530 1657.824 6194.023 5352.635 1704.178 + 6448.704 5643.130 1595.496 6335.162 5403.514 1705.853 + 6553.030 5678.527 1600.369 6495.702 5474.671 1705.594 + 6672.309 5714.988 1606.860 6673.414 5612.672 1674.026 + 6778.389 5823.289 1554.877 6838.616 5721.704 1659.577 + 6906.617 5861.547 1562.240 7013.247 5823.085 1665.856 + 7049.653 5920.480 1572.154 7114.591 5928.002 1621.941 + 7192.176 5992.978 1579.619 7266.981 6016.657 1636.442 + 7348.046 6076.068 1600.423 7412.175 6102.811 1657.014 + 7492.359 6156.752 1616.267 7540.426 6182.188 1668.025 + 7625.295 6230.120 1620.938 7701.455 6282.507 1715.301 + 7760.500 6303.244 1626.709 7834.029 6365.733 1722.864 + 7931.189 6410.918 1678.967 7969.490 6446.023 1731.793 + 8071.074 6491.968 1692.387 8105.491 6525.259 1739.499 + 8209.724 6571.550 1704.175 8240.699 6602.718 1745.560 + 8346.218 6648.716 1710.977 8376.883 6680.563 1751.454 + 8482.049 6724.905 1713.820 8514.074 6759.167 1755.962 + 8616.229 6798.903 1714.236 8649.780 6836.000 1756.752 + 5791.395 4974.739 1663.353 5748.521 4983.444 1719.902 + 5939.498 5073.272 1659.221 5880.003 5049.490 1714.353 + 6077.656 5167.153 1659.858 6018.574 5115.736 1705.998 + 6210.965 5251.712 1658.938 6152.188 5173.932 1705.583 + 6339.642 5322.088 1659.440 6291.231 5231.982 1704.849 + 6471.028 5386.566 1658.543 6434.116 5282.701 1706.121 + 6629.213 5571.296 1602.151 6588.762 5337.111 1705.906 + 6748.436 5604.453 1607.801 6760.819 5417.105 1704.743 + 6885.969 5642.701 1614.320 6919.398 5572.089 1665.522 + 6974.910 5743.900 1563.540 7093.256 5670.031 1668.613 + 7114.899 5787.050 1569.662 7186.798 5789.404 1619.124 + 7261.383 5854.900 1574.745 7338.370 5876.425 1629.795 + 7422.510 5938.133 1594.435 7489.475 5962.238 1652.423 + 7572.713 6020.454 1612.862 7621.541 6043.664 1665.129 + 7708.444 6096.258 1618.415 7746.720 6120.329 1667.581 + 7844.013 6169.505 1622.948 7912.450 6226.081 1718.599 + 7981.623 6245.364 1630.096 8047.708 6307.794 1726.537 + 8152.590 6356.012 1688.445 8182.892 6385.824 1732.915 + 8289.582 6434.026 1697.285 8317.940 6463.016 1737.468 + 8424.048 6509.042 1700.974 8453.393 6540.093 1741.324 + 8559.492 6584.661 1703.581 8590.160 6618.215 1745.366 + 8693.862 6658.582 1705.227 8725.099 6694.049 1746.364 + 5855.778 4829.638 1678.227 5835.999 4856.780 1723.293 + 6009.273 4920.810 1660.081 5970.420 4924.931 1715.664 + 6151.842 5020.201 1657.974 6104.110 4988.798 1712.350 + 6288.630 5112.800 1657.289 6246.592 5056.011 1703.832 + 6420.992 5192.781 1658.152 6385.120 5113.858 1704.250 + 6554.079 5264.549 1658.049 6528.425 5165.844 1705.589 + 6690.259 5326.294 1658.474 6680.736 5216.996 1706.162 + 6823.175 5494.758 1608.627 6845.193 5277.853 1705.276 + 6959.247 5526.723 1614.762 7017.491 5366.760 1700.095 + 7044.435 5644.279 1563.038 7166.230 5511.779 1669.997 + 7176.761 5661.573 1566.659 7355.413 5639.606 1678.431 + 7330.530 5717.333 1571.335 7407.332 5736.693 1622.716 + 7492.590 5799.738 1585.057 7558.282 5819.815 1642.604 + 7647.394 5882.289 1603.634 7694.275 5900.832 1655.953 + 7787.834 5960.074 1611.440 7826.094 5981.461 1663.395 + 7927.193 6036.644 1618.477 7959.335 6060.883 1668.194 + 8065.741 6112.030 1627.286 8121.139 6164.437 1715.600 + 8205.216 6191.180 1639.429 8255.645 6242.107 1719.648 + 8368.871 6296.087 1690.072 8391.033 6319.102 1724.078 + 8501.103 6368.629 1690.025 8527.417 6396.919 1728.712 + 8638.314 6445.983 1695.485 8667.086 6478.120 1737.064 + 8774.382 6521.586 1700.044 8802.609 6554.481 1739.612 + 5929.791 4685.839 1683.931 5921.038 4727.174 1727.039 + 6075.172 4771.695 1672.538 6057.798 4798.677 1717.624 + 6223.745 4867.293 1657.397 6193.042 4866.162 1714.281 + 6363.157 4965.981 1655.975 6331.017 4928.543 1711.527 + 6497.795 5052.747 1658.526 6474.935 4995.403 1704.086 + 6633.238 5132.734 1658.378 6618.116 5050.823 1705.221 + 6770.187 5201.878 1658.679 6767.690 5103.736 1705.422 + 6911.861 5263.580 1657.454 6924.813 5160.972 1704.000 + 7034.601 5407.864 1615.239 7086.155 5232.388 1698.177 + 7183.578 5446.518 1621.808 7250.094 5307.540 1690.760 + 7257.000 5585.956 1567.559 7429.619 5414.062 1686.093 + 7408.781 5588.040 1573.894 7593.751 5618.769 1687.836 + 7574.711 5668.523 1585.533 7631.950 5677.308 1639.452 + 7725.319 5746.878 1597.816 7766.859 5759.704 1648.971 + 7866.407 5824.075 1603.463 7900.742 5840.722 1655.173 + 8008.728 5902.354 1613.000 8038.345 5922.718 1664.609 + 8148.486 5979.271 1622.296 8176.834 6004.251 1674.197 + 8289.781 6058.289 1638.743 8324.224 6093.843 1699.215 + 8442.583 6152.531 1674.252 8462.366 6173.363 1707.921 + 8580.103 6230.442 1682.302 8603.634 6256.112 1720.338 + 8719.144 6309.664 1690.973 8745.035 6339.192 1731.728 + 8855.531 6385.438 1696.012 8880.845 6415.761 1734.882 + 6005.978 4544.521 1688.857 6003.894 4595.012 1731.709 + 6149.006 4626.150 1678.013 6141.870 4670.108 1722.229 + 6291.859 4717.644 1670.744 6279.602 4741.709 1716.680 + 6436.849 4814.386 1654.870 6418.266 4806.475 1713.139 + 6574.821 4910.161 1654.534 6559.296 4869.432 1711.321 + 6711.216 4995.235 1656.386 6704.244 4938.692 1702.502 + 6848.730 5071.032 1657.240 6850.393 4994.008 1704.086 + 6988.384 5142.156 1654.624 7000.945 5054.740 1701.003 + 7130.016 5211.272 1649.201 7152.764 5125.403 1693.624 + 7276.033 5271.411 1645.943 7305.941 5189.314 1687.258 + 7422.520 5328.996 1641.168 7461.667 5245.615 1684.631 + 7504.881 5482.496 1578.545 7627.051 5395.763 1682.792 + 7660.320 5537.265 1588.278 7748.221 5543.431 1687.351 + 7806.619 5613.019 1595.509 7841.522 5622.104 1646.845 + 7948.473 5690.171 1600.827 7977.791 5702.643 1652.881 + 8090.202 5768.103 1608.666 8115.414 5783.906 1659.982 + 8230.456 5845.727 1617.456 8255.054 5865.805 1670.519 + 8375.339 5928.563 1640.170 8395.594 5948.126 1682.938 + 8517.971 6011.073 1660.132 8536.627 6030.575 1696.840 + 8659.404 6092.703 1675.794 8680.132 6115.641 1713.762 + 8799.386 6172.745 1686.424 8822.448 6199.718 1727.142 + 8936.583 6249.226 1692.073 8958.923 6276.869 1730.948 + 6083.704 4404.380 1692.112 6085.105 4457.674 1734.921 + 6225.384 4483.267 1681.848 6224.231 4535.747 1725.728 + 6367.395 4571.220 1674.107 6363.415 4611.267 1719.408 + 6508.945 4665.099 1668.562 6503.000 4680.685 1715.159 + 6651.037 4761.792 1651.216 6643.441 4746.505 1713.550 + 6788.916 4853.055 1651.199 6786.780 4820.954 1698.393 + 6926.976 4934.207 1652.969 6930.191 4886.243 1698.762 + 7065.264 5015.296 1648.128 7075.146 4954.824 1693.461 + 7203.595 5093.599 1641.075 7220.027 5030.707 1684.317 + 7346.198 5158.871 1639.191 7368.490 5097.070 1682.542 + 7490.932 5225.342 1636.926 7519.756 5171.504 1683.414 + 7634.509 5312.935 1633.805 7668.319 5286.692 1682.833 + 7746.958 5405.571 1590.916 7803.062 5396.218 1683.238 + 7890.760 5480.231 1596.973 7938.105 5485.970 1689.433 + 8033.016 5557.398 1603.769 8056.182 5565.171 1655.849 + 8173.680 5635.026 1609.902 8194.159 5646.469 1661.073 + 8314.173 5713.228 1619.052 8334.324 5728.441 1671.810 + 8457.245 5794.426 1638.723 8474.242 5810.022 1682.213 + 8598.937 5875.477 1657.530 8614.466 5891.601 1693.810 + 8739.742 5956.084 1672.292 8758.067 5976.781 1711.485 + 8880.296 6036.589 1684.052 8900.432 6060.940 1725.239 + 9018.203 6113.713 1689.839 9037.624 6138.764 1729.341 + 6162.492 4265.765 1694.403 6164.925 4316.186 1738.386 + 6303.523 4344.591 1685.771 6304.765 4396.576 1730.114 + 6444.906 4430.328 1678.555 6444.712 4474.184 1723.050 + 6586.271 4521.038 1671.427 6584.905 4547.210 1717.660 + 6727.685 4612.953 1649.055 6725.401 4618.390 1718.261 + 6867.193 4708.746 1646.856 6866.860 4685.130 1719.599 + 7005.636 4795.660 1644.269 7008.550 4767.865 1690.724 + 7143.325 4883.109 1636.566 7150.192 4843.724 1683.271 + 7280.291 4968.247 1628.690 7291.715 4921.489 1675.008 + 7421.420 5036.341 1630.649 7437.240 4990.130 1677.293 + 7565.094 5103.625 1632.887 7584.614 5065.590 1681.001 + 7707.664 5182.802 1632.277 7729.651 5160.872 1682.522 + 7848.068 5265.165 1632.675 7868.703 5256.604 1683.408 + 7975.552 5346.605 1601.722 8006.880 5344.407 1687.938 + 8116.641 5423.522 1607.302 8146.514 5429.905 1697.588 + 8257.167 5501.418 1613.938 8273.463 5509.034 1666.661 + 8398.424 5580.408 1626.739 8414.293 5591.404 1678.900 + 8539.518 5660.065 1642.363 8554.984 5673.816 1690.839 + 8679.982 5739.717 1657.554 8694.500 5754.916 1698.707 + 8820.962 5820.339 1672.418 8836.956 5838.996 1713.599 + 8961.692 5900.966 1684.312 8978.967 5922.843 1726.542 + 9099.903 5978.288 1689.881 9116.791 6001.306 1730.560 + / + +ZCORN + 1627.402 1628.720 1628.720 1642.102 1642.102 1657.648 + 1657.648 1667.435 1639.690 1640.968 1640.968 1647.416 + 1647.416 1651.675 1651.675 1649.600 1649.600 1646.130 + 1646.130 1646.796 1646.796 1648.370 1678.349 1686.640 + 1686.640 1685.093 1685.093 1682.068 1682.068 1684.920 + 1684.920 1683.472 1683.472 1687.980 1687.980 1705.801 + 1705.801 1716.544 1716.544 1724.545 1724.545 1730.627 + + 1627.606 1631.082 1631.082 1643.271 1643.271 1655.798 + 1655.798 1664.582 1634.548 1636.446 1636.446 1643.395 + 1643.395 1647.488 1647.488 1648.319 1648.319 1645.455 + 1645.455 1643.390 1643.390 1641.903 1668.179 1674.655 + 1674.655 1675.972 1675.972 1674.871 1674.871 1675.034 + 1675.034 1671.645 1671.645 1674.594 1674.594 1687.714 + 1687.714 1702.612 1702.612 1712.755 1712.755 1719.623 + + 1627.606 1631.082 1631.082 1643.271 1643.271 1655.798 + 1655.798 1664.582 1634.548 1636.446 1636.446 1643.395 + 1643.395 1647.488 1647.488 1648.319 1648.319 1645.455 + 1645.455 1643.390 1643.390 1641.903 1641.903 1641.915 + 1674.655 1675.972 1675.972 1674.871 1674.871 1675.034 + 1675.034 1671.645 1671.645 1674.594 1674.594 1687.714 + 1687.714 1702.612 1702.612 1712.755 1712.755 1719.623 + + 1631.582 1632.241 1632.241 1641.453 1641.453 1654.257 + 1654.257 1661.340 1629.154 1631.626 1631.626 1635.818 + 1635.818 1638.564 1638.564 1640.484 1640.484 1636.360 + 1636.360 1633.213 1633.213 1631.752 1631.752 1631.603 + 1665.072 1667.324 1667.324 1667.223 1667.223 1667.135 + 1667.135 1663.987 1663.987 1665.478 1665.478 1677.380 + 1677.380 1695.269 1695.269 1705.854 1705.854 1712.922 + + 1631.582 1632.241 1632.241 1641.453 1641.453 1654.257 + 1654.257 1661.340 1629.154 1631.626 1631.626 1635.818 + 1635.818 1638.564 1638.564 1640.484 1640.484 1636.360 + 1636.360 1633.213 1633.213 1631.752 1631.752 1631.603 + 1665.072 1667.324 1667.324 1667.223 1667.223 1667.135 + 1667.135 1663.987 1663.987 1665.478 1665.478 1677.380 + 1677.380 1695.269 1695.269 1705.854 1705.854 1712.922 + + 1635.160 1630.220 1630.220 1638.356 1638.356 1650.926 + 1650.926 1657.599 1622.000 1623.881 1623.881 1625.025 + 1625.025 1623.711 1623.711 1624.811 1624.811 1620.008 + 1620.008 1619.680 1619.680 1618.825 1618.825 1619.923 + 1657.441 1659.366 1659.366 1660.623 1660.623 1661.118 + 1661.118 1661.422 1661.422 1661.408 1661.408 1667.526 + 1667.526 1687.697 1687.697 1702.922 1702.922 1709.890 + + 1635.160 1630.220 1630.220 1638.356 1638.356 1650.926 + 1650.926 1657.599 1622.000 1623.881 1623.881 1625.025 + 1625.025 1623.711 1623.711 1624.811 1624.811 1620.008 + 1620.008 1619.680 1619.680 1618.825 1618.825 1619.923 + 1657.441 1659.366 1659.366 1660.623 1660.623 1661.118 + 1661.118 1661.422 1661.422 1661.408 1661.408 1667.526 + 1667.526 1687.697 1687.697 1702.922 1702.922 1709.890 + + 1635.618 1626.782 1626.782 1634.750 1634.750 1646.697 + 1646.697 1653.080 1613.137 1612.813 1612.813 1609.885 + 1609.885 1608.941 1608.941 1610.150 1610.150 1607.018 + 1607.018 1607.047 1607.047 1606.884 1606.884 1609.194 + 1652.638 1655.093 1655.093 1657.268 1657.268 1658.022 + 1658.022 1661.077 1661.077 1658.431 1658.431 1665.120 + 1665.120 1685.100 1685.100 1703.672 1703.672 1709.707 + + 1635.618 1626.782 1626.782 1634.750 1634.750 1646.697 + 1646.697 1653.080 1613.137 1612.813 1612.813 1609.885 + 1609.885 1608.941 1608.941 1610.150 1610.150 1607.018 + 1607.018 1607.047 1607.047 1606.884 1606.884 1609.194 + 1652.638 1655.093 1655.093 1657.268 1657.268 1658.022 + 1658.022 1661.077 1661.077 1658.431 1658.431 1665.120 + 1665.120 1685.100 1685.100 1703.672 1703.672 1709.707 + + 1634.509 1626.690 1626.690 1632.994 1632.994 1642.500 + 1642.500 1649.029 1605.154 1603.485 1603.485 1601.077 + 1601.077 1598.068 1598.068 1599.064 1599.064 1599.185 + 1599.185 1600.317 1600.317 1599.851 1599.851 1601.548 + 1649.956 1652.749 1652.749 1655.569 1655.569 1657.075 + 1657.075 1661.323 1661.323 1660.525 1660.525 1668.167 + 1668.167 1686.328 1686.328 1704.623 1704.623 1710.453 + + 1634.509 1626.690 1626.690 1632.994 1632.994 1642.500 + 1642.500 1649.029 1605.154 1603.485 1603.485 1601.077 + 1601.077 1598.068 1598.068 1599.064 1599.064 1599.185 + 1599.185 1600.317 1600.317 1599.851 1599.851 1601.548 + 1601.548 1606.230 1652.749 1655.569 1655.569 1657.075 + 1657.075 1661.323 1661.323 1660.525 1660.525 1668.167 + 1668.167 1686.328 1686.328 1704.623 1704.623 1710.453 + + 1634.467 1628.724 1628.724 1633.007 1633.007 1639.618 + 1639.618 1645.712 1599.626 1598.677 1598.677 1595.762 + 1595.762 1589.473 1589.473 1593.179 1593.179 1595.245 + 1595.245 1596.587 1596.587 1595.671 1595.671 1596.417 + 1596.417 1600.892 1651.075 1654.947 1654.947 1658.391 + 1658.391 1665.128 1665.128 1666.415 1666.415 1674.561 + 1674.561 1688.360 1688.360 1704.126 1704.126 1711.313 + + 1634.467 1628.724 1628.724 1633.007 1633.007 1639.618 + 1639.618 1645.712 1599.626 1598.677 1598.677 1595.762 + 1595.762 1589.473 1589.473 1593.179 1593.179 1595.245 + 1595.245 1596.587 1596.587 1595.671 1595.671 1596.417 + 1596.417 1600.892 1651.075 1654.947 1654.947 1658.391 + 1658.391 1665.128 1665.128 1666.415 1666.415 1674.561 + 1674.561 1688.360 1688.360 1704.126 1704.126 1711.313 + + 1636.162 1629.577 1629.577 1632.522 1632.522 1637.954 + 1637.954 1643.067 1594.808 1593.957 1593.957 1590.261 + 1590.261 1584.039 1584.039 1587.898 1587.898 1590.979 + 1590.979 1593.030 1593.030 1592.147 1592.147 1593.318 + 1593.318 1597.932 1651.276 1655.086 1655.086 1663.640 + 1663.640 1669.583 1669.583 1672.926 1672.926 1681.124 + 1681.124 1692.596 1692.596 1706.668 1706.668 1714.418 + + 1636.162 1629.577 1629.577 1632.522 1632.522 1637.954 + 1637.954 1643.067 1594.808 1593.957 1593.957 1590.261 + 1590.261 1584.039 1584.039 1587.898 1587.898 1590.979 + 1590.979 1593.030 1593.030 1592.147 1592.147 1593.318 + 1593.318 1597.932 1651.276 1655.086 1655.086 1663.640 + 1663.640 1669.583 1669.583 1672.926 1672.926 1681.124 + 1681.124 1692.596 1692.596 1706.668 1706.668 1714.418 + + 1639.884 1629.955 1629.955 1634.355 1634.355 1637.816 + 1637.816 1640.228 1589.135 1588.252 1588.252 1583.407 + 1583.407 1579.880 1579.880 1582.372 1582.372 1586.775 + 1586.775 1589.718 1589.718 1589.423 1589.423 1592.365 + 1592.365 1597.642 1655.229 1658.861 1658.861 1671.334 + 1671.334 1676.371 1676.371 1681.371 1681.371 1689.622 + 1689.622 1699.844 1699.844 1713.590 1713.590 1718.272 + + 1639.884 1629.955 1629.955 1634.355 1634.355 1637.816 + 1637.816 1640.228 1635.467 1635.860 1588.252 1583.407 + 1583.407 1579.880 1579.880 1582.372 1582.372 1586.775 + 1586.775 1589.718 1589.718 1589.423 1589.423 1592.365 + 1592.365 1597.642 1655.229 1658.861 1658.861 1671.334 + 1671.334 1676.371 1676.371 1681.371 1681.371 1689.622 + 1689.622 1699.844 1699.844 1713.590 1713.590 1718.272 + + 1645.178 1635.954 1635.954 1636.704 1636.704 1638.528 + 1638.528 1640.365 1624.346 1624.420 1576.795 1575.362 + 1575.362 1573.890 1573.890 1576.206 1576.206 1582.562 + 1582.562 1586.494 1586.494 1590.049 1590.049 1595.452 + 1595.452 1600.403 1661.478 1667.173 1667.173 1681.711 + 1681.711 1686.459 1686.459 1689.535 1689.535 1696.370 + 1696.370 1703.837 1703.837 1713.654 1713.654 1721.000 + + 1645.178 1635.954 1635.954 1636.704 1636.704 1638.528 + 1638.528 1640.365 1624.346 1624.420 1576.795 1575.362 + 1575.362 1573.890 1573.890 1576.206 1576.206 1582.562 + 1582.562 1586.494 1586.494 1590.049 1590.049 1595.452 + 1595.452 1600.403 1661.478 1667.173 1667.173 1681.711 + 1681.711 1686.459 1686.459 1689.535 1689.535 1696.370 + 1696.370 1703.837 1703.837 1713.654 1713.654 1721.000 + + 1650.622 1646.601 1646.601 1644.044 1644.044 1643.425 + 1643.425 1643.417 1615.376 1615.175 1566.107 1565.500 + 1565.500 1567.001 1567.001 1572.968 1572.968 1580.368 + 1580.368 1585.823 1585.823 1593.854 1593.854 1598.979 + 1598.979 1603.945 1666.585 1673.790 1673.790 1688.792 + 1688.792 1692.924 1692.924 1694.943 1694.943 1702.032 + 1702.032 1722.262 1722.262 1725.150 1725.150 1730.486 + + 1650.622 1646.601 1646.601 1644.044 1644.044 1643.425 + 1643.425 1643.417 1615.376 1615.175 1615.175 1616.343 + 1565.500 1567.001 1567.001 1572.968 1572.968 1580.368 + 1580.368 1585.823 1585.823 1593.854 1593.854 1598.979 + 1598.979 1603.945 1666.585 1673.790 1673.790 1688.792 + 1688.792 1692.924 1692.924 1694.943 1694.943 1702.032 + 1702.032 1722.262 1722.262 1725.150 1725.150 1730.486 + + 1656.702 1654.802 1654.802 1652.567 1652.567 1650.001 + 1650.001 1647.861 1607.792 1607.517 1607.517 1608.628 + 1557.002 1558.476 1558.476 1568.402 1568.402 1580.024 + 1580.024 1587.776 1587.776 1600.563 1600.563 1603.538 + 1603.538 1608.404 1670.090 1679.101 1679.101 1691.350 + 1691.350 1696.518 1696.518 1699.541 1699.541 1706.054 + 1706.054 1741.150 1741.150 1749.038 1749.038 1747.028 + + 1656.702 1654.802 1654.802 1652.567 1652.567 1650.001 + 1650.001 1647.861 1607.792 1607.517 1607.517 1608.628 + 1557.002 1558.476 1558.476 1568.402 1568.402 1580.024 + 1580.024 1587.776 1587.776 1600.563 1600.563 1603.538 + 1603.538 1608.404 1670.090 1679.101 1679.101 1691.350 + 1691.350 1696.518 1696.518 1699.541 1699.541 1706.054 + 1706.054 1741.150 1741.150 1749.038 1749.038 1747.028 + + 1659.483 1659.935 1659.935 1658.987 1658.987 1655.605 + 1655.605 1652.216 1601.951 1602.051 1602.051 1603.176 + 1551.588 1552.835 1552.835 1562.905 1562.905 1581.129 + 1581.129 1594.882 1594.882 1603.652 1603.652 1606.463 + 1606.463 1611.394 1669.912 1679.904 1679.904 1689.993 + 1689.993 1696.521 1696.521 1701.001 1701.001 1714.806 + 1714.806 1743.569 1743.569 1753.284 1753.284 1753.105 + + 1659.483 1659.935 1659.935 1658.987 1658.987 1655.605 + 1655.605 1652.216 1601.951 1602.051 1602.051 1603.176 + 1603.176 1606.101 1552.835 1562.905 1562.905 1581.129 + 1581.129 1594.882 1594.882 1603.652 1603.652 1606.463 + 1606.463 1611.394 1611.394 1617.428 1679.904 1689.993 + 1689.993 1696.521 1696.521 1701.001 1701.001 1714.806 + 1714.806 1743.569 1743.569 1753.284 1753.284 1753.105 + + 1662.141 1663.217 1663.217 1662.800 1662.800 1659.021 + 1659.021 1655.263 1598.657 1599.692 1599.692 1600.924 + 1600.924 1602.261 1549.291 1557.539 1557.539 1578.915 + 1578.915 1593.977 1593.977 1602.581 1602.581 1607.599 + 1607.599 1613.977 1613.977 1620.323 1674.412 1684.582 + 1684.582 1694.810 1694.810 1701.371 1701.371 1731.150 + 1731.150 1748.774 1748.774 1750.211 1750.211 1749.926 + + 1662.141 1663.217 1663.217 1662.800 1662.800 1659.021 + 1659.021 1655.263 1598.657 1599.692 1599.692 1600.924 + 1600.924 1602.261 1549.291 1557.539 1557.539 1578.915 + 1578.915 1593.977 1593.977 1602.581 1602.581 1607.599 + 1607.599 1613.977 1613.977 1620.323 1674.412 1684.582 + 1684.582 1694.810 1694.810 1701.371 1701.371 1731.150 + 1731.150 1748.774 1748.774 1750.211 1750.211 1749.926 + + 1663.466 1661.870 1661.870 1662.551 1662.551 1660.183 + 1660.183 1656.999 1596.448 1598.056 1598.056 1599.055 + 1599.055 1599.804 1546.256 1550.696 1550.696 1565.131 + 1565.131 1582.237 1582.237 1597.468 1597.468 1607.275 + 1607.275 1615.181 1615.181 1622.410 1668.172 1676.954 + 1676.954 1690.659 1690.659 1702.891 1702.891 1723.235 + 1723.235 1739.716 1739.716 1742.962 1742.962 1743.116 + + 1663.466 1661.870 1661.870 1662.551 1662.551 1660.183 + 1660.183 1656.999 1596.448 1598.056 1598.056 1599.055 + 1599.055 1599.804 1599.804 1606.337 1550.696 1565.131 + 1565.131 1582.237 1582.237 1597.468 1597.468 1607.275 + 1607.275 1615.181 1615.181 1622.410 1668.172 1676.954 + 1676.954 1690.659 1690.659 1702.891 1702.891 1723.235 + 1723.235 1739.716 1739.716 1742.962 1742.962 1743.116 + + 1661.614 1660.610 1660.610 1662.300 1662.300 1660.415 + 1660.415 1657.677 1593.414 1594.482 1594.482 1595.945 + 1595.945 1599.724 1599.724 1607.971 1548.559 1558.447 + 1558.447 1574.921 1574.921 1589.894 1589.894 1605.850 + 1605.850 1615.537 1615.537 1623.454 1663.787 1672.421 + 1672.421 1689.246 1689.246 1705.001 1705.001 1719.724 + 1719.724 1729.450 1729.450 1733.712 1733.712 1734.559 + + 1661.614 1660.610 1660.610 1662.300 1662.300 1660.415 + 1660.415 1657.677 1593.414 1594.482 1594.482 1595.945 + 1595.945 1599.724 1599.724 1607.971 1548.559 1558.447 + 1558.447 1574.921 1574.921 1589.894 1589.894 1605.850 + 1605.850 1615.537 1615.537 1623.454 1663.787 1672.421 + 1672.421 1689.246 1689.246 1705.001 1705.001 1719.724 + 1719.724 1729.450 1729.450 1733.712 1733.712 1734.559 + + 1658.393 1659.438 1659.438 1660.956 1660.956 1658.954 + 1658.954 1657.254 1591.686 1593.654 1593.654 1597.425 + 1597.425 1604.233 1604.233 1612.176 1551.129 1558.990 + 1558.990 1572.022 1572.022 1584.002 1584.002 1603.874 + 1603.874 1615.133 1615.133 1623.342 1661.690 1669.836 + 1669.836 1684.190 1684.190 1700.524 1700.524 1713.472 + 1713.472 1720.389 1720.389 1724.180 1724.180 1725.047 + + 1658.393 1659.438 1659.438 1660.956 1660.956 1658.954 + 1658.954 1657.254 1657.254 1656.087 1593.654 1597.425 + 1597.425 1604.233 1604.233 1612.176 1551.129 1558.990 + 1558.990 1572.022 1572.022 1584.002 1584.002 1603.874 + 1603.874 1615.133 1615.133 1623.342 1661.690 1669.836 + 1669.836 1684.190 1684.190 1700.524 1700.524 1713.472 + 1713.472 1720.389 1720.389 1724.180 1724.180 1725.047 + + 1660.122 1658.659 1658.659 1660.307 1660.307 1658.002 + 1658.002 1657.824 1657.824 1657.427 1595.496 1600.369 + 1600.369 1606.860 1606.860 1613.958 1554.877 1562.240 + 1562.240 1572.154 1572.154 1579.619 1579.619 1600.423 + 1600.423 1616.267 1616.267 1620.938 1660.919 1668.494 + 1668.494 1678.967 1678.967 1692.387 1692.387 1704.175 + 1704.175 1710.977 1710.977 1713.820 1713.820 1714.236 + + 1660.122 1658.659 1658.659 1660.307 1660.307 1658.002 + 1658.002 1657.824 1657.824 1657.427 1657.427 1656.321 + 1600.369 1606.860 1606.860 1613.958 1613.958 1622.201 + 1562.240 1572.154 1572.154 1579.619 1579.619 1600.423 + 1600.423 1616.267 1616.267 1620.938 1620.938 1626.709 + 1668.494 1678.967 1678.967 1692.387 1692.387 1704.175 + 1704.175 1710.977 1710.977 1713.820 1713.820 1714.236 + + 1663.353 1659.221 1659.221 1659.858 1659.858 1658.938 + 1658.938 1659.440 1659.440 1658.543 1658.543 1657.625 + 1602.151 1607.801 1607.801 1614.320 1614.320 1622.246 + 1563.540 1569.662 1569.662 1574.745 1574.745 1594.435 + 1594.435 1612.862 1612.862 1618.415 1618.415 1622.948 + 1668.440 1677.586 1677.586 1688.445 1688.445 1697.285 + 1697.285 1700.974 1700.974 1703.581 1703.581 1705.227 + + 1673.549 1666.331 1659.221 1659.858 1659.858 1658.938 + 1658.938 1659.440 1659.440 1658.543 1658.543 1657.625 + 1657.625 1656.224 1607.801 1614.320 1614.320 1622.246 + 1563.540 1569.662 1569.662 1574.745 1574.745 1594.435 + 1594.435 1612.862 1612.862 1618.415 1618.415 1622.948 + 1622.948 1630.096 1677.586 1688.445 1688.445 1697.285 + 1697.285 1700.974 1700.974 1703.581 1703.581 1705.227 + + 1678.227 1668.508 1660.081 1657.974 1657.974 1657.289 + 1657.289 1658.152 1658.152 1658.049 1658.049 1658.474 + 1658.474 1657.423 1608.627 1614.762 1614.762 1621.962 + 1563.038 1566.659 1566.659 1571.335 1571.335 1585.057 + 1585.057 1603.634 1603.634 1611.440 1611.440 1618.477 + 1618.477 1627.286 1676.182 1686.606 1686.606 1690.072 + 1690.072 1690.025 1690.025 1695.485 1695.485 1700.044 + + 1678.227 1668.508 1668.508 1663.913 1657.974 1657.289 + 1657.289 1658.152 1658.152 1658.049 1658.049 1658.474 + 1658.474 1657.423 1657.423 1654.449 1614.762 1621.962 + 1621.962 1630.852 1566.659 1571.335 1571.335 1585.057 + 1585.057 1603.634 1603.634 1611.440 1611.440 1618.477 + 1618.477 1627.286 1627.286 1639.429 1686.606 1690.072 + 1690.072 1690.025 1690.025 1695.485 1695.485 1700.044 + + 1683.931 1672.538 1672.538 1667.059 1657.397 1655.975 + 1655.975 1658.526 1658.526 1658.378 1658.378 1658.679 + 1658.679 1657.454 1657.454 1653.334 1615.239 1621.808 + 1621.808 1629.169 1567.559 1573.894 1573.894 1585.533 + 1585.533 1597.816 1597.816 1603.463 1603.463 1613.000 + 1613.000 1622.296 1622.296 1638.743 1667.625 1674.252 + 1674.252 1682.302 1682.302 1690.973 1690.973 1696.012 + + 1683.931 1672.538 1672.538 1667.059 1667.059 1662.315 + 1655.975 1658.526 1658.526 1658.378 1658.378 1658.679 + 1658.679 1657.454 1657.454 1653.334 1653.334 1648.950 + 1648.950 1644.272 1644.272 1642.209 1573.894 1585.533 + 1585.533 1597.816 1597.816 1603.463 1603.463 1613.000 + 1613.000 1622.296 1622.296 1638.743 1667.625 1674.252 + 1674.252 1682.302 1682.302 1690.973 1690.973 1696.012 + + 1688.857 1678.013 1678.013 1670.744 1670.744 1665.243 + 1654.870 1654.534 1654.534 1656.386 1656.386 1657.240 + 1657.240 1654.624 1654.624 1649.201 1649.201 1645.943 + 1645.943 1641.168 1641.168 1636.357 1578.545 1588.278 + 1588.278 1595.509 1595.509 1600.827 1600.827 1608.666 + 1608.666 1617.456 1617.456 1640.170 1640.170 1660.132 + 1660.132 1675.794 1675.794 1686.424 1686.424 1692.073 + + 1688.857 1678.013 1678.013 1670.744 1670.744 1665.243 + 1665.243 1661.977 1654.534 1656.386 1656.386 1657.240 + 1657.240 1654.624 1654.624 1649.201 1649.201 1645.943 + 1645.943 1641.168 1641.168 1636.357 1636.357 1639.109 + 1588.278 1595.509 1595.509 1600.827 1600.827 1608.666 + 1608.666 1617.456 1617.456 1640.170 1640.170 1660.132 + 1660.132 1675.794 1675.794 1686.424 1686.424 1692.073 + + 1692.112 1681.848 1681.848 1674.107 1674.107 1668.562 + 1668.562 1665.785 1651.216 1651.199 1651.199 1652.969 + 1652.969 1648.128 1648.128 1641.075 1641.075 1639.191 + 1639.191 1636.926 1636.926 1633.805 1633.805 1633.479 + 1590.916 1596.973 1596.973 1603.769 1603.769 1609.902 + 1609.902 1619.052 1619.052 1638.723 1638.723 1657.530 + 1657.530 1672.292 1672.292 1684.052 1684.052 1689.839 + + 1692.112 1681.848 1681.848 1674.107 1674.107 1668.562 + 1668.562 1665.785 1651.216 1651.199 1651.199 1652.969 + 1652.969 1648.128 1648.128 1641.075 1641.075 1639.191 + 1639.191 1636.926 1636.926 1633.805 1633.805 1633.479 + 1633.479 1638.827 1596.973 1603.769 1603.769 1609.902 + 1609.902 1619.052 1619.052 1638.723 1638.723 1657.530 + 1657.530 1672.292 1672.292 1684.052 1684.052 1689.839 + + 1694.403 1685.771 1685.771 1678.555 1678.555 1671.427 + 1671.427 1671.094 1649.055 1646.856 1646.856 1644.269 + 1644.269 1636.566 1636.566 1628.690 1628.690 1630.649 + 1630.649 1632.887 1632.887 1632.277 1632.277 1632.675 + 1632.675 1636.282 1601.722 1607.302 1607.302 1613.938 + 1613.938 1626.739 1626.739 1642.363 1642.363 1657.554 + 1657.554 1672.418 1672.418 1684.312 1684.312 1689.881 + + 1631.792 1633.411 1633.411 1646.991 1646.991 1662.307 + 1662.307 1672.063 1643.978 1645.460 1645.460 1652.022 + 1652.022 1656.215 1656.215 1654.017 1654.017 1650.634 + 1650.634 1651.424 1651.424 1653.091 1682.105 1690.510 + 1690.510 1689.460 1689.460 1687.128 1687.128 1689.786 + 1689.786 1688.189 1688.189 1693.253 1693.253 1710.451 + 1710.451 1720.884 1720.884 1728.958 1728.958 1734.729 + + 1632.178 1635.977 1635.977 1648.054 1648.054 1660.457 + 1660.457 1669.225 1638.965 1640.995 1640.995 1648.008 + 1648.008 1652.044 1652.044 1652.803 1652.803 1649.939 + 1649.939 1647.920 1647.920 1646.508 1672.340 1679.184 + 1679.184 1680.633 1680.633 1679.643 1679.643 1679.690 + 1679.690 1676.263 1676.263 1679.758 1679.758 1692.808 + 1692.808 1707.245 1707.245 1717.248 1717.248 1723.722 + 1632.178 1635.977 1635.977 1648.054 1648.054 1660.457 + 1660.457 1669.225 1638.965 1640.995 1640.995 1648.008 + 1648.008 1652.044 1652.044 1652.803 1652.803 1649.939 + 1649.939 1647.920 1647.920 1646.508 1646.508 1646.703 + 1679.184 1680.633 1680.633 1679.643 1679.643 1679.690 + 1679.690 1676.263 1676.263 1679.758 1679.758 1692.808 + 1692.808 1707.245 1707.245 1717.248 1717.248 1723.722 + + 1636.002 1636.780 1636.780 1646.178 1646.178 1658.847 + 1658.847 1666.098 1633.556 1636.172 1636.172 1640.392 + 1640.392 1643.139 1643.139 1645.081 1645.081 1640.830 + 1640.830 1637.857 1637.857 1636.411 1636.411 1636.366 + 1669.682 1671.894 1671.894 1672.031 1672.031 1671.749 + 1671.749 1668.702 1668.702 1670.575 1670.575 1682.734 + 1682.734 1699.997 1699.997 1710.330 1710.330 1716.951 + 1636.002 1636.780 1636.780 1646.178 1646.178 1658.847 + 1658.847 1666.098 1633.556 1636.172 1636.172 1640.392 + 1640.392 1643.139 1643.139 1645.081 1645.081 1640.830 + 1640.830 1637.857 1637.857 1636.411 1636.411 1636.366 + 1669.682 1671.894 1671.894 1672.031 1672.031 1671.749 + 1671.749 1668.702 1668.702 1670.575 1670.575 1682.734 + 1682.734 1699.997 1699.997 1710.330 1710.330 1716.951 + + 1639.420 1634.446 1634.446 1642.995 1642.995 1655.438 + 1655.438 1662.379 1626.351 1628.450 1628.450 1629.562 + 1629.562 1628.434 1628.434 1629.474 1629.474 1624.643 + 1624.643 1624.521 1624.521 1623.318 1623.318 1624.537 + 1662.138 1664.177 1664.177 1665.392 1665.392 1665.859 + 1665.859 1666.172 1666.172 1666.393 1666.393 1672.741 + 1672.741 1692.721 1692.721 1707.250 1707.250 1713.746 + 1639.420 1634.446 1634.446 1642.995 1642.995 1655.438 + 1655.438 1662.379 1626.351 1628.450 1628.450 1629.562 + 1629.562 1628.434 1628.434 1629.474 1629.474 1624.643 + 1624.643 1624.521 1624.521 1623.318 1623.318 1624.537 + 1662.138 1664.177 1664.177 1665.392 1665.392 1665.859 + 1665.859 1666.172 1666.172 1666.393 1666.393 1672.741 + 1672.741 1692.721 1692.721 1707.250 1707.250 1713.746 + + 1639.547 1631.003 1631.003 1639.274 1639.274 1651.146 + 1651.146 1657.842 1617.496 1617.396 1617.396 1614.410 + 1614.410 1613.914 1613.914 1614.970 1614.970 1611.901 + 1611.901 1612.026 1612.026 1611.486 1611.486 1613.868 + 1657.355 1659.835 1659.835 1662.048 1662.048 1662.912 + 1662.912 1665.929 1665.929 1663.378 1663.378 1670.502 + 1670.502 1690.039 1690.039 1707.691 1707.691 1713.368 + 1639.547 1631.003 1631.003 1639.274 1639.274 1651.146 + 1651.146 1657.842 1617.496 1617.396 1617.396 1614.410 + 1614.410 1613.914 1613.914 1614.970 1614.970 1611.901 + 1611.901 1612.026 1612.026 1611.486 1611.486 1613.868 + 1657.355 1659.835 1659.835 1662.048 1662.048 1662.912 + 1662.912 1665.929 1665.929 1663.378 1663.378 1670.502 + 1670.502 1690.039 1690.039 1707.691 1707.691 1713.368 + + 1638.541 1631.000 1631.000 1637.384 1637.384 1646.932 + 1646.932 1653.774 1609.588 1608.043 1608.043 1605.612 + 1605.612 1603.058 1603.058 1604.047 1604.047 1604.347 + 1604.347 1605.388 1605.388 1604.781 1604.781 1606.539 + 1654.758 1657.558 1657.558 1660.373 1660.373 1661.974 + 1661.974 1666.151 1666.151 1665.340 1665.340 1673.625 + 1673.625 1691.296 1691.296 1708.611 1708.611 1714.084 + 1638.541 1631.000 1631.000 1637.384 1637.384 1646.932 + 1646.932 1653.774 1609.588 1608.043 1608.043 1605.612 + 1605.612 1603.058 1603.058 1604.047 1604.047 1604.347 + 1604.347 1605.388 1605.388 1604.781 1604.781 1606.539 + 1606.539 1611.231 1657.558 1660.373 1660.373 1661.974 + 1661.974 1666.151 1666.151 1665.340 1665.340 1673.625 + 1673.625 1691.296 1691.296 1708.611 1708.611 1714.084 + + 1638.752 1633.038 1633.038 1637.250 1637.250 1643.925 + 1643.925 1650.343 1604.119 1603.321 1603.321 1600.217 + 1600.217 1594.540 1594.540 1598.428 1598.428 1600.597 + 1600.597 1601.847 1601.847 1600.711 1600.711 1601.554 + 1601.554 1605.995 1656.138 1659.885 1659.885 1663.376 + 1663.376 1670.106 1670.106 1671.318 1671.318 1679.903 + 1679.903 1693.400 1693.400 1708.409 1708.409 1715.049 + 1638.752 1633.038 1633.038 1637.250 1637.250 1643.925 + 1643.925 1650.343 1604.119 1603.321 1603.321 1600.217 + 1600.217 1594.540 1594.540 1598.428 1598.428 1600.597 + 1600.597 1601.847 1601.847 1600.711 1600.711 1601.554 + 1601.554 1605.995 1656.138 1659.885 1659.885 1663.376 + 1663.376 1670.106 1670.106 1671.318 1671.318 1679.903 + 1679.903 1693.400 1693.400 1708.409 1708.409 1715.049 + + 1640.701 1634.037 1634.037 1636.540 1636.540 1641.992 + 1641.992 1647.485 1599.258 1598.655 1598.655 1594.700 + 1594.700 1589.176 1589.176 1593.259 1593.259 1596.413 + 1596.413 1598.288 1598.288 1597.176 1597.176 1598.431 + 1598.431 1603.079 1656.531 1660.220 1660.220 1668.593 + 1668.593 1674.501 1674.501 1677.875 1677.875 1686.389 + 1686.389 1697.666 1697.666 1711.117 1711.117 1718.191 + 1640.701 1634.037 1634.037 1636.540 1636.540 1641.992 + 1641.992 1647.485 1599.258 1598.655 1598.655 1594.700 + 1594.700 1589.176 1589.176 1593.259 1593.259 1596.413 + 1596.413 1598.288 1598.288 1597.176 1597.176 1598.431 + 1598.431 1603.079 1656.531 1660.220 1660.220 1668.593 + 1668.593 1674.501 1674.501 1677.875 1677.875 1686.389 + 1686.389 1697.666 1697.666 1711.117 1711.117 1718.191 + + 1644.538 1635.051 1635.051 1638.128 1638.128 1641.813 + 1641.813 1644.627 1593.190 1592.510 1592.510 1588.064 + 1588.064 1584.917 1584.917 1587.723 1587.723 1592.212 + 1592.212 1594.843 1594.843 1594.449 1594.449 1597.473 + 1597.473 1602.834 1660.356 1663.929 1663.929 1676.371 + 1676.371 1681.179 1681.179 1686.303 1686.303 1694.856 + 1694.856 1704.789 1704.789 1717.760 1717.760 1722.171 + 1644.538 1635.051 1635.051 1638.128 1638.128 1641.813 + 1641.813 1644.627 1640.244 1641.816 1592.510 1588.064 + 1588.064 1584.917 1584.917 1587.723 1587.723 1592.212 + 1592.212 1594.843 1594.843 1594.449 1594.449 1597.473 + 1597.473 1602.834 1660.356 1663.929 1663.929 1676.371 + 1676.371 1681.179 1681.179 1686.303 1686.303 1694.856 + 1694.856 1704.789 1704.789 1717.760 1717.760 1722.171 + + 1649.883 1641.330 1641.330 1640.927 1640.927 1642.690 + 1642.690 1644.757 1629.500 1630.284 1581.332 1580.104 + 1580.104 1579.008 1579.008 1581.549 1581.549 1588.002 + 1588.002 1591.628 1591.628 1595.195 1595.195 1600.532 + 1600.532 1605.561 1666.621 1672.244 1672.244 1686.681 + 1686.681 1691.281 1691.281 1694.388 1694.388 1701.551 + 1701.551 1708.988 1708.988 1718.573 1718.573 1725.288 + 1649.883 1641.330 1641.330 1640.927 1640.927 1642.690 + 1642.690 1644.757 1629.500 1630.284 1581.332 1580.104 + 1580.104 1579.008 1579.008 1581.549 1581.549 1588.002 + 1588.002 1591.628 1591.628 1595.195 1595.195 1600.532 + 1600.532 1605.561 1666.621 1672.244 1672.244 1686.681 + 1686.681 1691.281 1691.281 1694.388 1694.388 1701.551 + 1701.551 1708.988 1708.988 1718.573 1718.573 1725.288 + + 1655.280 1651.486 1651.486 1648.780 1648.780 1647.854 + 1647.854 1647.887 1620.299 1620.371 1570.809 1570.370 + 1570.370 1572.156 1572.156 1578.068 1578.068 1585.775 + 1585.775 1590.895 1590.895 1599.093 1599.093 1603.882 + 1603.882 1608.983 1672.195 1679.599 1679.599 1693.722 + 1693.722 1697.787 1697.787 1699.894 1699.894 1707.308 + 1707.308 1726.322 1726.322 1729.713 1729.713 1734.685 + 1655.280 1651.486 1651.486 1648.780 1648.780 1647.854 + 1647.854 1647.887 1620.299 1620.371 1620.371 1621.966 + 1570.370 1572.156 1572.156 1578.068 1578.068 1585.775 + 1585.775 1590.895 1590.895 1599.093 1599.093 1603.882 + 1603.882 1608.983 1672.195 1679.599 1679.599 1693.722 + 1693.722 1697.787 1697.787 1699.894 1699.894 1707.308 + 1707.308 1726.322 1726.322 1729.713 1729.713 1734.685 + + 1661.333 1659.357 1659.357 1657.374 1657.374 1654.784 + 1654.784 1652.592 1612.162 1611.917 1611.917 1613.227 + 1561.767 1563.440 1563.440 1573.697 1573.697 1585.285 + 1585.285 1593.099 1593.099 1605.709 1605.709 1608.341 + 1608.341 1613.322 1675.724 1684.820 1684.820 1696.459 + 1696.459 1701.446 1701.446 1704.567 1704.567 1711.552 + 1711.552 1745.083 1745.083 1752.371 1752.371 1750.685 + 1661.333 1659.357 1659.357 1657.374 1657.374 1654.784 + 1654.784 1652.592 1612.162 1611.917 1611.917 1613.227 + 1561.767 1563.440 1563.440 1573.697 1573.697 1585.285 + 1585.285 1593.099 1593.099 1605.709 1605.709 1608.341 + 1608.341 1613.322 1675.724 1684.820 1684.820 1696.459 + 1696.459 1701.446 1701.446 1704.567 1704.567 1711.552 + 1711.552 1745.083 1745.083 1752.371 1752.371 1750.685 + + 1664.068 1664.131 1664.131 1663.742 1663.742 1660.615 + 1660.615 1657.224 1605.847 1605.943 1605.943 1607.218 + 1556.305 1557.625 1557.625 1568.095 1568.095 1586.394 + 1586.394 1600.026 1600.026 1608.595 1608.595 1611.371 + 1611.371 1616.384 1675.406 1685.111 1685.111 1695.071 + 1695.071 1701.553 1701.553 1706.049 1706.049 1720.305 + 1720.305 1748.561 1748.561 1757.134 1757.134 1756.906 + 1664.068 1664.131 1664.131 1663.742 1663.742 1660.615 + 1660.615 1657.224 1605.847 1605.943 1605.943 1607.218 + 1607.218 1610.548 1557.625 1568.095 1568.095 1586.394 + 1586.394 1600.026 1600.026 1608.595 1608.595 1611.371 + 1611.371 1616.384 1616.384 1622.298 1685.111 1695.071 + 1695.071 1701.553 1701.553 1706.049 1706.049 1720.305 + 1720.305 1748.561 1748.561 1757.134 1757.134 1756.906 + + 1666.840 1667.382 1667.382 1667.510 1667.510 1664.101 + 1664.101 1660.389 1602.470 1603.655 1603.655 1605.153 + 1605.153 1606.671 1554.033 1562.618 1562.618 1584.593 + 1584.593 1599.224 1599.224 1607.562 1607.562 1612.523 + 1612.523 1618.866 1618.866 1625.199 1679.706 1689.794 + 1689.794 1699.948 1699.948 1706.367 1706.367 1735.562 + 1735.562 1752.914 1752.914 1754.262 1754.262 1753.987 + 1666.840 1667.382 1667.382 1667.510 1667.510 1664.101 + 1664.101 1660.389 1602.470 1603.655 1603.655 1605.153 + 1605.153 1606.671 1554.033 1562.618 1562.618 1584.593 + 1584.593 1599.224 1599.224 1607.562 1607.562 1612.523 + 1612.523 1618.866 1618.866 1625.199 1679.706 1689.794 + 1689.794 1699.948 1699.948 1706.367 1706.367 1735.562 + 1735.562 1752.914 1752.914 1754.262 1754.262 1753.987 + + 1668.275 1666.183 1666.183 1667.035 1667.035 1665.074 + 1665.074 1662.072 1600.566 1602.506 1602.506 1603.974 + 1603.974 1604.441 1551.015 1555.594 1555.594 1570.474 + 1570.474 1587.726 1587.726 1602.727 1602.727 1612.308 + 1612.308 1620.148 1620.148 1627.357 1673.303 1682.160 + 1682.160 1695.962 1695.962 1708.115 1708.115 1728.158 + 1728.158 1743.687 1743.687 1746.998 1746.998 1747.198 + 1668.275 1666.183 1666.183 1667.035 1667.035 1665.074 + 1665.074 1662.072 1600.566 1602.506 1602.506 1603.974 + 1603.974 1604.441 1604.441 1610.992 1555.594 1570.474 + 1570.474 1587.726 1587.726 1602.727 1602.727 1612.308 + 1612.308 1620.148 1620.148 1627.357 1673.303 1682.160 + 1682.160 1695.962 1695.962 1708.115 1708.115 1728.158 + 1728.158 1743.687 1743.687 1746.998 1746.998 1747.198 + + 1666.565 1664.826 1664.826 1666.727 1666.727 1665.205 + 1665.205 1662.644 1598.057 1599.605 1599.605 1601.629 + 1601.629 1604.642 1604.642 1612.221 1553.395 1563.528 + 1563.528 1580.184 1580.184 1595.331 1595.331 1611.062 + 1611.062 1620.545 1620.545 1628.367 1668.924 1677.713 + 1677.713 1694.605 1694.605 1709.692 1709.692 1723.855 + 1723.855 1733.459 1733.459 1737.789 1737.789 1738.650 + 1666.565 1664.826 1664.826 1666.727 1666.727 1665.205 + 1665.205 1662.644 1598.057 1599.605 1599.605 1601.629 + 1601.629 1604.642 1604.642 1612.221 1553.395 1563.528 + 1563.528 1580.184 1580.184 1595.331 1595.331 1611.062 + 1611.062 1620.545 1620.545 1628.367 1668.924 1677.713 + 1677.713 1694.605 1694.605 1709.692 1709.692 1723.855 + 1723.855 1733.459 1733.459 1737.789 1737.789 1738.650 + + 1663.275 1663.534 1663.534 1665.530 1665.530 1663.692 + 1663.692 1662.014 1596.930 1599.494 1599.494 1604.147 + 1604.147 1610.521 1610.521 1616.006 1556.052 1564.015 + 1564.015 1577.087 1577.087 1589.545 1589.545 1609.258 + 1609.258 1620.128 1620.128 1627.999 1666.797 1675.024 + 1675.024 1689.571 1689.571 1704.908 1704.908 1717.245 + 1717.245 1724.326 1724.326 1728.288 1728.288 1729.201 + 1663.275 1663.534 1663.534 1665.530 1665.530 1663.692 + 1663.692 1662.014 1662.014 1661.023 1599.494 1604.147 + 1604.147 1610.521 1610.521 1616.006 1556.052 1564.015 + 1564.015 1577.087 1577.087 1589.545 1589.545 1609.258 + 1609.258 1620.128 1620.128 1627.999 1666.797 1675.024 + 1675.024 1689.571 1689.571 1704.908 1704.908 1717.245 + 1717.245 1724.326 1724.326 1728.288 1728.288 1729.201 + + 1664.874 1662.877 1662.877 1664.943 1664.943 1662.717 + 1662.717 1662.433 1662.433 1662.277 1601.647 1606.974 + 1606.974 1612.442 1612.442 1618.025 1559.943 1567.335 + 1567.335 1577.058 1577.058 1585.066 1585.066 1605.934 + 1605.934 1621.357 1621.357 1625.772 1665.839 1673.519 + 1673.519 1684.075 1684.075 1697.117 1697.117 1708.276 + 1708.276 1714.922 1714.922 1717.997 1717.997 1718.544 + 1664.874 1662.877 1662.877 1664.943 1664.943 1662.717 + 1662.717 1662.433 1662.433 1662.277 1662.277 1661.251 + 1606.974 1612.442 1612.442 1618.025 1618.025 1626.725 + 1567.335 1577.058 1577.058 1585.066 1585.066 1605.934 + 1605.934 1621.357 1621.357 1625.772 1625.772 1631.605 + 1673.519 1684.075 1684.075 1697.117 1697.117 1708.276 + 1708.276 1714.922 1714.922 1717.997 1717.997 1718.544 + + 1667.958 1663.762 1663.762 1664.385 1664.385 1663.532 + 1663.532 1663.935 1663.935 1663.213 1663.213 1662.367 + 1608.041 1613.062 1613.062 1619.162 1619.162 1626.934 + 1568.544 1574.514 1574.514 1580.023 1580.023 1600.068 + 1600.068 1617.939 1617.939 1623.319 1623.319 1627.723 + 1672.808 1681.986 1681.986 1692.677 1692.677 1700.980 + 1700.980 1704.762 1704.762 1707.721 1707.721 1709.419 + 1678.133 1671.141 1663.762 1664.385 1664.385 1663.532 + 1663.532 1663.935 1663.935 1663.213 1663.213 1662.367 + 1662.367 1660.867 1613.062 1619.162 1619.162 1626.934 + 1568.544 1574.514 1574.514 1580.023 1580.023 1600.068 + 1600.068 1617.939 1617.939 1623.319 1623.319 1627.723 + 1627.723 1634.891 1681.986 1692.677 1692.677 1700.980 + 1700.980 1704.762 1704.762 1707.721 1707.721 1709.419 + + 1682.666 1673.172 1664.650 1662.571 1662.571 1661.848 + 1661.848 1662.681 1662.681 1662.659 1662.659 1663.125 + 1663.125 1661.961 1613.869 1619.701 1619.701 1626.745 + 1567.997 1571.544 1571.544 1576.188 1576.188 1590.618 + 1590.618 1608.713 1608.713 1616.450 1616.450 1623.201 + 1623.201 1632.000 1679.149 1689.043 1689.043 1692.828 + 1692.828 1693.526 1693.526 1699.407 1699.407 1703.818 + 1682.666 1673.172 1673.172 1668.783 1662.571 1661.848 + 1661.848 1662.681 1662.681 1662.659 1662.659 1663.125 + 1663.125 1661.961 1661.961 1658.578 1619.701 1626.745 + 1626.745 1635.627 1571.544 1576.188 1576.188 1590.618 + 1590.618 1608.713 1608.713 1616.450 1616.450 1623.201 + 1623.201 1632.000 1632.000 1644.142 1689.043 1692.828 + 1692.828 1693.526 1693.526 1699.407 1699.407 1703.818 + + 1688.180 1676.967 1676.967 1671.697 1662.003 1660.583 + 1660.583 1663.000 1663.000 1662.995 1662.995 1663.234 + 1663.234 1661.864 1661.864 1657.431 1620.209 1626.614 + 1626.614 1633.893 1572.524 1578.980 1578.980 1590.756 + 1590.756 1602.774 1602.774 1608.445 1608.445 1618.025 + 1618.025 1627.217 1627.217 1643.481 1670.549 1677.425 + 1677.425 1685.899 1685.899 1694.850 1694.850 1699.732 + 1688.180 1676.967 1676.967 1671.697 1671.697 1667.304 + 1660.583 1663.000 1663.000 1662.995 1662.995 1663.234 + 1663.234 1661.864 1661.864 1657.431 1657.431 1652.558 + 1652.558 1647.847 1647.847 1646.328 1578.980 1590.756 + 1590.756 1602.774 1602.774 1608.445 1608.445 1618.025 + 1618.025 1627.217 1627.217 1643.481 1670.549 1677.425 + 1677.425 1685.899 1685.899 1694.850 1694.850 1699.732 + + 1693.091 1682.356 1682.356 1675.244 1675.244 1670.007 + 1659.233 1658.841 1658.841 1660.886 1660.886 1661.829 + 1661.829 1659.094 1659.094 1653.442 1653.442 1649.520 + 1649.520 1644.965 1644.965 1640.629 1583.807 1593.301 + 1593.301 1600.456 1600.456 1605.850 1605.850 1613.608 + 1613.608 1622.635 1622.635 1644.553 1644.553 1663.948 + 1663.948 1679.563 1679.563 1690.385 1690.385 1695.854 + 1693.091 1682.356 1682.356 1675.244 1675.244 1670.007 + 1670.007 1667.092 1658.841 1660.886 1660.886 1661.829 + 1661.829 1659.094 1659.094 1653.442 1653.442 1649.520 + 1649.520 1644.965 1644.965 1640.629 1640.629 1643.643 + 1593.301 1600.456 1600.456 1605.850 1605.850 1613.608 + 1613.608 1622.635 1622.635 1644.553 1644.553 1663.948 + 1663.948 1679.563 1679.563 1690.385 1690.385 1695.854 + + 1696.333 1686.148 1686.148 1678.536 1678.536 1673.146 + 1673.146 1670.606 1655.539 1655.783 1655.783 1657.390 + 1657.390 1652.509 1652.509 1645.247 1645.247 1643.116 + 1643.116 1641.247 1641.247 1638.474 1638.474 1638.214 + 1596.069 1602.010 1602.010 1608.784 1608.784 1614.808 + 1614.808 1624.149 1624.149 1643.123 1643.123 1661.222 + 1661.222 1676.223 1676.223 1688.106 1688.106 1693.709 + 1696.333 1686.148 1686.148 1678.536 1678.536 1673.146 + 1673.146 1670.606 1655.539 1655.783 1655.783 1657.390 + 1657.390 1652.509 1652.509 1645.247 1645.247 1643.116 + 1643.116 1641.247 1641.247 1638.474 1638.474 1638.214 + 1638.214 1643.643 1602.010 1608.784 1608.784 1614.808 + 1614.808 1624.149 1624.149 1643.123 1643.123 1661.222 + 1661.222 1676.223 1676.223 1688.106 1688.106 1693.709 + + 1698.740 1690.143 1690.143 1682.904 1682.904 1675.938 + 1675.938 1675.717 1653.546 1651.421 1651.421 1648.777 + 1648.777 1641.067 1641.067 1633.080 1633.080 1635.080 + 1635.080 1637.511 1637.511 1637.106 1637.106 1637.536 + 1637.536 1641.228 1606.810 1612.325 1612.325 1619.011 + 1619.011 1631.768 1631.768 1647.113 1647.113 1661.662 + 1661.662 1676.537 1676.537 1688.476 1688.476 1693.864 + 1631.792 1633.411 1633.411 1646.991 1646.991 1662.307 + 1662.307 1672.063 1643.978 1645.460 1645.460 1652.022 + 1652.022 1656.215 1656.215 1654.017 1654.017 1650.634 + 1650.634 1651.424 1651.424 1653.091 1682.105 1690.510 + 1690.510 1689.460 1689.460 1687.128 1687.128 1689.786 + 1689.786 1688.189 1688.189 1693.253 1693.253 1710.451 + 1710.451 1720.884 1720.884 1728.958 1728.958 1734.729 + + 1632.178 1635.977 1635.977 1648.054 1648.054 1660.457 + 1660.457 1669.225 1638.965 1640.995 1640.995 1648.008 + 1648.008 1652.044 1652.044 1652.803 1652.803 1649.939 + 1649.939 1647.920 1647.920 1646.508 1672.340 1679.184 + 1679.184 1680.633 1680.633 1679.643 1679.643 1679.690 + 1679.690 1676.263 1676.263 1679.758 1679.758 1692.808 + 1692.808 1707.245 1707.245 1717.248 1717.248 1723.722 + + 1632.178 1635.977 1635.977 1648.054 1648.054 1660.457 + 1660.457 1669.225 1638.965 1640.995 1640.995 1648.008 + 1648.008 1652.044 1652.044 1652.803 1652.803 1649.939 + 1649.939 1647.920 1647.920 1646.508 1646.508 1646.703 + 1679.184 1680.633 1680.633 1679.643 1679.643 1679.690 + 1679.690 1676.263 1676.263 1679.758 1679.758 1692.808 + 1692.808 1707.245 1707.245 1717.248 1717.248 1723.722 + + 1636.002 1636.780 1636.780 1646.178 1646.178 1658.847 + 1658.847 1666.098 1633.556 1636.172 1636.172 1640.392 + 1640.392 1643.139 1643.139 1645.081 1645.081 1640.830 + 1640.830 1637.857 1637.857 1636.411 1636.411 1636.366 + 1669.682 1671.894 1671.894 1672.031 1672.031 1671.749 + 1671.749 1668.702 1668.702 1670.575 1670.575 1682.734 + 1682.734 1699.997 1699.997 1710.330 1710.330 1716.951 + + 1636.002 1636.780 1636.780 1646.178 1646.178 1658.847 + 1658.847 1666.098 1633.556 1636.172 1636.172 1640.392 + 1640.392 1643.139 1643.139 1645.081 1645.081 1640.830 + 1640.830 1637.857 1637.857 1636.411 1636.411 1636.366 + 1669.682 1671.894 1671.894 1672.031 1672.031 1671.749 + 1671.749 1668.702 1668.702 1670.575 1670.575 1682.734 + 1682.734 1699.997 1699.997 1710.330 1710.330 1716.951 + + 1639.420 1634.446 1634.446 1642.995 1642.995 1655.438 + 1655.438 1662.379 1626.351 1628.450 1628.450 1629.562 + 1629.562 1628.434 1628.434 1629.474 1629.474 1624.643 + 1624.643 1624.521 1624.521 1623.318 1623.318 1624.537 + 1662.138 1664.177 1664.177 1665.392 1665.392 1665.859 + 1665.859 1666.172 1666.172 1666.393 1666.393 1672.741 + 1672.741 1692.721 1692.721 1707.250 1707.250 1713.746 + + 1639.420 1634.446 1634.446 1642.995 1642.995 1655.438 + 1655.438 1662.379 1626.351 1628.450 1628.450 1629.562 + 1629.562 1628.434 1628.434 1629.474 1629.474 1624.643 + 1624.643 1624.521 1624.521 1623.318 1623.318 1624.537 + 1662.138 1664.177 1664.177 1665.392 1665.392 1665.859 + 1665.859 1666.172 1666.172 1666.393 1666.393 1672.741 + 1672.741 1692.721 1692.721 1707.250 1707.250 1713.746 + + 1639.547 1631.003 1631.003 1639.274 1639.274 1651.146 + 1651.146 1657.842 1617.496 1617.396 1617.396 1614.410 + 1614.410 1613.914 1613.914 1614.970 1614.970 1611.901 + 1611.901 1612.026 1612.026 1611.486 1611.486 1613.868 + 1657.355 1659.835 1659.835 1662.048 1662.048 1662.912 + 1662.912 1665.929 1665.929 1663.378 1663.378 1670.502 + 1670.502 1690.039 1690.039 1707.691 1707.691 1713.368 + + 1639.547 1631.003 1631.003 1639.274 1639.274 1651.146 + 1651.146 1657.842 1617.496 1617.396 1617.396 1614.410 + 1614.410 1613.914 1613.914 1614.970 1614.970 1611.901 + 1611.901 1612.026 1612.026 1611.486 1611.486 1613.868 + 1657.355 1659.835 1659.835 1662.048 1662.048 1662.912 + 1662.912 1665.929 1665.929 1663.378 1663.378 1670.502 + 1670.502 1690.039 1690.039 1707.691 1707.691 1713.368 + + 1638.541 1631.000 1631.000 1637.384 1637.384 1646.932 + 1646.932 1653.774 1609.588 1608.043 1608.043 1605.612 + 1605.612 1603.058 1603.058 1604.047 1604.047 1604.347 + 1604.347 1605.388 1605.388 1604.781 1604.781 1606.539 + 1654.758 1657.558 1657.558 1660.373 1660.373 1661.974 + 1661.974 1666.151 1666.151 1665.340 1665.340 1673.625 + 1673.625 1691.296 1691.296 1708.611 1708.611 1714.084 + + 1638.541 1631.000 1631.000 1637.384 1637.384 1646.932 + 1646.932 1653.774 1609.588 1608.043 1608.043 1605.612 + 1605.612 1603.058 1603.058 1604.047 1604.047 1604.347 + 1604.347 1605.388 1605.388 1604.781 1604.781 1606.539 + 1606.539 1611.231 1657.558 1660.373 1660.373 1661.974 + 1661.974 1666.151 1666.151 1665.340 1665.340 1673.625 + 1673.625 1691.296 1691.296 1708.611 1708.611 1714.084 + + 1638.752 1633.038 1633.038 1637.250 1637.250 1643.925 + 1643.925 1650.343 1604.119 1603.321 1603.321 1600.217 + 1600.217 1594.540 1594.540 1598.428 1598.428 1600.597 + 1600.597 1601.847 1601.847 1600.711 1600.711 1601.554 + 1601.554 1605.995 1656.138 1659.885 1659.885 1663.376 + 1663.376 1670.106 1670.106 1671.318 1671.318 1679.903 + 1679.903 1693.400 1693.400 1708.409 1708.409 1715.049 + + 1638.752 1633.038 1633.038 1637.250 1637.250 1643.925 + 1643.925 1650.343 1604.119 1603.321 1603.321 1600.217 + 1600.217 1594.540 1594.540 1598.428 1598.428 1600.597 + 1600.597 1601.847 1601.847 1600.711 1600.711 1601.554 + 1601.554 1605.995 1656.138 1659.885 1659.885 1663.376 + 1663.376 1670.106 1670.106 1671.318 1671.318 1679.903 + 1679.903 1693.400 1693.400 1708.409 1708.409 1715.049 + + 1640.701 1634.037 1634.037 1636.540 1636.540 1641.992 + 1641.992 1647.485 1599.258 1598.655 1598.655 1594.700 + 1594.700 1589.176 1589.176 1593.259 1593.259 1596.413 + 1596.413 1598.288 1598.288 1597.176 1597.176 1598.431 + 1598.431 1603.079 1656.531 1660.220 1660.220 1668.593 + 1668.593 1674.501 1674.501 1677.875 1677.875 1686.389 + 1686.389 1697.666 1697.666 1711.117 1711.117 1718.191 + + 1640.701 1634.037 1634.037 1636.540 1636.540 1641.992 + 1641.992 1647.485 1599.258 1598.655 1598.655 1594.700 + 1594.700 1589.176 1589.176 1593.259 1593.259 1596.413 + 1596.413 1598.288 1598.288 1597.176 1597.176 1598.431 + 1598.431 1603.079 1656.531 1660.220 1660.220 1668.593 + 1668.593 1674.501 1674.501 1677.875 1677.875 1686.389 + 1686.389 1697.666 1697.666 1711.117 1711.117 1718.191 + + 1644.538 1635.051 1635.051 1638.128 1638.128 1641.813 + 1641.813 1644.627 1593.190 1592.510 1592.510 1588.064 + 1588.064 1584.917 1584.917 1587.723 1587.723 1592.212 + 1592.212 1594.843 1594.843 1594.449 1594.449 1597.473 + 1597.473 1602.834 1660.356 1663.929 1663.929 1676.371 + 1676.371 1681.179 1681.179 1686.303 1686.303 1694.856 + 1694.856 1704.789 1704.789 1717.760 1717.760 1722.171 + + 1644.538 1635.051 1635.051 1638.128 1638.128 1641.813 + 1641.813 1644.627 1640.244 1641.816 1592.510 1588.064 + 1588.064 1584.917 1584.917 1587.723 1587.723 1592.212 + 1592.212 1594.843 1594.843 1594.449 1594.449 1597.473 + 1597.473 1602.834 1660.356 1663.929 1663.929 1676.371 + 1676.371 1681.179 1681.179 1686.303 1686.303 1694.856 + 1694.856 1704.789 1704.789 1717.760 1717.760 1722.171 + + 1649.883 1641.330 1641.330 1640.927 1640.927 1642.690 + 1642.690 1644.757 1629.500 1630.284 1581.332 1580.104 + 1580.104 1579.008 1579.008 1581.549 1581.549 1588.002 + 1588.002 1591.628 1591.628 1595.195 1595.195 1600.532 + 1600.532 1605.561 1666.621 1672.244 1672.244 1686.681 + 1686.681 1691.281 1691.281 1694.388 1694.388 1701.551 + 1701.551 1708.988 1708.988 1718.573 1718.573 1725.288 + + 1649.883 1641.330 1641.330 1640.927 1640.927 1642.690 + 1642.690 1644.757 1629.500 1630.284 1581.332 1580.104 + 1580.104 1579.008 1579.008 1581.549 1581.549 1588.002 + 1588.002 1591.628 1591.628 1595.195 1595.195 1600.532 + 1600.532 1605.561 1666.621 1672.244 1672.244 1686.681 + 1686.681 1691.281 1691.281 1694.388 1694.388 1701.551 + 1701.551 1708.988 1708.988 1718.573 1718.573 1725.288 + + 1655.280 1651.486 1651.486 1648.780 1648.780 1647.854 + 1647.854 1647.887 1620.299 1620.371 1570.809 1570.370 + 1570.370 1572.156 1572.156 1578.068 1578.068 1585.775 + 1585.775 1590.895 1590.895 1599.093 1599.093 1603.882 + 1603.882 1608.983 1672.195 1679.599 1679.599 1693.722 + 1693.722 1697.787 1697.787 1699.894 1699.894 1707.308 + 1707.308 1726.322 1726.322 1729.713 1729.713 1734.685 + + 1655.280 1651.486 1651.486 1648.780 1648.780 1647.854 + 1647.854 1647.887 1620.299 1620.371 1620.371 1621.966 + 1570.370 1572.156 1572.156 1578.068 1578.068 1585.775 + 1585.775 1590.895 1590.895 1599.093 1599.093 1603.882 + 1603.882 1608.983 1672.195 1679.599 1679.599 1693.722 + 1693.722 1697.787 1697.787 1699.894 1699.894 1707.308 + 1707.308 1726.322 1726.322 1729.713 1729.713 1734.685 + + 1661.333 1659.357 1659.357 1657.374 1657.374 1654.784 + 1654.784 1652.592 1612.162 1611.917 1611.917 1613.227 + 1561.767 1563.440 1563.440 1573.697 1573.697 1585.285 + 1585.285 1593.099 1593.099 1605.709 1605.709 1608.341 + 1608.341 1613.322 1675.724 1684.820 1684.820 1696.459 + 1696.459 1701.446 1701.446 1704.567 1704.567 1711.552 + 1711.552 1745.083 1745.083 1752.371 1752.371 1750.685 + + 1661.333 1659.357 1659.357 1657.374 1657.374 1654.784 + 1654.784 1652.592 1612.162 1611.917 1611.917 1613.227 + 1561.767 1563.440 1563.440 1573.697 1573.697 1585.285 + 1585.285 1593.099 1593.099 1605.709 1605.709 1608.341 + 1608.341 1613.322 1675.724 1684.820 1684.820 1696.459 + 1696.459 1701.446 1701.446 1704.567 1704.567 1711.552 + 1711.552 1745.083 1745.083 1752.371 1752.371 1750.685 + + 1664.068 1664.131 1664.131 1663.742 1663.742 1660.615 + 1660.615 1657.224 1605.847 1605.943 1605.943 1607.218 + 1556.305 1557.625 1557.625 1568.095 1568.095 1586.394 + 1586.394 1600.026 1600.026 1608.595 1608.595 1611.371 + 1611.371 1616.384 1675.406 1685.111 1685.111 1695.071 + 1695.071 1701.553 1701.553 1706.049 1706.049 1720.305 + 1720.305 1748.561 1748.561 1757.134 1757.134 1756.906 + + 1664.068 1664.131 1664.131 1663.742 1663.742 1660.615 + 1660.615 1657.224 1605.847 1605.943 1605.943 1607.218 + 1607.218 1610.548 1557.625 1568.095 1568.095 1586.394 + 1586.394 1600.026 1600.026 1608.595 1608.595 1611.371 + 1611.371 1616.384 1616.384 1622.298 1685.111 1695.071 + 1695.071 1701.553 1701.553 1706.049 1706.049 1720.305 + 1720.305 1748.561 1748.561 1757.134 1757.134 1756.906 + + 1666.840 1667.382 1667.382 1667.510 1667.510 1664.101 + 1664.101 1660.389 1602.470 1603.655 1603.655 1605.153 + 1605.153 1606.671 1554.033 1562.618 1562.618 1584.593 + 1584.593 1599.224 1599.224 1607.562 1607.562 1612.523 + 1612.523 1618.866 1618.866 1625.199 1679.706 1689.794 + 1689.794 1699.948 1699.948 1706.367 1706.367 1735.562 + 1735.562 1752.914 1752.914 1754.262 1754.262 1753.987 + + 1666.840 1667.382 1667.382 1667.510 1667.510 1664.101 + 1664.101 1660.389 1602.470 1603.655 1603.655 1605.153 + 1605.153 1606.671 1554.033 1562.618 1562.618 1584.593 + 1584.593 1599.224 1599.224 1607.562 1607.562 1612.523 + 1612.523 1618.866 1618.866 1625.199 1679.706 1689.794 + 1689.794 1699.948 1699.948 1706.367 1706.367 1735.562 + 1735.562 1752.914 1752.914 1754.262 1754.262 1753.987 + + 1668.275 1666.183 1666.183 1667.035 1667.035 1665.074 + 1665.074 1662.072 1600.566 1602.506 1602.506 1603.974 + 1603.974 1604.441 1551.015 1555.594 1555.594 1570.474 + 1570.474 1587.726 1587.726 1602.727 1602.727 1612.308 + 1612.308 1620.148 1620.148 1627.357 1673.303 1682.160 + 1682.160 1695.962 1695.962 1708.115 1708.115 1728.158 + 1728.158 1743.687 1743.687 1746.998 1746.998 1747.198 + + 1668.275 1666.183 1666.183 1667.035 1667.035 1665.074 + 1665.074 1662.072 1600.566 1602.506 1602.506 1603.974 + 1603.974 1604.441 1604.441 1610.992 1555.594 1570.474 + 1570.474 1587.726 1587.726 1602.727 1602.727 1612.308 + 1612.308 1620.148 1620.148 1627.357 1673.303 1682.160 + 1682.160 1695.962 1695.962 1708.115 1708.115 1728.158 + 1728.158 1743.687 1743.687 1746.998 1746.998 1747.198 + + 1666.565 1664.826 1664.826 1666.727 1666.727 1665.205 + 1665.205 1662.644 1598.057 1599.605 1599.605 1601.629 + 1601.629 1604.642 1604.642 1612.221 1553.395 1563.528 + 1563.528 1580.184 1580.184 1595.331 1595.331 1611.062 + 1611.062 1620.545 1620.545 1628.367 1668.924 1677.713 + 1677.713 1694.605 1694.605 1709.692 1709.692 1723.855 + 1723.855 1733.459 1733.459 1737.789 1737.789 1738.650 + + 1666.565 1664.826 1664.826 1666.727 1666.727 1665.205 + 1665.205 1662.644 1598.057 1599.605 1599.605 1601.629 + 1601.629 1604.642 1604.642 1612.221 1553.395 1563.528 + 1563.528 1580.184 1580.184 1595.331 1595.331 1611.062 + 1611.062 1620.545 1620.545 1628.367 1668.924 1677.713 + 1677.713 1694.605 1694.605 1709.692 1709.692 1723.855 + 1723.855 1733.459 1733.459 1737.789 1737.789 1738.650 + + 1663.275 1663.534 1663.534 1665.530 1665.530 1663.692 + 1663.692 1662.014 1596.930 1599.494 1599.494 1604.147 + 1604.147 1610.521 1610.521 1616.006 1556.052 1564.015 + 1564.015 1577.087 1577.087 1589.545 1589.545 1609.258 + 1609.258 1620.128 1620.128 1627.999 1666.797 1675.024 + 1675.024 1689.571 1689.571 1704.908 1704.908 1717.245 + 1717.245 1724.326 1724.326 1728.288 1728.288 1729.201 + + 1663.275 1663.534 1663.534 1665.530 1665.530 1663.692 + 1663.692 1662.014 1662.014 1661.023 1599.494 1604.147 + 1604.147 1610.521 1610.521 1616.006 1556.052 1564.015 + 1564.015 1577.087 1577.087 1589.545 1589.545 1609.258 + 1609.258 1620.128 1620.128 1627.999 1666.797 1675.024 + 1675.024 1689.571 1689.571 1704.908 1704.908 1717.245 + 1717.245 1724.326 1724.326 1728.288 1728.288 1729.201 + + 1664.874 1662.877 1662.877 1664.943 1664.943 1662.717 + 1662.717 1662.433 1662.433 1662.277 1601.647 1606.974 + 1606.974 1612.442 1612.442 1618.025 1559.943 1567.335 + 1567.335 1577.058 1577.058 1585.066 1585.066 1605.934 + 1605.934 1621.357 1621.357 1625.772 1665.839 1673.519 + 1673.519 1684.075 1684.075 1697.117 1697.117 1708.276 + 1708.276 1714.922 1714.922 1717.997 1717.997 1718.544 + + 1664.874 1662.877 1662.877 1664.943 1664.943 1662.717 + 1662.717 1662.433 1662.433 1662.277 1662.277 1661.251 + 1606.974 1612.442 1612.442 1618.025 1618.025 1626.725 + 1567.335 1577.058 1577.058 1585.066 1585.066 1605.934 + 1605.934 1621.357 1621.357 1625.772 1625.772 1631.605 + 1673.519 1684.075 1684.075 1697.117 1697.117 1708.276 + 1708.276 1714.922 1714.922 1717.997 1717.997 1718.544 + + 1667.958 1663.762 1663.762 1664.385 1664.385 1663.532 + 1663.532 1663.935 1663.935 1663.213 1663.213 1662.367 + 1608.041 1613.062 1613.062 1619.162 1619.162 1626.934 + 1568.544 1574.514 1574.514 1580.023 1580.023 1600.068 + 1600.068 1617.939 1617.939 1623.319 1623.319 1627.723 + 1672.808 1681.986 1681.986 1692.677 1692.677 1700.980 + 1700.980 1704.762 1704.762 1707.721 1707.721 1709.419 + + 1678.133 1671.141 1663.762 1664.385 1664.385 1663.532 + 1663.532 1663.935 1663.935 1663.213 1663.213 1662.367 + 1662.367 1660.867 1613.062 1619.162 1619.162 1626.934 + 1568.544 1574.514 1574.514 1580.023 1580.023 1600.068 + 1600.068 1617.939 1617.939 1623.319 1623.319 1627.723 + 1627.723 1634.891 1681.986 1692.677 1692.677 1700.980 + 1700.980 1704.762 1704.762 1707.721 1707.721 1709.419 + + 1682.666 1673.172 1664.650 1662.571 1662.571 1661.848 + 1661.848 1662.681 1662.681 1662.659 1662.659 1663.125 + 1663.125 1661.961 1613.869 1619.701 1619.701 1626.745 + 1567.997 1571.544 1571.544 1576.188 1576.188 1590.618 + 1590.618 1608.713 1608.713 1616.450 1616.450 1623.201 + 1623.201 1632.000 1679.149 1689.043 1689.043 1692.828 + 1692.828 1693.526 1693.526 1699.407 1699.407 1703.818 + + 1682.666 1673.172 1673.172 1668.783 1662.571 1661.848 + 1661.848 1662.681 1662.681 1662.659 1662.659 1663.125 + 1663.125 1661.961 1661.961 1658.578 1619.701 1626.745 + 1626.745 1635.627 1571.544 1576.188 1576.188 1590.618 + 1590.618 1608.713 1608.713 1616.450 1616.450 1623.201 + 1623.201 1632.000 1632.000 1644.142 1689.043 1692.828 + 1692.828 1693.526 1693.526 1699.407 1699.407 1703.818 + + 1688.180 1676.967 1676.967 1671.697 1662.003 1660.583 + 1660.583 1663.000 1663.000 1662.995 1662.995 1663.234 + 1663.234 1661.864 1661.864 1657.431 1620.209 1626.614 + 1626.614 1633.893 1572.524 1578.980 1578.980 1590.756 + 1590.756 1602.774 1602.774 1608.445 1608.445 1618.025 + 1618.025 1627.217 1627.217 1643.481 1670.549 1677.425 + 1677.425 1685.899 1685.899 1694.850 1694.850 1699.732 + + 1688.180 1676.967 1676.967 1671.697 1671.697 1667.304 + 1660.583 1663.000 1663.000 1662.995 1662.995 1663.234 + 1663.234 1661.864 1661.864 1657.431 1657.431 1652.558 + 1652.558 1647.847 1647.847 1646.328 1578.980 1590.756 + 1590.756 1602.774 1602.774 1608.445 1608.445 1618.025 + 1618.025 1627.217 1627.217 1643.481 1670.549 1677.425 + 1677.425 1685.899 1685.899 1694.850 1694.850 1699.732 + + 1693.091 1682.356 1682.356 1675.244 1675.244 1670.007 + 1659.233 1658.841 1658.841 1660.886 1660.886 1661.829 + 1661.829 1659.094 1659.094 1653.442 1653.442 1649.520 + 1649.520 1644.965 1644.965 1640.629 1583.807 1593.301 + 1593.301 1600.456 1600.456 1605.850 1605.850 1613.608 + 1613.608 1622.635 1622.635 1644.553 1644.553 1663.948 + 1663.948 1679.563 1679.563 1690.385 1690.385 1695.854 + + 1693.091 1682.356 1682.356 1675.244 1675.244 1670.007 + 1670.007 1667.092 1658.841 1660.886 1660.886 1661.829 + 1661.829 1659.094 1659.094 1653.442 1653.442 1649.520 + 1649.520 1644.965 1644.965 1640.629 1640.629 1643.643 + 1593.301 1600.456 1600.456 1605.850 1605.850 1613.608 + 1613.608 1622.635 1622.635 1644.553 1644.553 1663.948 + 1663.948 1679.563 1679.563 1690.385 1690.385 1695.854 + + 1696.333 1686.148 1686.148 1678.536 1678.536 1673.146 + 1673.146 1670.606 1655.539 1655.783 1655.783 1657.390 + 1657.390 1652.509 1652.509 1645.247 1645.247 1643.116 + 1643.116 1641.247 1641.247 1638.474 1638.474 1638.214 + 1596.069 1602.010 1602.010 1608.784 1608.784 1614.808 + 1614.808 1624.149 1624.149 1643.123 1643.123 1661.222 + 1661.222 1676.223 1676.223 1688.106 1688.106 1693.709 + + 1696.333 1686.148 1686.148 1678.536 1678.536 1673.146 + 1673.146 1670.606 1655.539 1655.783 1655.783 1657.390 + 1657.390 1652.509 1652.509 1645.247 1645.247 1643.116 + 1643.116 1641.247 1641.247 1638.474 1638.474 1638.214 + 1638.214 1643.643 1602.010 1608.784 1608.784 1614.808 + 1614.808 1624.149 1624.149 1643.123 1643.123 1661.222 + 1661.222 1676.223 1676.223 1688.106 1688.106 1693.709 + + 1698.740 1690.143 1690.143 1682.904 1682.904 1675.938 + 1675.938 1675.717 1653.546 1651.421 1651.421 1648.777 + 1648.777 1641.067 1641.067 1633.080 1633.080 1635.080 + 1635.080 1637.511 1637.511 1637.106 1637.106 1637.536 + 1637.536 1641.228 1606.810 1612.325 1612.325 1619.011 + 1619.011 1631.768 1631.768 1647.113 1647.113 1661.662 + 1661.662 1676.537 1676.537 1688.476 1688.476 1693.864 + + 1636.181 1638.101 1638.101 1651.881 1651.881 1666.965 + 1666.965 1676.691 1648.265 1649.952 1649.952 1656.628 + 1656.628 1660.755 1660.755 1658.434 1658.434 1655.137 + 1655.137 1656.053 1656.053 1657.812 1685.861 1694.380 + 1694.380 1693.828 1693.828 1692.188 1692.188 1694.653 + 1694.653 1692.905 1692.905 1698.526 1698.526 1715.101 + 1715.101 1725.223 1725.223 1733.370 1733.370 1738.832 + + 1636.749 1640.872 1640.872 1652.837 1652.837 1665.115 + 1665.115 1673.868 1643.382 1645.545 1645.545 1652.620 + 1652.620 1656.600 1656.600 1657.286 1657.286 1654.423 + 1654.423 1652.450 1652.450 1651.114 1676.501 1683.713 + 1683.713 1685.293 1685.293 1684.415 1684.415 1684.347 + 1684.347 1680.881 1680.881 1684.922 1684.922 1697.903 + 1697.903 1711.879 1711.879 1721.742 1721.742 1727.820 + 1636.749 1640.872 1640.872 1652.837 1652.837 1665.115 + 1665.115 1673.868 1643.382 1645.545 1645.545 1652.620 + 1652.620 1656.600 1656.600 1657.286 1657.286 1654.423 + 1654.423 1652.450 1652.450 1651.114 1651.114 1651.492 + 1683.713 1685.293 1685.293 1684.415 1684.415 1684.347 + 1684.347 1680.881 1680.881 1684.922 1684.922 1697.903 + 1697.903 1711.879 1711.879 1721.742 1721.742 1727.820 + + 1640.422 1641.319 1641.319 1650.902 1650.902 1663.436 + 1663.436 1670.855 1637.958 1640.717 1640.717 1644.966 + 1644.966 1647.714 1647.714 1649.678 1649.678 1645.299 + 1645.299 1642.501 1642.501 1641.069 1641.069 1641.129 + 1674.293 1676.463 1676.463 1676.839 1676.839 1676.363 + 1676.363 1673.418 1673.418 1675.672 1675.672 1688.088 + 1688.088 1704.724 1704.724 1714.806 1714.806 1720.979 + 1640.422 1641.319 1641.319 1650.902 1650.902 1663.436 + 1663.436 1670.855 1637.958 1640.717 1640.717 1644.966 + 1644.966 1647.714 1647.714 1649.678 1649.678 1645.299 + 1645.299 1642.501 1642.501 1641.069 1641.069 1641.129 + 1674.293 1676.463 1676.463 1676.839 1676.839 1676.363 + 1676.363 1673.418 1673.418 1675.672 1675.672 1688.088 + 1688.088 1704.724 1704.724 1714.806 1714.806 1720.979 + + 1643.680 1638.672 1638.672 1647.634 1647.634 1659.949 + 1659.949 1667.158 1630.703 1633.019 1633.019 1634.098 + 1634.098 1633.157 1633.157 1634.136 1634.136 1629.278 + 1629.278 1629.362 1629.362 1627.812 1627.812 1629.151 + 1666.835 1668.988 1668.988 1670.160 1670.160 1670.601 + 1670.601 1670.921 1670.921 1671.379 1671.379 1677.956 + 1677.956 1697.746 1697.746 1711.577 1711.577 1717.602 + 1643.680 1638.672 1638.672 1647.634 1647.634 1659.949 + 1659.949 1667.158 1630.703 1633.019 1633.019 1634.098 + 1634.098 1633.157 1633.157 1634.136 1634.136 1629.278 + 1629.278 1629.362 1629.362 1627.812 1627.812 1629.151 + 1666.835 1668.988 1668.988 1670.160 1670.160 1670.601 + 1670.601 1670.921 1670.921 1671.379 1671.379 1677.956 + 1677.956 1697.746 1697.746 1711.577 1711.577 1717.602 + + 1643.477 1635.225 1635.225 1643.797 1643.797 1655.596 + 1655.596 1662.605 1621.855 1621.978 1621.978 1618.936 + 1618.936 1618.886 1618.886 1619.791 1619.791 1616.785 + 1616.785 1617.005 1617.005 1616.088 1616.088 1618.541 + 1662.071 1664.576 1664.576 1666.829 1666.829 1667.802 + 1667.802 1670.781 1670.781 1668.325 1668.325 1675.885 + 1675.885 1694.977 1694.977 1711.709 1711.709 1717.029 + 1643.477 1635.225 1635.225 1643.797 1643.797 1655.596 + 1655.596 1662.605 1621.855 1621.978 1621.978 1618.936 + 1618.936 1618.886 1618.886 1619.791 1619.791 1616.785 + 1616.785 1617.005 1617.005 1616.088 1616.088 1618.541 + 1662.071 1664.576 1664.576 1666.829 1666.829 1667.802 + 1667.802 1670.781 1670.781 1668.325 1668.325 1675.885 + 1675.885 1694.977 1694.977 1711.709 1711.709 1717.029 + + 1642.572 1635.309 1635.309 1641.775 1641.775 1651.364 + 1651.364 1658.518 1614.022 1612.602 1612.602 1610.147 + 1610.147 1608.049 1608.049 1609.030 1609.030 1609.510 + 1609.510 1610.459 1610.459 1609.710 1609.710 1611.529 + 1659.559 1662.367 1662.367 1665.176 1665.176 1666.873 + 1666.873 1670.979 1670.979 1670.155 1670.155 1679.084 + 1679.084 1696.263 1696.263 1712.600 1712.600 1717.715 + 1642.572 1635.309 1635.309 1641.775 1641.775 1651.364 + 1651.364 1658.518 1614.022 1612.602 1612.602 1610.147 + 1610.147 1608.049 1608.049 1609.030 1609.030 1609.510 + 1609.510 1610.459 1610.459 1609.710 1609.710 1611.529 + 1611.529 1616.232 1662.367 1665.176 1665.176 1666.873 + 1666.873 1670.979 1670.979 1670.155 1670.155 1679.084 + 1679.084 1696.263 1696.263 1712.600 1712.600 1717.715 + + 1643.036 1637.351 1637.351 1641.493 1641.493 1648.233 + 1648.233 1654.974 1608.611 1607.965 1607.965 1604.672 + 1604.672 1599.606 1599.606 1603.678 1603.678 1605.950 + 1605.950 1607.108 1607.108 1605.750 1605.750 1606.691 + 1606.691 1611.099 1661.201 1664.822 1664.822 1668.362 + 1668.362 1675.085 1675.085 1676.221 1676.221 1685.245 + 1685.245 1698.440 1698.440 1712.692 1712.692 1718.784 + 1643.036 1637.351 1637.351 1641.493 1641.493 1648.233 + 1648.233 1654.974 1608.611 1607.965 1607.965 1604.672 + 1604.672 1599.606 1599.606 1603.678 1603.678 1605.950 + 1605.950 1607.108 1607.108 1605.750 1605.750 1606.691 + 1606.691 1611.099 1661.201 1664.822 1664.822 1668.362 + 1668.362 1675.085 1675.085 1676.221 1676.221 1685.245 + 1685.245 1698.440 1698.440 1712.692 1712.692 1718.784 + + 1645.240 1638.497 1638.497 1640.557 1640.557 1646.030 + 1646.030 1651.903 1603.708 1603.352 1603.352 1599.140 + 1599.140 1594.313 1594.313 1598.620 1598.620 1601.847 + 1601.847 1603.546 1603.546 1602.205 1602.205 1603.544 + 1603.544 1608.227 1661.785 1665.354 1665.354 1673.545 + 1673.545 1679.418 1679.418 1682.825 1682.825 1691.655 + 1691.655 1702.736 1702.736 1715.566 1715.566 1721.964 + 1645.240 1638.497 1638.497 1640.557 1640.557 1646.030 + 1646.030 1651.903 1603.708 1603.352 1603.352 1599.140 + 1599.140 1594.313 1594.313 1598.620 1598.620 1601.847 + 1601.847 1603.546 1603.546 1602.205 1602.205 1603.544 + 1603.544 1608.227 1661.785 1665.354 1665.354 1673.545 + 1673.545 1679.418 1679.418 1682.825 1682.825 1691.655 + 1691.655 1702.736 1702.736 1715.566 1715.566 1721.964 + + 1649.192 1640.147 1640.147 1641.901 1641.901 1645.810 + 1645.810 1649.025 1597.246 1596.769 1596.769 1592.721 + 1592.721 1589.954 1589.954 1593.073 1593.073 1597.650 + 1597.650 1599.967 1599.967 1599.475 1599.475 1602.582 + 1602.582 1608.027 1665.482 1668.997 1668.997 1681.409 + 1681.409 1685.987 1685.987 1691.235 1691.235 1700.090 + 1700.090 1709.733 1709.733 1721.929 1721.929 1726.071 + 1649.192 1640.147 1640.147 1641.901 1641.901 1645.810 + 1645.810 1649.025 1645.021 1647.772 1596.769 1592.721 + 1592.721 1589.954 1589.954 1593.073 1593.073 1597.650 + 1597.650 1599.967 1599.967 1599.475 1599.475 1602.582 + 1602.582 1608.027 1665.482 1668.997 1668.997 1681.409 + 1681.409 1685.987 1685.987 1691.235 1691.235 1700.090 + 1700.090 1709.733 1709.733 1721.929 1721.929 1726.071 + + 1654.587 1646.707 1646.707 1645.149 1645.149 1646.852 + 1646.852 1649.148 1634.653 1636.149 1585.870 1584.847 + 1584.847 1584.127 1584.127 1586.893 1586.893 1593.442 + 1593.442 1596.762 1596.762 1600.340 1600.340 1605.612 + 1605.612 1610.718 1671.764 1677.315 1677.315 1691.652 + 1691.652 1696.103 1696.103 1699.241 1699.241 1706.732 + 1706.732 1714.138 1714.138 1723.492 1723.492 1729.576 + 1654.587 1646.707 1646.707 1645.149 1645.149 1646.852 + 1646.852 1649.148 1634.653 1636.149 1585.870 1584.847 + 1584.847 1584.127 1584.127 1586.893 1586.893 1593.442 + 1593.442 1596.762 1596.762 1600.340 1600.340 1605.612 + 1605.612 1610.718 1671.764 1677.315 1677.315 1691.652 + 1691.652 1696.103 1696.103 1699.241 1699.241 1706.732 + 1706.732 1714.138 1714.138 1723.492 1723.492 1729.576 + + 1659.938 1656.371 1656.371 1653.515 1653.515 1652.284 + 1652.284 1652.357 1625.221 1625.568 1575.510 1575.240 + 1575.240 1577.311 1577.311 1583.168 1583.168 1591.182 + 1591.182 1595.968 1595.968 1604.332 1604.332 1608.786 + 1608.786 1614.021 1677.804 1685.408 1685.408 1698.652 + 1698.652 1702.651 1702.651 1704.844 1704.844 1712.584 + 1712.584 1730.381 1730.381 1734.275 1734.275 1738.885 + 1659.938 1656.371 1656.371 1653.515 1653.515 1652.284 + 1652.284 1652.357 1625.221 1625.568 1625.568 1627.589 + 1575.240 1577.311 1577.311 1583.168 1583.168 1591.182 + 1591.182 1595.968 1595.968 1604.332 1604.332 1608.786 + 1608.786 1614.021 1677.804 1685.408 1685.408 1698.652 + 1698.652 1702.651 1702.651 1704.844 1704.844 1712.584 + 1712.584 1730.381 1730.381 1734.275 1734.275 1738.885 + + 1665.965 1663.912 1663.912 1662.181 1662.181 1659.568 + 1659.568 1657.323 1616.532 1616.316 1616.316 1617.825 + 1566.533 1568.404 1568.404 1578.992 1578.992 1590.547 + 1590.547 1598.422 1598.422 1610.855 1610.855 1613.144 + 1613.144 1618.240 1681.358 1690.538 1690.538 1701.567 + 1701.567 1706.375 1706.375 1709.593 1709.593 1717.051 + 1717.051 1749.016 1749.016 1755.704 1755.704 1754.341 + 1665.965 1663.912 1663.912 1662.181 1662.181 1659.568 + 1659.568 1657.323 1616.532 1616.316 1616.316 1617.825 + 1566.533 1568.404 1568.404 1578.992 1578.992 1590.547 + 1590.547 1598.422 1598.422 1610.855 1610.855 1613.144 + 1613.144 1618.240 1681.358 1690.538 1690.538 1701.567 + 1701.567 1706.375 1706.375 1709.593 1709.593 1717.051 + 1717.051 1749.016 1749.016 1755.704 1755.704 1754.341 + + 1668.654 1668.327 1668.327 1668.497 1668.497 1665.625 + 1665.625 1662.231 1609.743 1609.834 1609.834 1611.259 + 1561.021 1562.415 1562.415 1573.286 1573.286 1591.658 + 1591.658 1605.171 1605.171 1613.538 1613.538 1616.278 + 1616.278 1621.374 1680.899 1690.317 1690.317 1700.149 + 1700.149 1706.584 1706.584 1711.097 1711.097 1725.804 + 1725.804 1753.553 1753.553 1760.983 1760.983 1760.708 + 1668.654 1668.327 1668.327 1668.497 1668.497 1665.625 + 1665.625 1662.231 1609.743 1609.834 1609.834 1611.259 + 1611.259 1614.995 1562.415 1573.286 1573.286 1591.658 + 1591.658 1605.171 1605.171 1613.538 1613.538 1616.278 + 1616.278 1621.374 1621.374 1627.168 1690.317 1700.149 + 1700.149 1706.584 1706.584 1711.097 1711.097 1725.804 + 1725.804 1753.553 1753.553 1760.983 1760.983 1760.708 + + 1671.539 1671.548 1671.548 1672.219 1672.219 1669.182 + 1669.182 1665.516 1606.283 1607.619 1607.619 1609.382 + 1609.382 1611.081 1558.774 1567.697 1567.697 1590.271 + 1590.271 1604.472 1604.472 1612.544 1612.544 1617.447 + 1617.447 1623.755 1623.755 1630.075 1685.001 1695.005 + 1695.005 1705.085 1705.085 1711.363 1711.363 1739.973 + 1739.973 1757.053 1757.053 1758.314 1758.314 1758.049 + 1671.539 1671.548 1671.548 1672.219 1672.219 1669.182 + 1669.182 1665.516 1606.283 1607.619 1607.619 1609.382 + 1609.382 1611.081 1558.774 1567.697 1567.697 1590.271 + 1590.271 1604.472 1604.472 1612.544 1612.544 1617.447 + 1617.447 1623.755 1623.755 1630.075 1685.001 1695.005 + 1695.005 1705.085 1705.085 1711.363 1711.363 1739.973 + 1739.973 1757.053 1757.053 1758.314 1758.314 1758.049 + + 1673.084 1670.497 1670.497 1671.518 1671.518 1669.965 + 1669.965 1667.145 1604.683 1606.956 1606.956 1608.893 + 1608.893 1609.078 1555.773 1560.492 1560.492 1575.817 + 1575.817 1593.215 1593.215 1607.986 1607.986 1617.340 + 1617.340 1625.115 1625.115 1632.303 1678.433 1687.367 + 1687.367 1701.265 1701.265 1713.338 1713.338 1733.081 + 1733.081 1747.658 1747.658 1751.035 1751.035 1751.280 + 1673.084 1670.497 1670.497 1671.518 1671.518 1669.965 + 1669.965 1667.145 1604.683 1606.956 1606.956 1608.893 + 1608.893 1609.078 1609.078 1615.647 1560.492 1575.817 + 1575.817 1593.215 1593.215 1607.986 1607.986 1617.340 + 1617.340 1625.115 1625.115 1632.303 1678.433 1687.367 + 1687.367 1701.265 1701.265 1713.338 1713.338 1733.081 + 1733.081 1747.658 1747.658 1751.035 1751.035 1751.280 + + 1671.517 1669.043 1669.043 1671.153 1671.153 1669.996 + 1669.996 1667.611 1602.700 1604.727 1604.727 1607.313 + 1607.313 1609.561 1609.561 1616.471 1558.230 1568.609 + 1568.609 1585.446 1585.446 1600.769 1600.769 1616.274 + 1616.274 1625.554 1625.554 1633.279 1674.061 1683.005 + 1683.005 1699.964 1699.964 1714.383 1714.383 1727.987 + 1727.987 1737.468 1737.468 1741.867 1741.867 1742.741 + 1671.517 1669.043 1669.043 1671.153 1671.153 1669.996 + 1669.996 1667.611 1602.700 1604.727 1604.727 1607.313 + 1607.313 1609.561 1609.561 1616.471 1558.230 1568.609 + 1568.609 1585.446 1585.446 1600.769 1600.769 1616.274 + 1616.274 1625.554 1625.554 1633.279 1674.061 1683.005 + 1683.005 1699.964 1699.964 1714.383 1714.383 1727.987 + 1727.987 1737.468 1737.468 1741.867 1741.867 1742.741 + + 1668.156 1667.630 1667.630 1670.104 1670.104 1668.430 + 1668.430 1666.773 1602.174 1605.334 1605.334 1610.869 + 1610.869 1616.809 1616.809 1619.835 1560.974 1569.041 + 1569.041 1582.151 1582.151 1595.088 1595.088 1614.643 + 1614.643 1625.122 1625.122 1632.655 1671.904 1680.212 + 1680.212 1694.953 1694.953 1709.292 1709.292 1721.019 + 1721.019 1728.263 1728.263 1732.397 1732.397 1733.355 + 1668.156 1667.630 1667.630 1670.104 1670.104 1668.430 + 1668.430 1666.773 1666.773 1665.960 1605.334 1610.869 + 1610.869 1616.809 1616.809 1619.835 1560.974 1569.041 + 1569.041 1582.151 1582.151 1595.088 1595.088 1614.643 + 1614.643 1625.122 1625.122 1632.655 1671.904 1680.212 + 1680.212 1694.953 1694.953 1709.292 1709.292 1721.019 + 1721.019 1728.263 1728.263 1732.397 1732.397 1733.355 + + 1669.625 1667.095 1667.095 1669.579 1669.579 1667.431 + 1667.431 1667.042 1667.042 1667.128 1607.798 1613.580 + 1613.580 1618.024 1618.024 1622.092 1565.009 1572.431 + 1572.431 1581.963 1581.963 1590.513 1590.513 1611.446 + 1611.446 1626.447 1626.447 1630.607 1670.758 1678.543 + 1678.543 1689.182 1689.182 1701.847 1701.847 1712.377 + 1712.377 1718.867 1718.867 1722.174 1722.174 1722.852 + 1669.625 1667.095 1667.095 1669.579 1669.579 1667.431 + 1667.431 1667.042 1667.042 1667.128 1667.128 1666.181 + 1613.580 1618.024 1618.024 1622.092 1622.092 1631.250 + 1572.431 1581.963 1581.963 1590.513 1590.513 1611.446 + 1611.446 1626.447 1626.447 1630.607 1630.607 1636.502 + 1678.543 1689.182 1689.182 1701.847 1701.847 1712.377 + 1712.377 1718.867 1718.867 1722.174 1722.174 1722.852 + + 1672.564 1668.303 1668.303 1668.913 1668.913 1668.125 + 1668.125 1668.430 1668.430 1667.883 1667.883 1667.108 + 1613.930 1618.322 1618.322 1624.004 1624.004 1631.623 + 1573.547 1579.365 1579.365 1585.302 1585.302 1605.701 + 1605.701 1623.016 1623.016 1628.223 1628.223 1632.497 + 1677.177 1686.385 1686.385 1696.909 1696.909 1704.675 + 1704.675 1708.551 1708.551 1711.862 1711.862 1713.611 + 1682.717 1675.950 1668.303 1668.913 1668.913 1668.125 + 1668.125 1668.430 1668.430 1667.883 1667.883 1667.108 + 1667.108 1665.510 1618.322 1624.004 1624.004 1631.623 + 1573.547 1579.365 1579.365 1585.302 1585.302 1605.701 + 1605.701 1623.016 1623.016 1628.223 1628.223 1632.497 + 1632.497 1639.686 1686.385 1696.909 1696.909 1704.675 + 1704.675 1708.551 1708.551 1711.862 1711.862 1713.611 + + 1687.104 1677.835 1669.218 1667.169 1667.169 1666.407 + 1666.407 1667.211 1667.211 1667.268 1667.268 1667.777 + 1667.777 1666.500 1619.112 1624.639 1624.639 1631.528 + 1572.957 1576.430 1576.430 1581.041 1581.041 1596.180 + 1596.180 1613.791 1613.791 1621.459 1621.459 1627.925 + 1627.925 1636.713 1682.115 1691.481 1691.481 1695.585 + 1695.585 1697.028 1697.028 1703.329 1703.329 1707.591 + 1687.104 1677.835 1677.835 1673.654 1667.169 1666.407 + 1666.407 1667.211 1667.211 1667.268 1667.268 1667.777 + 1667.777 1666.500 1666.500 1662.707 1624.639 1631.528 + 1631.528 1640.402 1576.430 1581.041 1581.041 1596.180 + 1596.180 1613.791 1613.791 1621.459 1621.459 1627.925 + 1627.925 1636.713 1636.713 1648.855 1691.481 1695.585 + 1695.585 1697.028 1697.028 1703.329 1703.329 1707.591 + + 1692.429 1681.396 1681.396 1676.335 1666.609 1665.190 + 1665.190 1667.474 1667.474 1667.611 1667.611 1667.789 + 1667.789 1666.274 1666.274 1661.527 1625.180 1631.419 + 1631.419 1638.617 1577.489 1584.065 1584.065 1595.979 + 1595.979 1607.732 1607.732 1613.426 1613.426 1623.050 + 1623.050 1632.139 1632.139 1648.219 1673.473 1680.599 + 1680.599 1689.496 1689.496 1698.728 1698.728 1703.452 + 1692.429 1681.396 1681.396 1676.335 1676.335 1672.292 + 1665.190 1667.474 1667.474 1667.611 1667.611 1667.789 + 1667.789 1666.274 1666.274 1661.527 1661.527 1656.166 + 1656.166 1651.422 1651.422 1650.447 1584.065 1595.979 + 1595.979 1607.732 1607.732 1613.426 1613.426 1623.050 + 1623.050 1632.139 1632.139 1648.219 1673.473 1680.599 + 1680.599 1689.496 1689.496 1698.728 1698.728 1703.452 + + 1697.324 1686.698 1686.698 1679.744 1679.744 1674.772 + 1663.595 1663.149 1663.149 1665.385 1665.385 1666.419 + 1666.419 1663.565 1663.565 1657.682 1657.682 1653.098 + 1653.098 1648.762 1648.762 1644.901 1589.069 1598.324 + 1598.324 1605.404 1605.404 1610.872 1610.872 1618.551 + 1618.551 1627.815 1627.815 1648.938 1648.938 1667.764 + 1667.764 1683.332 1683.332 1694.346 1694.346 1699.634 + 1697.324 1686.698 1686.698 1679.744 1679.744 1674.772 + 1674.772 1672.207 1663.149 1665.385 1665.385 1666.419 + 1666.419 1663.565 1663.565 1657.682 1657.682 1653.098 + 1653.098 1648.762 1648.762 1644.901 1644.901 1648.178 + 1598.324 1605.404 1605.404 1610.872 1610.872 1618.551 + 1618.551 1627.815 1627.815 1648.938 1648.938 1667.764 + 1667.764 1683.332 1683.332 1694.346 1694.346 1699.634 + + 1700.554 1690.449 1690.449 1682.966 1682.966 1677.731 + 1677.731 1675.428 1659.863 1660.366 1660.366 1661.811 + 1661.811 1656.890 1656.890 1649.420 1649.420 1647.041 + 1647.041 1645.568 1645.568 1643.143 1643.143 1642.949 + 1601.222 1607.048 1607.048 1613.799 1613.799 1619.713 + 1619.713 1629.246 1629.246 1647.523 1647.523 1664.915 + 1664.915 1680.154 1680.154 1692.160 1692.160 1697.578 + 1700.554 1690.449 1690.449 1682.966 1682.966 1677.731 + 1677.731 1675.428 1659.863 1660.366 1660.366 1661.811 + 1661.811 1656.890 1656.890 1649.420 1649.420 1647.041 + 1647.041 1645.568 1645.568 1643.143 1643.143 1642.949 + 1642.949 1648.459 1607.048 1613.799 1613.799 1619.713 + 1619.713 1629.246 1629.246 1647.523 1647.523 1664.915 + 1664.915 1680.154 1680.154 1692.160 1692.160 1697.578 + + 1703.076 1694.515 1694.515 1687.254 1687.254 1680.449 + 1680.449 1680.340 1658.038 1655.986 1655.986 1653.286 + 1653.286 1645.568 1645.568 1637.469 1637.469 1639.512 + 1639.512 1642.135 1642.135 1641.935 1641.935 1642.398 + 1642.398 1646.174 1611.899 1617.349 1617.349 1624.083 + 1624.083 1636.798 1636.798 1651.863 1651.863 1665.771 + 1665.771 1680.656 1680.656 1692.639 1692.639 1697.846 + 1636.181 1638.101 1638.101 1651.881 1651.881 1666.965 + 1666.965 1676.691 1648.265 1649.952 1649.952 1656.628 + 1656.628 1660.755 1660.755 1658.434 1658.434 1655.137 + 1655.137 1656.053 1656.053 1657.812 1685.861 1694.380 + 1694.380 1693.828 1693.828 1692.188 1692.188 1694.653 + 1694.653 1692.905 1692.905 1698.526 1698.526 1715.101 + 1715.101 1725.223 1725.223 1733.370 1733.370 1738.832 + + 1636.749 1640.872 1640.872 1652.837 1652.837 1665.115 + 1665.115 1673.868 1643.382 1645.545 1645.545 1652.620 + 1652.620 1656.600 1656.600 1657.286 1657.286 1654.423 + 1654.423 1652.450 1652.450 1651.114 1676.501 1683.713 + 1683.713 1685.293 1685.293 1684.415 1684.415 1684.347 + 1684.347 1680.881 1680.881 1684.922 1684.922 1697.903 + 1697.903 1711.879 1711.879 1721.742 1721.742 1727.820 + + 1636.749 1640.872 1640.872 1652.837 1652.837 1665.115 + 1665.115 1673.868 1643.382 1645.545 1645.545 1652.620 + 1652.620 1656.600 1656.600 1657.286 1657.286 1654.423 + 1654.423 1652.450 1652.450 1651.114 1651.114 1651.492 + 1683.713 1685.293 1685.293 1684.415 1684.415 1684.347 + 1684.347 1680.881 1680.881 1684.922 1684.922 1697.903 + 1697.903 1711.879 1711.879 1721.742 1721.742 1727.820 + + 1640.422 1641.319 1641.319 1650.902 1650.902 1663.436 + 1663.436 1670.855 1637.958 1640.717 1640.717 1644.966 + 1644.966 1647.714 1647.714 1649.678 1649.678 1645.299 + 1645.299 1642.501 1642.501 1641.069 1641.069 1641.129 + 1674.293 1676.463 1676.463 1676.839 1676.839 1676.363 + 1676.363 1673.418 1673.418 1675.672 1675.672 1688.088 + 1688.088 1704.724 1704.724 1714.806 1714.806 1720.979 + + 1640.422 1641.319 1641.319 1650.902 1650.902 1663.436 + 1663.436 1670.855 1637.958 1640.717 1640.717 1644.966 + 1644.966 1647.714 1647.714 1649.678 1649.678 1645.299 + 1645.299 1642.501 1642.501 1641.069 1641.069 1641.129 + 1674.293 1676.463 1676.463 1676.839 1676.839 1676.363 + 1676.363 1673.418 1673.418 1675.672 1675.672 1688.088 + 1688.088 1704.724 1704.724 1714.806 1714.806 1720.979 + + 1643.680 1638.672 1638.672 1647.634 1647.634 1659.949 + 1659.949 1667.158 1630.703 1633.019 1633.019 1634.098 + 1634.098 1633.157 1633.157 1634.136 1634.136 1629.278 + 1629.278 1629.362 1629.362 1627.812 1627.812 1629.151 + 1666.835 1668.988 1668.988 1670.160 1670.160 1670.601 + 1670.601 1670.921 1670.921 1671.379 1671.379 1677.956 + 1677.956 1697.746 1697.746 1711.577 1711.577 1717.602 + + 1643.680 1638.672 1638.672 1647.634 1647.634 1659.949 + 1659.949 1667.158 1630.703 1633.019 1633.019 1634.098 + 1634.098 1633.157 1633.157 1634.136 1634.136 1629.278 + 1629.278 1629.362 1629.362 1627.812 1627.812 1629.151 + 1666.835 1668.988 1668.988 1670.160 1670.160 1670.601 + 1670.601 1670.921 1670.921 1671.379 1671.379 1677.956 + 1677.956 1697.746 1697.746 1711.577 1711.577 1717.602 + + 1643.477 1635.225 1635.225 1643.797 1643.797 1655.596 + 1655.596 1662.605 1621.855 1621.978 1621.978 1618.936 + 1618.936 1618.886 1618.886 1619.791 1619.791 1616.785 + 1616.785 1617.005 1617.005 1616.088 1616.088 1618.541 + 1662.071 1664.576 1664.576 1666.829 1666.829 1667.802 + 1667.802 1670.781 1670.781 1668.325 1668.325 1675.885 + 1675.885 1694.977 1694.977 1711.709 1711.709 1717.029 + + 1643.477 1635.225 1635.225 1643.797 1643.797 1655.596 + 1655.596 1662.605 1621.855 1621.978 1621.978 1618.936 + 1618.936 1618.886 1618.886 1619.791 1619.791 1616.785 + 1616.785 1617.005 1617.005 1616.088 1616.088 1618.541 + 1662.071 1664.576 1664.576 1666.829 1666.829 1667.802 + 1667.802 1670.781 1670.781 1668.325 1668.325 1675.885 + 1675.885 1694.977 1694.977 1711.709 1711.709 1717.029 + + 1642.572 1635.309 1635.309 1641.775 1641.775 1651.364 + 1651.364 1658.518 1614.022 1612.602 1612.602 1610.147 + 1610.147 1608.049 1608.049 1609.030 1609.030 1609.510 + 1609.510 1610.459 1610.459 1609.710 1609.710 1611.529 + 1659.559 1662.367 1662.367 1665.176 1665.176 1666.873 + 1666.873 1670.979 1670.979 1670.155 1670.155 1679.084 + 1679.084 1696.263 1696.263 1712.600 1712.600 1717.715 + + 1642.572 1635.309 1635.309 1641.775 1641.775 1651.364 + 1651.364 1658.518 1614.022 1612.602 1612.602 1610.147 + 1610.147 1608.049 1608.049 1609.030 1609.030 1609.510 + 1609.510 1610.459 1610.459 1609.710 1609.710 1611.529 + 1611.529 1616.232 1662.367 1665.176 1665.176 1666.873 + 1666.873 1670.979 1670.979 1670.155 1670.155 1679.084 + 1679.084 1696.263 1696.263 1712.600 1712.600 1717.715 + + 1643.036 1637.351 1637.351 1641.493 1641.493 1648.233 + 1648.233 1654.974 1608.611 1607.965 1607.965 1604.672 + 1604.672 1599.606 1599.606 1603.678 1603.678 1605.950 + 1605.950 1607.108 1607.108 1605.750 1605.750 1606.691 + 1606.691 1611.099 1661.201 1664.822 1664.822 1668.362 + 1668.362 1675.085 1675.085 1676.221 1676.221 1685.245 + 1685.245 1698.440 1698.440 1712.692 1712.692 1718.784 + + 1643.036 1637.351 1637.351 1641.493 1641.493 1648.233 + 1648.233 1654.974 1608.611 1607.965 1607.965 1604.672 + 1604.672 1599.606 1599.606 1603.678 1603.678 1605.950 + 1605.950 1607.108 1607.108 1605.750 1605.750 1606.691 + 1606.691 1611.099 1661.201 1664.822 1664.822 1668.362 + 1668.362 1675.085 1675.085 1676.221 1676.221 1685.245 + 1685.245 1698.440 1698.440 1712.692 1712.692 1718.784 + + 1645.240 1638.497 1638.497 1640.557 1640.557 1646.030 + 1646.030 1651.903 1603.708 1603.352 1603.352 1599.140 + 1599.140 1594.313 1594.313 1598.620 1598.620 1601.847 + 1601.847 1603.546 1603.546 1602.205 1602.205 1603.544 + 1603.544 1608.227 1661.785 1665.354 1665.354 1673.545 + 1673.545 1679.418 1679.418 1682.825 1682.825 1691.655 + 1691.655 1702.736 1702.736 1715.566 1715.566 1721.964 + + 1645.240 1638.497 1638.497 1640.557 1640.557 1646.030 + 1646.030 1651.903 1603.708 1603.352 1603.352 1599.140 + 1599.140 1594.313 1594.313 1598.620 1598.620 1601.847 + 1601.847 1603.546 1603.546 1602.205 1602.205 1603.544 + 1603.544 1608.227 1661.785 1665.354 1665.354 1673.545 + 1673.545 1679.418 1679.418 1682.825 1682.825 1691.655 + 1691.655 1702.736 1702.736 1715.566 1715.566 1721.964 + + 1649.192 1640.147 1640.147 1641.901 1641.901 1645.810 + 1645.810 1649.025 1597.246 1596.769 1596.769 1592.721 + 1592.721 1589.954 1589.954 1593.073 1593.073 1597.650 + 1597.650 1599.967 1599.967 1599.475 1599.475 1602.582 + 1602.582 1608.027 1665.482 1668.997 1668.997 1681.409 + 1681.409 1685.987 1685.987 1691.235 1691.235 1700.090 + 1700.090 1709.733 1709.733 1721.929 1721.929 1726.071 + + 1649.192 1640.147 1640.147 1641.901 1641.901 1645.810 + 1645.810 1649.025 1645.021 1647.772 1596.769 1592.721 + 1592.721 1589.954 1589.954 1593.073 1593.073 1597.650 + 1597.650 1599.967 1599.967 1599.475 1599.475 1602.582 + 1602.582 1608.027 1665.482 1668.997 1668.997 1681.409 + 1681.409 1685.987 1685.987 1691.235 1691.235 1700.090 + 1700.090 1709.733 1709.733 1721.929 1721.929 1726.071 + + 1654.587 1646.707 1646.707 1645.149 1645.149 1646.852 + 1646.852 1649.148 1634.653 1636.149 1585.870 1584.847 + 1584.847 1584.127 1584.127 1586.893 1586.893 1593.442 + 1593.442 1596.762 1596.762 1600.340 1600.340 1605.612 + 1605.612 1610.718 1671.764 1677.315 1677.315 1691.652 + 1691.652 1696.103 1696.103 1699.241 1699.241 1706.732 + 1706.732 1714.138 1714.138 1723.492 1723.492 1729.576 + + 1654.587 1646.707 1646.707 1645.149 1645.149 1646.852 + 1646.852 1649.148 1634.653 1636.149 1585.870 1584.847 + 1584.847 1584.127 1584.127 1586.893 1586.893 1593.442 + 1593.442 1596.762 1596.762 1600.340 1600.340 1605.612 + 1605.612 1610.718 1671.764 1677.315 1677.315 1691.652 + 1691.652 1696.103 1696.103 1699.241 1699.241 1706.732 + 1706.732 1714.138 1714.138 1723.492 1723.492 1729.576 + + 1659.938 1656.371 1656.371 1653.515 1653.515 1652.284 + 1652.284 1652.357 1625.221 1625.568 1575.510 1575.240 + 1575.240 1577.311 1577.311 1583.168 1583.168 1591.182 + 1591.182 1595.968 1595.968 1604.332 1604.332 1608.786 + 1608.786 1614.021 1677.804 1685.408 1685.408 1698.652 + 1698.652 1702.651 1702.651 1704.844 1704.844 1712.584 + 1712.584 1730.381 1730.381 1734.275 1734.275 1738.885 + + 1659.938 1656.371 1656.371 1653.515 1653.515 1652.284 + 1652.284 1652.357 1625.221 1625.568 1625.568 1627.589 + 1575.240 1577.311 1577.311 1583.168 1583.168 1591.182 + 1591.182 1595.968 1595.968 1604.332 1604.332 1608.786 + 1608.786 1614.021 1677.804 1685.408 1685.408 1698.652 + 1698.652 1702.651 1702.651 1704.844 1704.844 1712.584 + 1712.584 1730.381 1730.381 1734.275 1734.275 1738.885 + + 1665.965 1663.912 1663.912 1662.181 1662.181 1659.568 + 1659.568 1657.323 1616.532 1616.316 1616.316 1617.825 + 1566.533 1568.404 1568.404 1578.992 1578.992 1590.547 + 1590.547 1598.422 1598.422 1610.855 1610.855 1613.144 + 1613.144 1618.240 1681.358 1690.538 1690.538 1701.567 + 1701.567 1706.375 1706.375 1709.593 1709.593 1717.051 + 1717.051 1749.016 1749.016 1755.704 1755.704 1754.341 + + 1665.965 1663.912 1663.912 1662.181 1662.181 1659.568 + 1659.568 1657.323 1616.532 1616.316 1616.316 1617.825 + 1566.533 1568.404 1568.404 1578.992 1578.992 1590.547 + 1590.547 1598.422 1598.422 1610.855 1610.855 1613.144 + 1613.144 1618.240 1681.358 1690.538 1690.538 1701.567 + 1701.567 1706.375 1706.375 1709.593 1709.593 1717.051 + 1717.051 1749.016 1749.016 1755.704 1755.704 1754.341 + + 1668.654 1668.327 1668.327 1668.497 1668.497 1665.625 + 1665.625 1662.231 1609.743 1609.834 1609.834 1611.259 + 1561.021 1562.415 1562.415 1573.286 1573.286 1591.658 + 1591.658 1605.171 1605.171 1613.538 1613.538 1616.278 + 1616.278 1621.374 1680.899 1690.317 1690.317 1700.149 + 1700.149 1706.584 1706.584 1711.097 1711.097 1725.804 + 1725.804 1753.553 1753.553 1760.983 1760.983 1760.708 + + 1668.654 1668.327 1668.327 1668.497 1668.497 1665.625 + 1665.625 1662.231 1609.743 1609.834 1609.834 1611.259 + 1611.259 1614.995 1562.415 1573.286 1573.286 1591.658 + 1591.658 1605.171 1605.171 1613.538 1613.538 1616.278 + 1616.278 1621.374 1621.374 1627.168 1690.317 1700.149 + 1700.149 1706.584 1706.584 1711.097 1711.097 1725.804 + 1725.804 1753.553 1753.553 1760.983 1760.983 1760.708 + + 1671.539 1671.548 1671.548 1672.219 1672.219 1669.182 + 1669.182 1665.516 1606.283 1607.619 1607.619 1609.382 + 1609.382 1611.081 1558.774 1567.697 1567.697 1590.271 + 1590.271 1604.472 1604.472 1612.544 1612.544 1617.447 + 1617.447 1623.755 1623.755 1630.075 1685.001 1695.005 + 1695.005 1705.085 1705.085 1711.363 1711.363 1739.973 + 1739.973 1757.053 1757.053 1758.314 1758.314 1758.049 + + 1671.539 1671.548 1671.548 1672.219 1672.219 1669.182 + 1669.182 1665.516 1606.283 1607.619 1607.619 1609.382 + 1609.382 1611.081 1558.774 1567.697 1567.697 1590.271 + 1590.271 1604.472 1604.472 1612.544 1612.544 1617.447 + 1617.447 1623.755 1623.755 1630.075 1685.001 1695.005 + 1695.005 1705.085 1705.085 1711.363 1711.363 1739.973 + 1739.973 1757.053 1757.053 1758.314 1758.314 1758.049 + + 1673.084 1670.497 1670.497 1671.518 1671.518 1669.965 + 1669.965 1667.145 1604.683 1606.956 1606.956 1608.893 + 1608.893 1609.078 1555.773 1560.492 1560.492 1575.817 + 1575.817 1593.215 1593.215 1607.986 1607.986 1617.340 + 1617.340 1625.115 1625.115 1632.303 1678.433 1687.367 + 1687.367 1701.265 1701.265 1713.338 1713.338 1733.081 + 1733.081 1747.658 1747.658 1751.035 1751.035 1751.280 + + 1673.084 1670.497 1670.497 1671.518 1671.518 1669.965 + 1669.965 1667.145 1604.683 1606.956 1606.956 1608.893 + 1608.893 1609.078 1609.078 1615.647 1560.492 1575.817 + 1575.817 1593.215 1593.215 1607.986 1607.986 1617.340 + 1617.340 1625.115 1625.115 1632.303 1678.433 1687.367 + 1687.367 1701.265 1701.265 1713.338 1713.338 1733.081 + 1733.081 1747.658 1747.658 1751.035 1751.035 1751.280 + + 1671.517 1669.043 1669.043 1671.153 1671.153 1669.996 + 1669.996 1667.611 1602.700 1604.727 1604.727 1607.313 + 1607.313 1609.561 1609.561 1616.471 1558.230 1568.609 + 1568.609 1585.446 1585.446 1600.769 1600.769 1616.274 + 1616.274 1625.554 1625.554 1633.279 1674.061 1683.005 + 1683.005 1699.964 1699.964 1714.383 1714.383 1727.987 + 1727.987 1737.468 1737.468 1741.867 1741.867 1742.741 + + 1671.517 1669.043 1669.043 1671.153 1671.153 1669.996 + 1669.996 1667.611 1602.700 1604.727 1604.727 1607.313 + 1607.313 1609.561 1609.561 1616.471 1558.230 1568.609 + 1568.609 1585.446 1585.446 1600.769 1600.769 1616.274 + 1616.274 1625.554 1625.554 1633.279 1674.061 1683.005 + 1683.005 1699.964 1699.964 1714.383 1714.383 1727.987 + 1727.987 1737.468 1737.468 1741.867 1741.867 1742.741 + + 1668.156 1667.630 1667.630 1670.104 1670.104 1668.430 + 1668.430 1666.773 1602.174 1605.334 1605.334 1610.869 + 1610.869 1616.809 1616.809 1619.835 1560.974 1569.041 + 1569.041 1582.151 1582.151 1595.088 1595.088 1614.643 + 1614.643 1625.122 1625.122 1632.655 1671.904 1680.212 + 1680.212 1694.953 1694.953 1709.292 1709.292 1721.019 + 1721.019 1728.263 1728.263 1732.397 1732.397 1733.355 + + 1668.156 1667.630 1667.630 1670.104 1670.104 1668.430 + 1668.430 1666.773 1666.773 1665.960 1605.334 1610.869 + 1610.869 1616.809 1616.809 1619.835 1560.974 1569.041 + 1569.041 1582.151 1582.151 1595.088 1595.088 1614.643 + 1614.643 1625.122 1625.122 1632.655 1671.904 1680.212 + 1680.212 1694.953 1694.953 1709.292 1709.292 1721.019 + 1721.019 1728.263 1728.263 1732.397 1732.397 1733.355 + + 1669.625 1667.095 1667.095 1669.579 1669.579 1667.431 + 1667.431 1667.042 1667.042 1667.128 1607.798 1613.580 + 1613.580 1618.024 1618.024 1622.092 1565.009 1572.431 + 1572.431 1581.963 1581.963 1590.513 1590.513 1611.446 + 1611.446 1626.447 1626.447 1630.607 1670.758 1678.543 + 1678.543 1689.182 1689.182 1701.847 1701.847 1712.377 + 1712.377 1718.867 1718.867 1722.174 1722.174 1722.852 + + 1669.625 1667.095 1667.095 1669.579 1669.579 1667.431 + 1667.431 1667.042 1667.042 1667.128 1667.128 1666.181 + 1613.580 1618.024 1618.024 1622.092 1622.092 1631.250 + 1572.431 1581.963 1581.963 1590.513 1590.513 1611.446 + 1611.446 1626.447 1626.447 1630.607 1630.607 1636.502 + 1678.543 1689.182 1689.182 1701.847 1701.847 1712.377 + 1712.377 1718.867 1718.867 1722.174 1722.174 1722.852 + + 1672.564 1668.303 1668.303 1668.913 1668.913 1668.125 + 1668.125 1668.430 1668.430 1667.883 1667.883 1667.108 + 1613.930 1618.322 1618.322 1624.004 1624.004 1631.623 + 1573.547 1579.365 1579.365 1585.302 1585.302 1605.701 + 1605.701 1623.016 1623.016 1628.223 1628.223 1632.497 + 1677.177 1686.385 1686.385 1696.909 1696.909 1704.675 + 1704.675 1708.551 1708.551 1711.862 1711.862 1713.611 + + 1682.717 1675.950 1668.303 1668.913 1668.913 1668.125 + 1668.125 1668.430 1668.430 1667.883 1667.883 1667.108 + 1667.108 1665.510 1618.322 1624.004 1624.004 1631.623 + 1573.547 1579.365 1579.365 1585.302 1585.302 1605.701 + 1605.701 1623.016 1623.016 1628.223 1628.223 1632.497 + 1632.497 1639.686 1686.385 1696.909 1696.909 1704.675 + 1704.675 1708.551 1708.551 1711.862 1711.862 1713.611 + + 1687.104 1677.835 1669.218 1667.169 1667.169 1666.407 + 1666.407 1667.211 1667.211 1667.268 1667.268 1667.777 + 1667.777 1666.500 1619.112 1624.639 1624.639 1631.528 + 1572.957 1576.430 1576.430 1581.041 1581.041 1596.180 + 1596.180 1613.791 1613.791 1621.459 1621.459 1627.925 + 1627.925 1636.713 1682.115 1691.481 1691.481 1695.585 + 1695.585 1697.028 1697.028 1703.329 1703.329 1707.591 + + 1687.104 1677.835 1677.835 1673.654 1667.169 1666.407 + 1666.407 1667.211 1667.211 1667.268 1667.268 1667.777 + 1667.777 1666.500 1666.500 1662.707 1624.639 1631.528 + 1631.528 1640.402 1576.430 1581.041 1581.041 1596.180 + 1596.180 1613.791 1613.791 1621.459 1621.459 1627.925 + 1627.925 1636.713 1636.713 1648.855 1691.481 1695.585 + 1695.585 1697.028 1697.028 1703.329 1703.329 1707.591 + + 1692.429 1681.396 1681.396 1676.335 1666.609 1665.190 + 1665.190 1667.474 1667.474 1667.611 1667.611 1667.789 + 1667.789 1666.274 1666.274 1661.527 1625.180 1631.419 + 1631.419 1638.617 1577.489 1584.065 1584.065 1595.979 + 1595.979 1607.732 1607.732 1613.426 1613.426 1623.050 + 1623.050 1632.139 1632.139 1648.219 1673.473 1680.599 + 1680.599 1689.496 1689.496 1698.728 1698.728 1703.452 + + 1692.429 1681.396 1681.396 1676.335 1676.335 1672.292 + 1665.190 1667.474 1667.474 1667.611 1667.611 1667.789 + 1667.789 1666.274 1666.274 1661.527 1661.527 1656.166 + 1656.166 1651.422 1651.422 1650.447 1584.065 1595.979 + 1595.979 1607.732 1607.732 1613.426 1613.426 1623.050 + 1623.050 1632.139 1632.139 1648.219 1673.473 1680.599 + 1680.599 1689.496 1689.496 1698.728 1698.728 1703.452 + + 1697.324 1686.698 1686.698 1679.744 1679.744 1674.772 + 1663.595 1663.149 1663.149 1665.385 1665.385 1666.419 + 1666.419 1663.565 1663.565 1657.682 1657.682 1653.098 + 1653.098 1648.762 1648.762 1644.901 1589.069 1598.324 + 1598.324 1605.404 1605.404 1610.872 1610.872 1618.551 + 1618.551 1627.815 1627.815 1648.938 1648.938 1667.764 + 1667.764 1683.332 1683.332 1694.346 1694.346 1699.634 + + 1697.324 1686.698 1686.698 1679.744 1679.744 1674.772 + 1674.772 1672.207 1663.149 1665.385 1665.385 1666.419 + 1666.419 1663.565 1663.565 1657.682 1657.682 1653.098 + 1653.098 1648.762 1648.762 1644.901 1644.901 1648.178 + 1598.324 1605.404 1605.404 1610.872 1610.872 1618.551 + 1618.551 1627.815 1627.815 1648.938 1648.938 1667.764 + 1667.764 1683.332 1683.332 1694.346 1694.346 1699.634 + + 1700.554 1690.449 1690.449 1682.966 1682.966 1677.731 + 1677.731 1675.428 1659.863 1660.366 1660.366 1661.811 + 1661.811 1656.890 1656.890 1649.420 1649.420 1647.041 + 1647.041 1645.568 1645.568 1643.143 1643.143 1642.949 + 1601.222 1607.048 1607.048 1613.799 1613.799 1619.713 + 1619.713 1629.246 1629.246 1647.523 1647.523 1664.915 + 1664.915 1680.154 1680.154 1692.160 1692.160 1697.578 + + 1700.554 1690.449 1690.449 1682.966 1682.966 1677.731 + 1677.731 1675.428 1659.863 1660.366 1660.366 1661.811 + 1661.811 1656.890 1656.890 1649.420 1649.420 1647.041 + 1647.041 1645.568 1645.568 1643.143 1643.143 1642.949 + 1642.949 1648.459 1607.048 1613.799 1613.799 1619.713 + 1619.713 1629.246 1629.246 1647.523 1647.523 1664.915 + 1664.915 1680.154 1680.154 1692.160 1692.160 1697.578 + + 1703.076 1694.515 1694.515 1687.254 1687.254 1680.449 + 1680.449 1680.340 1658.038 1655.986 1655.986 1653.286 + 1653.286 1645.568 1645.568 1637.469 1637.469 1639.512 + 1639.512 1642.135 1642.135 1641.935 1641.935 1642.398 + 1642.398 1646.174 1611.899 1617.349 1617.349 1624.083 + 1624.083 1636.798 1636.798 1651.863 1651.863 1665.771 + 1665.771 1680.656 1680.656 1692.639 1692.639 1697.846 + + 1640.570 1642.792 1642.792 1656.770 1656.770 1671.624 + 1671.624 1681.318 1652.552 1654.444 1654.444 1661.234 + 1661.234 1665.295 1665.295 1662.851 1662.851 1659.641 + 1659.641 1660.681 1660.681 1662.533 1689.617 1698.250 + 1698.250 1698.196 1698.196 1697.248 1697.248 1699.520 + 1699.520 1697.622 1697.622 1703.799 1703.799 1719.751 + 1719.751 1729.563 1729.563 1737.783 1737.783 1742.935 + + 1641.321 1645.767 1645.767 1657.619 1657.619 1669.774 + 1669.774 1678.511 1647.799 1650.095 1650.095 1657.232 + 1657.232 1661.156 1661.156 1661.769 1661.769 1658.908 + 1658.908 1656.979 1656.979 1655.719 1680.662 1688.242 + 1688.242 1689.954 1689.954 1689.186 1689.186 1689.003 + 1689.003 1685.499 1685.499 1690.087 1690.087 1702.997 + 1702.997 1716.513 1716.513 1726.235 1726.235 1731.919 + 1641.321 1645.767 1645.767 1657.619 1657.619 1669.774 + 1669.774 1678.511 1647.799 1650.095 1650.095 1657.232 + 1657.232 1661.156 1661.156 1661.769 1661.769 1658.908 + 1658.908 1656.979 1656.979 1655.719 1655.719 1656.280 + 1688.242 1689.954 1689.954 1689.186 1689.186 1689.003 + 1689.003 1685.499 1685.499 1690.087 1690.087 1702.997 + 1702.997 1716.513 1716.513 1726.235 1726.235 1731.919 + + 1644.843 1645.859 1645.859 1655.627 1655.627 1668.026 + 1668.026 1675.612 1642.360 1645.263 1645.263 1649.539 + 1649.539 1652.289 1652.289 1654.275 1654.275 1649.769 + 1649.769 1647.146 1647.146 1645.728 1645.728 1645.892 + 1678.903 1681.032 1681.032 1681.646 1681.646 1680.977 + 1680.977 1678.134 1678.134 1680.770 1680.770 1693.441 + 1693.441 1709.451 1709.451 1719.281 1719.281 1725.008 + 1644.843 1645.859 1645.859 1655.627 1655.627 1668.026 + 1668.026 1675.612 1642.360 1645.263 1645.263 1649.539 + 1649.539 1652.289 1652.289 1654.275 1654.275 1649.769 + 1649.769 1647.146 1647.146 1645.728 1645.728 1645.892 + 1678.903 1681.032 1681.032 1681.646 1681.646 1680.977 + 1680.977 1678.134 1678.134 1680.770 1680.770 1693.441 + 1693.441 1709.451 1709.451 1719.281 1719.281 1725.008 + + 1647.939 1642.898 1642.898 1652.272 1652.272 1664.461 + 1664.461 1671.938 1635.055 1637.587 1637.587 1638.634 + 1638.634 1637.880 1637.880 1638.798 1638.798 1633.912 + 1633.912 1634.203 1634.203 1632.305 1632.305 1633.765 + 1671.532 1673.799 1673.799 1674.928 1674.928 1675.342 + 1675.342 1675.671 1675.671 1676.365 1676.365 1683.171 + 1683.171 1702.770 1702.770 1715.904 1715.904 1721.458 + 1647.939 1642.898 1642.898 1652.272 1652.272 1664.461 + 1664.461 1671.938 1635.055 1637.587 1637.587 1638.634 + 1638.634 1637.880 1637.880 1638.798 1638.798 1633.912 + 1633.912 1634.203 1634.203 1632.305 1632.305 1633.765 + 1671.532 1673.799 1673.799 1674.928 1674.928 1675.342 + 1675.342 1675.671 1675.671 1676.365 1676.365 1683.171 + 1683.171 1702.770 1702.770 1715.904 1715.904 1721.458 + + 1647.406 1639.446 1639.446 1648.320 1648.320 1660.046 + 1660.046 1667.368 1626.214 1626.561 1626.561 1623.461 + 1623.461 1623.858 1623.858 1624.612 1624.612 1621.669 + 1621.669 1621.984 1621.984 1620.690 1620.690 1623.214 + 1666.788 1669.318 1669.318 1671.609 1671.609 1672.692 + 1672.692 1675.633 1675.633 1673.272 1673.272 1681.268 + 1681.268 1699.916 1699.916 1715.727 1715.727 1720.690 + 1647.406 1639.446 1639.446 1648.320 1648.320 1660.046 + 1660.046 1667.368 1626.214 1626.561 1626.561 1623.461 + 1623.461 1623.858 1623.858 1624.612 1624.612 1621.669 + 1621.669 1621.984 1621.984 1620.690 1620.690 1623.214 + 1666.788 1669.318 1669.318 1671.609 1671.609 1672.692 + 1672.692 1675.633 1675.633 1673.272 1673.272 1681.268 + 1681.268 1699.916 1699.916 1715.727 1715.727 1720.690 + + 1646.604 1639.619 1639.619 1646.165 1646.165 1655.795 + 1655.795 1663.263 1618.456 1617.161 1617.161 1614.681 + 1614.681 1613.039 1613.039 1614.013 1614.013 1614.672 + 1614.672 1615.530 1615.530 1614.640 1614.640 1616.520 + 1664.361 1667.175 1667.175 1669.980 1669.980 1671.772 + 1671.772 1675.807 1675.807 1674.970 1674.970 1684.543 + 1684.543 1701.231 1701.231 1716.588 1716.588 1721.346 + 1646.604 1639.619 1639.619 1646.165 1646.165 1655.795 + 1655.795 1663.263 1618.456 1617.161 1617.161 1614.681 + 1614.681 1613.039 1613.039 1614.013 1614.013 1614.672 + 1614.672 1615.530 1615.530 1614.640 1614.640 1616.520 + 1616.520 1621.232 1667.175 1669.980 1669.980 1671.772 + 1671.772 1675.807 1675.807 1674.970 1674.970 1684.543 + 1684.543 1701.231 1701.231 1716.588 1716.588 1721.346 + + 1647.321 1641.665 1641.665 1645.736 1645.736 1652.540 + 1652.540 1659.605 1613.104 1612.609 1612.609 1609.127 + 1609.127 1604.672 1604.672 1608.927 1608.927 1611.303 + 1611.303 1612.368 1612.368 1610.790 1610.790 1611.828 + 1611.828 1616.201 1666.264 1669.759 1669.759 1673.347 + 1673.347 1680.063 1680.063 1681.125 1681.125 1690.588 + 1690.588 1703.480 1703.480 1716.976 1716.976 1722.520 + 1647.321 1641.665 1641.665 1645.736 1645.736 1652.540 + 1652.540 1659.605 1613.104 1612.609 1612.609 1609.127 + 1609.127 1604.672 1604.672 1608.927 1608.927 1611.303 + 1611.303 1612.368 1612.368 1610.790 1610.790 1611.828 + 1611.828 1616.201 1666.264 1669.759 1669.759 1673.347 + 1673.347 1680.063 1680.063 1681.125 1681.125 1690.588 + 1690.588 1703.480 1703.480 1716.976 1716.976 1722.520 + + 1649.779 1642.957 1642.957 1644.575 1644.575 1650.068 + 1650.068 1656.322 1608.158 1608.050 1608.050 1603.579 + 1603.579 1599.450 1599.450 1603.981 1603.981 1607.281 + 1607.281 1608.804 1608.804 1607.234 1607.234 1608.658 + 1608.658 1613.375 1667.040 1670.488 1670.488 1678.498 + 1678.498 1684.336 1684.336 1687.774 1687.774 1696.920 + 1696.920 1707.805 1707.805 1720.015 1720.015 1725.736 + 1649.779 1642.957 1642.957 1644.575 1644.575 1650.068 + 1650.068 1656.322 1608.158 1608.050 1608.050 1603.579 + 1603.579 1599.450 1599.450 1603.981 1603.981 1607.281 + 1607.281 1608.804 1608.804 1607.234 1607.234 1608.658 + 1608.658 1613.375 1667.040 1670.488 1670.488 1678.498 + 1678.498 1684.336 1684.336 1687.774 1687.774 1696.920 + 1696.920 1707.805 1707.805 1720.015 1720.015 1725.736 + + 1653.846 1645.243 1645.243 1645.674 1645.674 1649.808 + 1649.808 1653.423 1601.301 1601.027 1601.027 1597.378 + 1597.378 1594.991 1594.991 1598.423 1598.423 1603.088 + 1603.088 1605.091 1605.091 1604.501 1604.501 1607.690 + 1607.690 1613.220 1670.609 1674.064 1674.064 1686.446 + 1686.446 1690.795 1690.795 1696.166 1696.166 1705.324 + 1705.324 1714.678 1714.678 1726.099 1726.099 1729.970 + 1653.846 1645.243 1645.243 1645.674 1645.674 1649.808 + 1649.808 1653.423 1649.797 1653.728 1601.027 1597.378 + 1597.378 1594.991 1594.991 1598.423 1598.423 1603.088 + 1603.088 1605.091 1605.091 1604.501 1604.501 1607.690 + 1607.690 1613.220 1670.609 1674.064 1674.064 1686.446 + 1686.446 1690.795 1690.795 1696.166 1696.166 1705.324 + 1705.324 1714.678 1714.678 1726.099 1726.099 1729.970 + + 1659.292 1652.084 1652.084 1649.372 1649.372 1651.013 + 1651.013 1653.540 1639.806 1642.014 1590.407 1589.589 + 1589.589 1589.245 1589.245 1592.236 1592.236 1598.881 + 1598.881 1601.896 1601.896 1605.485 1605.485 1610.692 + 1610.692 1615.875 1676.907 1682.387 1682.387 1696.623 + 1696.623 1700.926 1700.926 1704.094 1704.094 1711.913 + 1711.913 1719.289 1719.289 1728.411 1728.411 1733.864 + 1659.292 1652.084 1652.084 1649.372 1649.372 1651.013 + 1651.013 1653.540 1639.806 1642.014 1590.407 1589.589 + 1589.589 1589.245 1589.245 1592.236 1592.236 1598.881 + 1598.881 1601.896 1601.896 1605.485 1605.485 1610.692 + 1610.692 1615.875 1676.907 1682.387 1682.387 1696.623 + 1696.623 1700.926 1700.926 1704.094 1704.094 1711.913 + 1711.913 1719.289 1719.289 1728.411 1728.411 1733.864 + + 1664.596 1661.257 1661.257 1658.251 1658.251 1656.713 + 1656.713 1656.827 1630.144 1630.764 1580.212 1580.110 + 1580.110 1582.466 1582.466 1588.267 1588.267 1596.589 + 1596.589 1601.040 1601.040 1609.571 1609.571 1613.690 + 1613.690 1619.060 1683.414 1691.217 1691.217 1703.582 + 1703.582 1707.514 1707.514 1709.795 1709.795 1717.860 + 1717.860 1734.440 1734.440 1738.838 1738.838 1743.084 + 1664.596 1661.257 1661.257 1658.251 1658.251 1656.713 + 1656.713 1656.827 1630.144 1630.764 1630.764 1633.212 + 1580.110 1582.466 1582.466 1588.267 1588.267 1596.589 + 1596.589 1601.040 1601.040 1609.571 1609.571 1613.690 + 1613.690 1619.060 1683.414 1691.217 1691.217 1703.582 + 1703.582 1707.514 1707.514 1709.795 1709.795 1717.860 + 1717.860 1734.440 1734.440 1738.838 1738.838 1743.084 + + 1670.596 1668.467 1668.467 1666.988 1666.988 1664.351 + 1664.351 1662.054 1620.901 1620.715 1620.715 1622.424 + 1571.298 1573.368 1573.368 1584.288 1584.288 1595.808 + 1595.808 1603.744 1603.744 1616.001 1616.001 1617.946 + 1617.946 1623.158 1686.992 1696.256 1696.256 1706.676 + 1706.676 1711.303 1711.303 1714.620 1714.620 1722.550 + 1722.550 1752.949 1752.949 1759.037 1759.037 1757.998 + 1670.596 1668.467 1668.467 1666.988 1666.988 1664.351 + 1664.351 1662.054 1620.901 1620.715 1620.715 1622.424 + 1571.298 1573.368 1573.368 1584.288 1584.288 1595.808 + 1595.808 1603.744 1603.744 1616.001 1616.001 1617.946 + 1617.946 1623.158 1686.992 1696.256 1696.256 1706.676 + 1706.676 1711.303 1711.303 1714.620 1714.620 1722.550 + 1722.550 1752.949 1752.949 1759.037 1759.037 1757.998 + + 1673.239 1672.522 1672.522 1673.252 1673.252 1670.635 + 1670.635 1667.238 1613.638 1613.726 1613.726 1615.301 + 1565.737 1567.205 1567.205 1578.476 1578.476 1596.922 + 1596.922 1610.315 1610.315 1618.482 1618.482 1621.186 + 1621.186 1626.363 1686.393 1695.524 1695.524 1705.227 + 1705.227 1711.616 1711.616 1716.146 1716.146 1731.303 + 1731.303 1758.544 1758.544 1764.833 1764.833 1764.509 + 1673.239 1672.522 1672.522 1673.252 1673.252 1670.635 + 1670.635 1667.238 1613.638 1613.726 1613.726 1615.301 + 1615.301 1619.441 1567.205 1578.476 1578.476 1596.922 + 1596.922 1610.315 1610.315 1618.482 1618.482 1621.186 + 1621.186 1626.363 1626.363 1632.038 1695.524 1705.227 + 1705.227 1711.616 1711.616 1716.146 1716.146 1731.303 + 1731.303 1758.544 1758.544 1764.833 1764.833 1764.509 + + 1676.238 1675.713 1675.713 1676.929 1676.929 1674.262 + 1674.262 1670.643 1610.096 1611.582 1611.582 1613.611 + 1613.611 1615.491 1563.516 1572.776 1572.776 1595.949 + 1595.949 1609.719 1609.719 1617.525 1617.525 1622.370 + 1622.370 1628.645 1628.645 1634.951 1690.296 1700.217 + 1700.217 1710.223 1710.223 1716.359 1716.359 1744.385 + 1744.385 1761.193 1761.193 1762.365 1762.365 1762.111 + 1676.238 1675.713 1675.713 1676.929 1676.929 1674.262 + 1674.262 1670.643 1610.096 1611.582 1611.582 1613.611 + 1613.611 1615.491 1563.516 1572.776 1572.776 1595.949 + 1595.949 1609.719 1609.719 1617.525 1617.525 1622.370 + 1622.370 1628.645 1628.645 1634.951 1690.296 1700.217 + 1700.217 1710.223 1710.223 1716.359 1716.359 1744.385 + 1744.385 1761.193 1761.193 1762.365 1762.365 1762.111 + + 1677.893 1674.811 1674.811 1676.002 1676.002 1674.856 + 1674.856 1672.218 1608.801 1611.406 1611.406 1613.813 + 1613.813 1613.715 1560.532 1565.391 1565.391 1581.160 + 1581.160 1598.704 1598.704 1613.245 1613.245 1622.373 + 1622.373 1630.082 1630.082 1637.250 1683.564 1692.574 + 1692.574 1706.568 1706.568 1718.562 1718.562 1738.004 + 1738.004 1751.629 1751.629 1755.072 1755.072 1755.362 + 1677.893 1674.811 1674.811 1676.002 1676.002 1674.856 + 1674.856 1672.218 1608.801 1611.406 1611.406 1613.813 + 1613.813 1613.715 1613.715 1620.302 1565.391 1581.160 + 1581.160 1598.704 1598.704 1613.245 1613.245 1622.373 + 1622.373 1630.082 1630.082 1637.250 1683.564 1692.574 + 1692.574 1706.568 1706.568 1718.562 1718.562 1738.004 + 1738.004 1751.629 1751.629 1755.072 1755.072 1755.362 + + 1676.469 1673.260 1673.260 1675.580 1675.580 1674.786 + 1674.786 1672.577 1607.343 1609.849 1609.849 1612.997 + 1612.997 1614.479 1614.479 1620.721 1563.066 1573.691 + 1573.691 1590.709 1590.709 1606.206 1606.206 1621.485 + 1621.485 1630.562 1630.562 1638.192 1679.198 1688.297 + 1688.297 1705.323 1705.323 1719.074 1719.074 1732.118 + 1732.118 1741.476 1741.476 1745.944 1745.944 1746.833 + 1676.469 1673.260 1673.260 1675.580 1675.580 1674.786 + 1674.786 1672.577 1607.343 1609.849 1609.849 1612.997 + 1612.997 1614.479 1614.479 1620.721 1563.066 1573.691 + 1573.691 1590.709 1590.709 1606.206 1606.206 1621.485 + 1621.485 1630.562 1630.562 1638.192 1679.198 1688.297 + 1688.297 1705.323 1705.323 1719.074 1719.074 1732.118 + 1732.118 1741.476 1741.476 1745.944 1745.944 1746.833 + + 1673.037 1671.726 1671.726 1674.678 1674.678 1673.168 + 1673.168 1671.533 1607.418 1611.174 1611.174 1617.591 + 1617.591 1623.096 1623.096 1623.665 1565.897 1574.067 + 1574.067 1587.216 1587.216 1600.631 1600.631 1620.027 + 1620.027 1630.117 1630.117 1637.312 1677.011 1685.400 + 1685.400 1700.334 1700.334 1713.675 1713.675 1724.792 + 1724.792 1732.200 1732.200 1736.505 1736.505 1737.509 + 1673.037 1671.726 1671.726 1674.678 1674.678 1673.168 + 1673.168 1671.533 1671.533 1670.897 1611.174 1617.591 + 1617.591 1623.096 1623.096 1623.665 1565.897 1574.067 + 1574.067 1587.216 1587.216 1600.631 1600.631 1620.027 + 1620.027 1630.117 1630.117 1637.312 1677.011 1685.400 + 1685.400 1700.334 1700.334 1713.675 1713.675 1724.792 + 1724.792 1732.200 1732.200 1736.505 1736.505 1737.509 + + 1674.377 1671.314 1671.314 1674.215 1674.215 1672.145 + 1672.145 1671.651 1671.651 1671.978 1613.949 1620.185 + 1620.185 1623.607 1623.607 1626.159 1570.074 1577.526 + 1577.526 1586.867 1586.867 1595.959 1595.959 1616.957 + 1616.957 1631.537 1631.537 1635.441 1675.678 1683.568 + 1683.568 1694.290 1694.290 1706.578 1706.578 1716.477 + 1716.477 1722.812 1722.812 1726.350 1726.350 1727.160 + 1674.377 1671.314 1671.314 1674.215 1674.215 1672.145 + 1672.145 1671.651 1671.651 1671.978 1671.978 1671.111 + 1620.185 1623.607 1623.607 1626.159 1626.159 1635.774 + 1577.526 1586.867 1586.867 1595.959 1595.959 1616.957 + 1616.957 1631.537 1631.537 1635.441 1635.441 1641.398 + 1683.568 1694.290 1694.290 1706.578 1706.578 1716.477 + 1716.477 1722.812 1722.812 1726.350 1726.350 1727.160 + + 1677.169 1672.844 1672.844 1673.441 1673.441 1672.719 + 1672.719 1672.925 1672.925 1672.553 1672.553 1671.850 + 1619.820 1623.582 1623.582 1628.846 1628.846 1636.312 + 1578.551 1584.217 1584.217 1590.581 1590.581 1611.334 + 1611.334 1628.094 1628.094 1633.126 1633.126 1637.271 + 1681.545 1690.784 1690.784 1701.141 1701.141 1708.370 + 1708.370 1712.340 1712.340 1716.003 1716.003 1717.803 + 1687.302 1680.760 1672.844 1673.441 1673.441 1672.719 + 1672.719 1672.925 1672.925 1672.553 1672.553 1671.850 + 1671.850 1670.152 1623.582 1628.846 1628.846 1636.312 + 1578.551 1584.217 1584.217 1590.581 1590.581 1611.334 + 1611.334 1628.094 1628.094 1633.126 1633.126 1637.271 + 1637.271 1644.481 1690.784 1701.141 1701.141 1708.370 + 1708.370 1712.340 1712.340 1716.003 1716.003 1717.803 + + 1691.543 1682.499 1673.786 1671.766 1671.766 1670.966 + 1670.966 1671.740 1671.740 1671.877 1671.877 1672.428 + 1672.428 1671.038 1624.355 1629.578 1629.578 1636.311 + 1577.917 1581.316 1581.316 1585.894 1585.894 1601.741 + 1601.741 1618.869 1618.869 1626.469 1626.469 1632.649 + 1632.649 1641.427 1685.081 1693.918 1693.918 1698.341 + 1698.341 1700.529 1700.529 1707.251 1707.251 1711.365 + 1691.543 1682.499 1682.499 1678.525 1671.766 1670.966 + 1670.966 1671.740 1671.740 1671.877 1671.877 1672.428 + 1672.428 1671.038 1671.038 1666.836 1629.578 1636.311 + 1636.311 1645.177 1581.316 1585.894 1585.894 1601.741 + 1601.741 1618.869 1618.869 1626.469 1626.469 1632.649 + 1632.649 1641.427 1641.427 1653.569 1693.918 1698.341 + 1698.341 1700.529 1700.529 1707.251 1707.251 1711.365 + + 1696.678 1685.824 1685.824 1680.973 1671.215 1669.798 + 1669.798 1671.948 1671.948 1672.228 1672.228 1672.344 + 1672.344 1670.684 1670.684 1665.624 1630.151 1636.224 + 1636.224 1643.341 1582.455 1589.151 1589.151 1601.201 + 1601.201 1612.691 1612.691 1618.408 1618.408 1628.075 + 1628.075 1637.060 1637.060 1652.958 1676.397 1683.772 + 1683.772 1693.093 1693.093 1702.606 1702.606 1707.172 + 1696.678 1685.824 1685.824 1680.973 1680.973 1677.281 + 1669.798 1671.948 1671.948 1672.228 1672.228 1672.344 + 1672.344 1670.684 1670.684 1665.624 1665.624 1659.774 + 1659.774 1654.997 1654.997 1654.565 1589.151 1601.201 + 1601.201 1612.691 1612.691 1618.408 1618.408 1628.075 + 1628.075 1637.060 1637.060 1652.958 1676.397 1683.772 + 1683.772 1693.093 1693.093 1702.606 1702.606 1707.172 + + 1701.558 1691.041 1691.041 1684.244 1684.244 1679.536 + 1667.958 1667.457 1667.457 1669.884 1669.884 1671.008 + 1671.008 1668.035 1668.035 1661.922 1661.922 1656.676 + 1656.676 1652.559 1652.559 1649.172 1594.331 1603.347 + 1603.347 1610.352 1610.352 1615.895 1615.895 1623.494 + 1623.494 1632.994 1632.994 1653.322 1653.322 1671.579 + 1671.579 1687.100 1687.100 1698.307 1698.307 1703.415 + 1701.558 1691.041 1691.041 1684.244 1684.244 1679.536 + 1679.536 1677.321 1667.457 1669.884 1669.884 1671.008 + 1671.008 1668.035 1668.035 1661.922 1661.922 1656.676 + 1656.676 1652.559 1652.559 1649.172 1649.172 1652.713 + 1603.347 1610.352 1610.352 1615.895 1615.895 1623.494 + 1623.494 1632.994 1632.994 1653.322 1653.322 1671.579 + 1671.579 1687.100 1687.100 1698.307 1698.307 1703.415 + + 1704.776 1694.750 1694.750 1687.395 1687.395 1682.315 + 1682.315 1680.250 1664.187 1664.950 1664.950 1666.232 + 1666.232 1661.271 1661.271 1653.592 1653.592 1650.966 + 1650.966 1649.890 1649.890 1647.812 1647.812 1647.684 + 1606.374 1612.085 1612.085 1618.814 1618.814 1624.618 + 1624.618 1634.343 1634.343 1651.923 1651.923 1668.607 + 1668.607 1684.085 1684.085 1696.214 1696.214 1701.448 + 1704.776 1694.750 1694.750 1687.395 1687.395 1682.315 + 1682.315 1680.250 1664.187 1664.950 1664.950 1666.232 + 1666.232 1661.271 1661.271 1653.592 1653.592 1650.966 + 1650.966 1649.890 1649.890 1647.812 1647.812 1647.684 + 1647.684 1653.275 1612.085 1618.814 1618.814 1624.618 + 1624.618 1634.343 1634.343 1651.923 1651.923 1668.607 + 1668.607 1684.085 1684.085 1696.214 1696.214 1701.448 + + 1707.412 1698.886 1698.886 1691.603 1691.603 1684.959 + 1684.959 1684.963 1662.529 1660.551 1660.551 1657.794 + 1657.794 1650.070 1650.070 1641.859 1641.859 1643.943 + 1643.943 1646.759 1646.759 1646.765 1646.765 1647.259 + 1647.259 1651.121 1616.987 1622.373 1622.373 1629.156 + 1629.156 1641.827 1641.827 1656.614 1656.614 1669.880 + 1669.880 1684.775 1684.775 1696.803 1696.803 1701.828 + 1640.570 1642.792 1642.792 1656.770 1656.770 1671.624 + 1671.624 1681.318 1652.552 1654.444 1654.444 1661.234 + 1661.234 1665.295 1665.295 1662.851 1662.851 1659.641 + 1659.641 1660.681 1660.681 1662.533 1689.617 1698.250 + 1698.250 1698.196 1698.196 1697.248 1697.248 1699.520 + 1699.520 1697.622 1697.622 1703.799 1703.799 1719.751 + 1719.751 1729.563 1729.563 1737.783 1737.783 1742.935 + + 1641.321 1645.767 1645.767 1657.619 1657.619 1669.774 + 1669.774 1678.511 1647.799 1650.095 1650.095 1657.232 + 1657.232 1661.156 1661.156 1661.769 1661.769 1658.908 + 1658.908 1656.979 1656.979 1655.719 1680.662 1688.242 + 1688.242 1689.954 1689.954 1689.186 1689.186 1689.003 + 1689.003 1685.499 1685.499 1690.087 1690.087 1702.997 + 1702.997 1716.513 1716.513 1726.235 1726.235 1731.919 + + 1641.321 1645.767 1645.767 1657.619 1657.619 1669.774 + 1669.774 1678.511 1647.799 1650.095 1650.095 1657.232 + 1657.232 1661.156 1661.156 1661.769 1661.769 1658.908 + 1658.908 1656.979 1656.979 1655.719 1655.719 1656.280 + 1688.242 1689.954 1689.954 1689.186 1689.186 1689.003 + 1689.003 1685.499 1685.499 1690.087 1690.087 1702.997 + 1702.997 1716.513 1716.513 1726.235 1726.235 1731.919 + + 1644.843 1645.859 1645.859 1655.627 1655.627 1668.026 + 1668.026 1675.612 1642.360 1645.263 1645.263 1649.539 + 1649.539 1652.289 1652.289 1654.275 1654.275 1649.769 + 1649.769 1647.146 1647.146 1645.728 1645.728 1645.892 + 1678.903 1681.032 1681.032 1681.646 1681.646 1680.977 + 1680.977 1678.134 1678.134 1680.770 1680.770 1693.441 + 1693.441 1709.451 1709.451 1719.281 1719.281 1725.008 + + 1644.843 1645.859 1645.859 1655.627 1655.627 1668.026 + 1668.026 1675.612 1642.360 1645.263 1645.263 1649.539 + 1649.539 1652.289 1652.289 1654.275 1654.275 1649.769 + 1649.769 1647.146 1647.146 1645.728 1645.728 1645.892 + 1678.903 1681.032 1681.032 1681.646 1681.646 1680.977 + 1680.977 1678.134 1678.134 1680.770 1680.770 1693.441 + 1693.441 1709.451 1709.451 1719.281 1719.281 1725.008 + + 1647.939 1642.898 1642.898 1652.272 1652.272 1664.461 + 1664.461 1671.938 1635.055 1637.587 1637.587 1638.634 + 1638.634 1637.880 1637.880 1638.798 1638.798 1633.912 + 1633.912 1634.203 1634.203 1632.305 1632.305 1633.765 + 1671.532 1673.799 1673.799 1674.928 1674.928 1675.342 + 1675.342 1675.671 1675.671 1676.365 1676.365 1683.171 + 1683.171 1702.770 1702.770 1715.904 1715.904 1721.458 + + 1647.939 1642.898 1642.898 1652.272 1652.272 1664.461 + 1664.461 1671.938 1635.055 1637.587 1637.587 1638.634 + 1638.634 1637.880 1637.880 1638.798 1638.798 1633.912 + 1633.912 1634.203 1634.203 1632.305 1632.305 1633.765 + 1671.532 1673.799 1673.799 1674.928 1674.928 1675.342 + 1675.342 1675.671 1675.671 1676.365 1676.365 1683.171 + 1683.171 1702.770 1702.770 1715.904 1715.904 1721.458 + + 1647.406 1639.446 1639.446 1648.320 1648.320 1660.046 + 1660.046 1667.368 1626.214 1626.561 1626.561 1623.461 + 1623.461 1623.858 1623.858 1624.612 1624.612 1621.669 + 1621.669 1621.984 1621.984 1620.690 1620.690 1623.214 + 1666.788 1669.318 1669.318 1671.609 1671.609 1672.692 + 1672.692 1675.633 1675.633 1673.272 1673.272 1681.268 + 1681.268 1699.916 1699.916 1715.727 1715.727 1720.690 + + 1647.406 1639.446 1639.446 1648.320 1648.320 1660.046 + 1660.046 1667.368 1626.214 1626.561 1626.561 1623.461 + 1623.461 1623.858 1623.858 1624.612 1624.612 1621.669 + 1621.669 1621.984 1621.984 1620.690 1620.690 1623.214 + 1666.788 1669.318 1669.318 1671.609 1671.609 1672.692 + 1672.692 1675.633 1675.633 1673.272 1673.272 1681.268 + 1681.268 1699.916 1699.916 1715.727 1715.727 1720.690 + + 1646.604 1639.619 1639.619 1646.165 1646.165 1655.795 + 1655.795 1663.263 1618.456 1617.161 1617.161 1614.681 + 1614.681 1613.039 1613.039 1614.013 1614.013 1614.672 + 1614.672 1615.530 1615.530 1614.640 1614.640 1616.520 + 1664.361 1667.175 1667.175 1669.980 1669.980 1671.772 + 1671.772 1675.807 1675.807 1674.970 1674.970 1684.543 + 1684.543 1701.231 1701.231 1716.588 1716.588 1721.346 + + 1646.604 1639.619 1639.619 1646.165 1646.165 1655.795 + 1655.795 1663.263 1618.456 1617.161 1617.161 1614.681 + 1614.681 1613.039 1613.039 1614.013 1614.013 1614.672 + 1614.672 1615.530 1615.530 1614.640 1614.640 1616.520 + 1616.520 1621.232 1667.175 1669.980 1669.980 1671.772 + 1671.772 1675.807 1675.807 1674.970 1674.970 1684.543 + 1684.543 1701.231 1701.231 1716.588 1716.588 1721.346 + + 1647.321 1641.665 1641.665 1645.736 1645.736 1652.540 + 1652.540 1659.605 1613.104 1612.609 1612.609 1609.127 + 1609.127 1604.672 1604.672 1608.927 1608.927 1611.303 + 1611.303 1612.368 1612.368 1610.790 1610.790 1611.828 + 1611.828 1616.201 1666.264 1669.759 1669.759 1673.347 + 1673.347 1680.063 1680.063 1681.125 1681.125 1690.588 + 1690.588 1703.480 1703.480 1716.976 1716.976 1722.520 + + 1647.321 1641.665 1641.665 1645.736 1645.736 1652.540 + 1652.540 1659.605 1613.104 1612.609 1612.609 1609.127 + 1609.127 1604.672 1604.672 1608.927 1608.927 1611.303 + 1611.303 1612.368 1612.368 1610.790 1610.790 1611.828 + 1611.828 1616.201 1666.264 1669.759 1669.759 1673.347 + 1673.347 1680.063 1680.063 1681.125 1681.125 1690.588 + 1690.588 1703.480 1703.480 1716.976 1716.976 1722.520 + + 1649.779 1642.957 1642.957 1644.575 1644.575 1650.068 + 1650.068 1656.322 1608.158 1608.050 1608.050 1603.579 + 1603.579 1599.450 1599.450 1603.981 1603.981 1607.281 + 1607.281 1608.804 1608.804 1607.234 1607.234 1608.658 + 1608.658 1613.375 1667.040 1670.488 1670.488 1678.498 + 1678.498 1684.336 1684.336 1687.774 1687.774 1696.920 + 1696.920 1707.805 1707.805 1720.015 1720.015 1725.736 + + 1649.779 1642.957 1642.957 1644.575 1644.575 1650.068 + 1650.068 1656.322 1608.158 1608.050 1608.050 1603.579 + 1603.579 1599.450 1599.450 1603.981 1603.981 1607.281 + 1607.281 1608.804 1608.804 1607.234 1607.234 1608.658 + 1608.658 1613.375 1667.040 1670.488 1670.488 1678.498 + 1678.498 1684.336 1684.336 1687.774 1687.774 1696.920 + 1696.920 1707.805 1707.805 1720.015 1720.015 1725.736 + + 1653.846 1645.243 1645.243 1645.674 1645.674 1649.808 + 1649.808 1653.423 1601.301 1601.027 1601.027 1597.378 + 1597.378 1594.991 1594.991 1598.423 1598.423 1603.088 + 1603.088 1605.091 1605.091 1604.501 1604.501 1607.690 + 1607.690 1613.220 1670.609 1674.064 1674.064 1686.446 + 1686.446 1690.795 1690.795 1696.166 1696.166 1705.324 + 1705.324 1714.678 1714.678 1726.099 1726.099 1729.970 + + 1653.846 1645.243 1645.243 1645.674 1645.674 1649.808 + 1649.808 1653.423 1649.797 1653.728 1601.027 1597.378 + 1597.378 1594.991 1594.991 1598.423 1598.423 1603.088 + 1603.088 1605.091 1605.091 1604.501 1604.501 1607.690 + 1607.690 1613.220 1670.609 1674.064 1674.064 1686.446 + 1686.446 1690.795 1690.795 1696.166 1696.166 1705.324 + 1705.324 1714.678 1714.678 1726.099 1726.099 1729.970 + + 1659.292 1652.084 1652.084 1649.372 1649.372 1651.013 + 1651.013 1653.540 1639.806 1642.014 1590.407 1589.589 + 1589.589 1589.245 1589.245 1592.236 1592.236 1598.881 + 1598.881 1601.896 1601.896 1605.485 1605.485 1610.692 + 1610.692 1615.875 1676.907 1682.387 1682.387 1696.623 + 1696.623 1700.926 1700.926 1704.094 1704.094 1711.913 + 1711.913 1719.289 1719.289 1728.411 1728.411 1733.864 + + 1659.292 1652.084 1652.084 1649.372 1649.372 1651.013 + 1651.013 1653.540 1639.806 1642.014 1590.407 1589.589 + 1589.589 1589.245 1589.245 1592.236 1592.236 1598.881 + 1598.881 1601.896 1601.896 1605.485 1605.485 1610.692 + 1610.692 1615.875 1676.907 1682.387 1682.387 1696.623 + 1696.623 1700.926 1700.926 1704.094 1704.094 1711.913 + 1711.913 1719.289 1719.289 1728.411 1728.411 1733.864 + + 1664.596 1661.257 1661.257 1658.251 1658.251 1656.713 + 1656.713 1656.827 1630.144 1630.764 1580.212 1580.110 + 1580.110 1582.466 1582.466 1588.267 1588.267 1596.589 + 1596.589 1601.040 1601.040 1609.571 1609.571 1613.690 + 1613.690 1619.060 1683.414 1691.217 1691.217 1703.582 + 1703.582 1707.514 1707.514 1709.795 1709.795 1717.860 + 1717.860 1734.440 1734.440 1738.838 1738.838 1743.084 + + 1664.596 1661.257 1661.257 1658.251 1658.251 1656.713 + 1656.713 1656.827 1630.144 1630.764 1630.764 1633.212 + 1580.110 1582.466 1582.466 1588.267 1588.267 1596.589 + 1596.589 1601.040 1601.040 1609.571 1609.571 1613.690 + 1613.690 1619.060 1683.414 1691.217 1691.217 1703.582 + 1703.582 1707.514 1707.514 1709.795 1709.795 1717.860 + 1717.860 1734.440 1734.440 1738.838 1738.838 1743.084 + + 1670.596 1668.467 1668.467 1666.988 1666.988 1664.351 + 1664.351 1662.054 1620.901 1620.715 1620.715 1622.424 + 1571.298 1573.368 1573.368 1584.288 1584.288 1595.808 + 1595.808 1603.744 1603.744 1616.001 1616.001 1617.946 + 1617.946 1623.158 1686.992 1696.256 1696.256 1706.676 + 1706.676 1711.303 1711.303 1714.620 1714.620 1722.550 + 1722.550 1752.949 1752.949 1759.037 1759.037 1757.998 + + 1670.596 1668.467 1668.467 1666.988 1666.988 1664.351 + 1664.351 1662.054 1620.901 1620.715 1620.715 1622.424 + 1571.298 1573.368 1573.368 1584.288 1584.288 1595.808 + 1595.808 1603.744 1603.744 1616.001 1616.001 1617.946 + 1617.946 1623.158 1686.992 1696.256 1696.256 1706.676 + 1706.676 1711.303 1711.303 1714.620 1714.620 1722.550 + 1722.550 1752.949 1752.949 1759.037 1759.037 1757.998 + + 1673.239 1672.522 1672.522 1673.252 1673.252 1670.635 + 1670.635 1667.238 1613.638 1613.726 1613.726 1615.301 + 1565.737 1567.205 1567.205 1578.476 1578.476 1596.922 + 1596.922 1610.315 1610.315 1618.482 1618.482 1621.186 + 1621.186 1626.363 1686.393 1695.524 1695.524 1705.227 + 1705.227 1711.616 1711.616 1716.146 1716.146 1731.303 + 1731.303 1758.544 1758.544 1764.833 1764.833 1764.509 + + 1673.239 1672.522 1672.522 1673.252 1673.252 1670.635 + 1670.635 1667.238 1613.638 1613.726 1613.726 1615.301 + 1615.301 1619.441 1567.205 1578.476 1578.476 1596.922 + 1596.922 1610.315 1610.315 1618.482 1618.482 1621.186 + 1621.186 1626.363 1626.363 1632.038 1695.524 1705.227 + 1705.227 1711.616 1711.616 1716.146 1716.146 1731.303 + 1731.303 1758.544 1758.544 1764.833 1764.833 1764.509 + + 1676.238 1675.713 1675.713 1676.929 1676.929 1674.262 + 1674.262 1670.643 1610.096 1611.582 1611.582 1613.611 + 1613.611 1615.491 1563.516 1572.776 1572.776 1595.949 + 1595.949 1609.719 1609.719 1617.525 1617.525 1622.370 + 1622.370 1628.645 1628.645 1634.951 1690.296 1700.217 + 1700.217 1710.223 1710.223 1716.359 1716.359 1744.385 + 1744.385 1761.193 1761.193 1762.365 1762.365 1762.111 + + 1676.238 1675.713 1675.713 1676.929 1676.929 1674.262 + 1674.262 1670.643 1610.096 1611.582 1611.582 1613.611 + 1613.611 1615.491 1563.516 1572.776 1572.776 1595.949 + 1595.949 1609.719 1609.719 1617.525 1617.525 1622.370 + 1622.370 1628.645 1628.645 1634.951 1690.296 1700.217 + 1700.217 1710.223 1710.223 1716.359 1716.359 1744.385 + 1744.385 1761.193 1761.193 1762.365 1762.365 1762.111 + + 1677.893 1674.811 1674.811 1676.002 1676.002 1674.856 + 1674.856 1672.218 1608.801 1611.406 1611.406 1613.813 + 1613.813 1613.715 1560.532 1565.391 1565.391 1581.160 + 1581.160 1598.704 1598.704 1613.245 1613.245 1622.373 + 1622.373 1630.082 1630.082 1637.250 1683.564 1692.574 + 1692.574 1706.568 1706.568 1718.562 1718.562 1738.004 + 1738.004 1751.629 1751.629 1755.072 1755.072 1755.362 + + 1677.893 1674.811 1674.811 1676.002 1676.002 1674.856 + 1674.856 1672.218 1608.801 1611.406 1611.406 1613.813 + 1613.813 1613.715 1613.715 1620.302 1565.391 1581.160 + 1581.160 1598.704 1598.704 1613.245 1613.245 1622.373 + 1622.373 1630.082 1630.082 1637.250 1683.564 1692.574 + 1692.574 1706.568 1706.568 1718.562 1718.562 1738.004 + 1738.004 1751.629 1751.629 1755.072 1755.072 1755.362 + + 1676.469 1673.260 1673.260 1675.580 1675.580 1674.786 + 1674.786 1672.577 1607.343 1609.849 1609.849 1612.997 + 1612.997 1614.479 1614.479 1620.721 1563.066 1573.691 + 1573.691 1590.709 1590.709 1606.206 1606.206 1621.485 + 1621.485 1630.562 1630.562 1638.192 1679.198 1688.297 + 1688.297 1705.323 1705.323 1719.074 1719.074 1732.118 + 1732.118 1741.476 1741.476 1745.944 1745.944 1746.833 + + 1676.469 1673.260 1673.260 1675.580 1675.580 1674.786 + 1674.786 1672.577 1607.343 1609.849 1609.849 1612.997 + 1612.997 1614.479 1614.479 1620.721 1563.066 1573.691 + 1573.691 1590.709 1590.709 1606.206 1606.206 1621.485 + 1621.485 1630.562 1630.562 1638.192 1679.198 1688.297 + 1688.297 1705.323 1705.323 1719.074 1719.074 1732.118 + 1732.118 1741.476 1741.476 1745.944 1745.944 1746.833 + + 1673.037 1671.726 1671.726 1674.678 1674.678 1673.168 + 1673.168 1671.533 1607.418 1611.174 1611.174 1617.591 + 1617.591 1623.096 1623.096 1623.665 1565.897 1574.067 + 1574.067 1587.216 1587.216 1600.631 1600.631 1620.027 + 1620.027 1630.117 1630.117 1637.312 1677.011 1685.400 + 1685.400 1700.334 1700.334 1713.675 1713.675 1724.792 + 1724.792 1732.200 1732.200 1736.505 1736.505 1737.509 + + 1673.037 1671.726 1671.726 1674.678 1674.678 1673.168 + 1673.168 1671.533 1671.533 1670.897 1611.174 1617.591 + 1617.591 1623.096 1623.096 1623.665 1565.897 1574.067 + 1574.067 1587.216 1587.216 1600.631 1600.631 1620.027 + 1620.027 1630.117 1630.117 1637.312 1677.011 1685.400 + 1685.400 1700.334 1700.334 1713.675 1713.675 1724.792 + 1724.792 1732.200 1732.200 1736.505 1736.505 1737.509 + + 1674.377 1671.314 1671.314 1674.215 1674.215 1672.145 + 1672.145 1671.651 1671.651 1671.978 1613.949 1620.185 + 1620.185 1623.607 1623.607 1626.159 1570.074 1577.526 + 1577.526 1586.867 1586.867 1595.959 1595.959 1616.957 + 1616.957 1631.537 1631.537 1635.441 1675.678 1683.568 + 1683.568 1694.290 1694.290 1706.578 1706.578 1716.477 + 1716.477 1722.812 1722.812 1726.350 1726.350 1727.160 + + 1674.377 1671.314 1671.314 1674.215 1674.215 1672.145 + 1672.145 1671.651 1671.651 1671.978 1671.978 1671.111 + 1620.185 1623.607 1623.607 1626.159 1626.159 1635.774 + 1577.526 1586.867 1586.867 1595.959 1595.959 1616.957 + 1616.957 1631.537 1631.537 1635.441 1635.441 1641.398 + 1683.568 1694.290 1694.290 1706.578 1706.578 1716.477 + 1716.477 1722.812 1722.812 1726.350 1726.350 1727.160 + + 1677.169 1672.844 1672.844 1673.441 1673.441 1672.719 + 1672.719 1672.925 1672.925 1672.553 1672.553 1671.850 + 1619.820 1623.582 1623.582 1628.846 1628.846 1636.312 + 1578.551 1584.217 1584.217 1590.581 1590.581 1611.334 + 1611.334 1628.094 1628.094 1633.126 1633.126 1637.271 + 1681.545 1690.784 1690.784 1701.141 1701.141 1708.370 + 1708.370 1712.340 1712.340 1716.003 1716.003 1717.803 + + 1687.302 1680.760 1672.844 1673.441 1673.441 1672.719 + 1672.719 1672.925 1672.925 1672.553 1672.553 1671.850 + 1671.850 1670.152 1623.582 1628.846 1628.846 1636.312 + 1578.551 1584.217 1584.217 1590.581 1590.581 1611.334 + 1611.334 1628.094 1628.094 1633.126 1633.126 1637.271 + 1637.271 1644.481 1690.784 1701.141 1701.141 1708.370 + 1708.370 1712.340 1712.340 1716.003 1716.003 1717.803 + + 1691.543 1682.499 1673.786 1671.766 1671.766 1670.966 + 1670.966 1671.740 1671.740 1671.877 1671.877 1672.428 + 1672.428 1671.038 1624.355 1629.578 1629.578 1636.311 + 1577.917 1581.316 1581.316 1585.894 1585.894 1601.741 + 1601.741 1618.869 1618.869 1626.469 1626.469 1632.649 + 1632.649 1641.427 1685.081 1693.918 1693.918 1698.341 + 1698.341 1700.529 1700.529 1707.251 1707.251 1711.365 + + 1691.543 1682.499 1682.499 1678.525 1671.766 1670.966 + 1670.966 1671.740 1671.740 1671.877 1671.877 1672.428 + 1672.428 1671.038 1671.038 1666.836 1629.578 1636.311 + 1636.311 1645.177 1581.316 1585.894 1585.894 1601.741 + 1601.741 1618.869 1618.869 1626.469 1626.469 1632.649 + 1632.649 1641.427 1641.427 1653.569 1693.918 1698.341 + 1698.341 1700.529 1700.529 1707.251 1707.251 1711.365 + + 1696.678 1685.824 1685.824 1680.973 1671.215 1669.798 + 1669.798 1671.948 1671.948 1672.228 1672.228 1672.344 + 1672.344 1670.684 1670.684 1665.624 1630.151 1636.224 + 1636.224 1643.341 1582.455 1589.151 1589.151 1601.201 + 1601.201 1612.691 1612.691 1618.408 1618.408 1628.075 + 1628.075 1637.060 1637.060 1652.958 1676.397 1683.772 + 1683.772 1693.093 1693.093 1702.606 1702.606 1707.172 + + 1696.678 1685.824 1685.824 1680.973 1680.973 1677.281 + 1669.798 1671.948 1671.948 1672.228 1672.228 1672.344 + 1672.344 1670.684 1670.684 1665.624 1665.624 1659.774 + 1659.774 1654.997 1654.997 1654.565 1589.151 1601.201 + 1601.201 1612.691 1612.691 1618.408 1618.408 1628.075 + 1628.075 1637.060 1637.060 1652.958 1676.397 1683.772 + 1683.772 1693.093 1693.093 1702.606 1702.606 1707.172 + + 1701.558 1691.041 1691.041 1684.244 1684.244 1679.536 + 1667.958 1667.457 1667.457 1669.884 1669.884 1671.008 + 1671.008 1668.035 1668.035 1661.922 1661.922 1656.676 + 1656.676 1652.559 1652.559 1649.172 1594.331 1603.347 + 1603.347 1610.352 1610.352 1615.895 1615.895 1623.494 + 1623.494 1632.994 1632.994 1653.322 1653.322 1671.579 + 1671.579 1687.100 1687.100 1698.307 1698.307 1703.415 + + 1701.558 1691.041 1691.041 1684.244 1684.244 1679.536 + 1679.536 1677.321 1667.457 1669.884 1669.884 1671.008 + 1671.008 1668.035 1668.035 1661.922 1661.922 1656.676 + 1656.676 1652.559 1652.559 1649.172 1649.172 1652.713 + 1603.347 1610.352 1610.352 1615.895 1615.895 1623.494 + 1623.494 1632.994 1632.994 1653.322 1653.322 1671.579 + 1671.579 1687.100 1687.100 1698.307 1698.307 1703.415 + + 1704.776 1694.750 1694.750 1687.395 1687.395 1682.315 + 1682.315 1680.250 1664.187 1664.950 1664.950 1666.232 + 1666.232 1661.271 1661.271 1653.592 1653.592 1650.966 + 1650.966 1649.890 1649.890 1647.812 1647.812 1647.684 + 1606.374 1612.085 1612.085 1618.814 1618.814 1624.618 + 1624.618 1634.343 1634.343 1651.923 1651.923 1668.607 + 1668.607 1684.085 1684.085 1696.214 1696.214 1701.448 + + 1704.776 1694.750 1694.750 1687.395 1687.395 1682.315 + 1682.315 1680.250 1664.187 1664.950 1664.950 1666.232 + 1666.232 1661.271 1661.271 1653.592 1653.592 1650.966 + 1650.966 1649.890 1649.890 1647.812 1647.812 1647.684 + 1647.684 1653.275 1612.085 1618.814 1618.814 1624.618 + 1624.618 1634.343 1634.343 1651.923 1651.923 1668.607 + 1668.607 1684.085 1684.085 1696.214 1696.214 1701.448 + + 1707.412 1698.886 1698.886 1691.603 1691.603 1684.959 + 1684.959 1684.963 1662.529 1660.551 1660.551 1657.794 + 1657.794 1650.070 1650.070 1641.859 1641.859 1643.943 + 1643.943 1646.759 1646.759 1646.765 1646.765 1647.259 + 1647.259 1651.121 1616.987 1622.373 1622.373 1629.156 + 1629.156 1641.827 1641.827 1656.614 1656.614 1669.880 + 1669.880 1684.775 1684.775 1696.803 1696.803 1701.828 + + 1644.960 1647.482 1647.482 1661.659 1661.659 1676.282 + 1676.282 1685.946 1656.839 1658.936 1658.936 1665.840 + 1665.840 1669.835 1669.835 1667.268 1667.268 1664.144 + 1664.144 1665.310 1665.310 1667.254 1693.372 1702.120 + 1702.120 1702.564 1702.564 1702.307 1702.307 1704.386 + 1704.386 1702.339 1702.339 1709.071 1709.071 1724.402 + 1724.402 1733.902 1733.902 1742.196 1742.196 1747.038 + + 1645.892 1650.662 1650.662 1662.402 1662.402 1674.432 + 1674.432 1683.154 1652.215 1654.644 1654.644 1661.844 + 1661.844 1665.713 1665.713 1666.252 1666.252 1663.392 + 1663.392 1661.509 1661.509 1660.324 1684.823 1692.771 + 1692.771 1694.615 1694.615 1693.958 1693.958 1693.660 + 1693.660 1690.118 1690.118 1695.251 1695.251 1708.091 + 1708.091 1721.147 1721.147 1730.728 1730.728 1736.018 + 1645.892 1650.662 1650.662 1662.402 1662.402 1674.432 + 1674.432 1683.154 1652.215 1654.644 1654.644 1661.844 + 1661.844 1665.713 1665.713 1666.252 1666.252 1663.392 + 1663.392 1661.509 1661.509 1660.324 1660.324 1661.068 + 1692.771 1694.615 1694.615 1693.958 1693.958 1693.660 + 1693.660 1690.118 1690.118 1695.251 1695.251 1708.091 + 1708.091 1721.147 1721.147 1730.728 1730.728 1736.018 + + 1649.263 1650.398 1650.398 1660.351 1660.351 1672.615 + 1672.615 1680.369 1646.762 1649.809 1649.809 1654.113 + 1654.113 1656.864 1656.864 1658.872 1658.872 1654.238 + 1654.238 1651.790 1651.790 1650.387 1650.387 1650.654 + 1683.513 1685.601 1685.601 1686.454 1686.454 1685.591 + 1685.591 1682.849 1682.849 1685.867 1685.867 1698.795 + 1698.795 1714.179 1714.179 1723.757 1723.757 1729.036 + 1649.263 1650.398 1650.398 1660.351 1660.351 1672.615 + 1672.615 1680.369 1646.762 1649.809 1649.809 1654.113 + 1654.113 1656.864 1656.864 1658.872 1658.872 1654.238 + 1654.238 1651.790 1651.790 1650.387 1650.387 1650.654 + 1683.513 1685.601 1685.601 1686.454 1686.454 1685.591 + 1685.591 1682.849 1682.849 1685.867 1685.867 1698.795 + 1698.795 1714.179 1714.179 1723.757 1723.757 1729.036 + + 1652.199 1647.124 1647.124 1656.911 1656.911 1668.973 + 1668.973 1676.717 1639.406 1642.156 1642.156 1643.171 + 1643.171 1642.603 1642.603 1643.461 1643.461 1638.547 + 1638.547 1639.044 1639.044 1636.797 1636.797 1638.379 + 1676.230 1678.610 1678.610 1679.697 1679.697 1680.084 + 1680.084 1680.420 1680.420 1681.350 1681.350 1688.385 + 1688.385 1707.795 1707.795 1720.231 1720.231 1725.314 + 1652.199 1647.124 1647.124 1656.911 1656.911 1668.973 + 1668.973 1676.717 1639.406 1642.156 1642.156 1643.171 + 1643.171 1642.603 1642.603 1643.461 1643.461 1638.547 + 1638.547 1639.044 1639.044 1636.797 1636.797 1638.379 + 1676.230 1678.610 1678.610 1679.697 1679.697 1680.084 + 1680.084 1680.420 1680.420 1681.350 1681.350 1688.385 + 1688.385 1707.795 1707.795 1720.231 1720.231 1725.314 + + 1651.335 1643.667 1643.667 1652.844 1652.844 1664.496 + 1664.496 1672.130 1630.573 1631.144 1631.144 1627.986 + 1627.986 1628.831 1628.831 1629.432 1629.432 1626.553 + 1626.553 1626.963 1626.963 1625.292 1625.292 1627.888 + 1671.505 1674.059 1674.059 1676.390 1676.390 1677.581 + 1677.581 1680.486 1680.486 1678.219 1678.219 1686.650 + 1686.650 1704.854 1704.854 1719.745 1719.745 1724.350 + 1651.335 1643.667 1643.667 1652.844 1652.844 1664.496 + 1664.496 1672.130 1630.573 1631.144 1631.144 1627.986 + 1627.986 1628.831 1628.831 1629.432 1629.432 1626.553 + 1626.553 1626.963 1626.963 1625.292 1625.292 1627.888 + 1671.505 1674.059 1674.059 1676.390 1676.390 1677.581 + 1677.581 1680.486 1680.486 1678.219 1678.219 1686.650 + 1686.650 1704.854 1704.854 1719.745 1719.745 1724.350 + + 1650.635 1643.929 1643.929 1650.556 1650.556 1660.227 + 1660.227 1668.008 1622.890 1621.719 1621.719 1619.216 + 1619.216 1618.029 1618.029 1618.996 1618.996 1619.834 + 1619.834 1620.601 1620.601 1619.570 1619.570 1621.510 + 1669.163 1671.984 1671.984 1674.783 1674.783 1676.671 + 1676.671 1680.635 1680.635 1679.784 1679.784 1690.001 + 1690.001 1706.198 1706.198 1720.577 1720.577 1724.978 + 1650.635 1643.929 1643.929 1650.556 1650.556 1660.227 + 1660.227 1668.008 1622.890 1621.719 1621.719 1619.216 + 1619.216 1618.029 1618.029 1618.996 1618.996 1619.834 + 1619.834 1620.601 1620.601 1619.570 1619.570 1621.510 + 1621.510 1626.233 1671.984 1674.783 1674.783 1676.671 + 1676.671 1680.635 1680.635 1679.784 1679.784 1690.001 + 1690.001 1706.198 1706.198 1720.577 1720.577 1724.978 + + 1651.606 1645.978 1645.978 1649.979 1649.979 1656.847 + 1656.847 1664.236 1617.597 1617.252 1617.252 1613.582 + 1613.582 1609.738 1609.738 1614.176 1614.176 1616.656 + 1616.656 1617.628 1617.628 1615.830 1615.830 1616.965 + 1616.965 1621.304 1671.326 1674.696 1674.696 1678.332 + 1678.332 1685.041 1685.041 1686.028 1686.028 1695.930 + 1695.930 1708.521 1708.521 1721.259 1721.259 1726.256 + 1651.606 1645.978 1645.978 1649.979 1649.979 1656.847 + 1656.847 1664.236 1617.597 1617.252 1617.252 1613.582 + 1613.582 1609.738 1609.738 1614.176 1614.176 1616.656 + 1616.656 1617.628 1617.628 1615.830 1615.830 1616.965 + 1616.965 1621.304 1671.326 1674.696 1674.696 1678.332 + 1678.332 1685.041 1685.041 1686.028 1686.028 1695.930 + 1695.930 1708.521 1708.521 1721.259 1721.259 1726.256 + + 1654.318 1647.417 1647.417 1648.592 1648.592 1654.105 + 1654.105 1660.740 1612.608 1612.748 1612.748 1608.019 + 1608.019 1604.586 1604.586 1609.342 1609.342 1612.715 + 1612.715 1614.062 1614.062 1612.263 1612.263 1613.771 + 1613.771 1618.522 1672.294 1675.622 1675.622 1683.450 + 1683.450 1689.254 1689.254 1692.724 1692.724 1702.186 + 1702.186 1712.875 1712.875 1724.464 1724.464 1729.509 + 1654.318 1647.417 1647.417 1648.592 1648.592 1654.105 + 1654.105 1660.740 1612.608 1612.748 1612.748 1608.019 + 1608.019 1604.586 1604.586 1609.342 1609.342 1612.715 + 1612.715 1614.062 1614.062 1612.263 1612.263 1613.771 + 1613.771 1618.522 1672.294 1675.622 1675.622 1683.450 + 1683.450 1689.254 1689.254 1692.724 1692.724 1702.186 + 1702.186 1712.875 1712.875 1724.464 1724.464 1729.509 + + 1658.500 1650.339 1650.339 1649.447 1649.447 1653.805 + 1653.805 1657.822 1605.357 1605.286 1605.286 1602.035 + 1602.035 1600.029 1600.029 1603.774 1603.774 1608.526 + 1608.526 1610.216 1610.216 1609.527 1609.527 1612.799 + 1612.799 1618.413 1675.735 1679.132 1679.132 1691.484 + 1691.484 1695.604 1695.604 1701.098 1701.098 1710.558 + 1710.558 1719.622 1719.622 1730.268 1730.268 1733.869 + 1658.500 1650.339 1650.339 1649.447 1649.447 1653.805 + 1653.805 1657.822 1654.574 1659.684 1605.286 1602.035 + 1602.035 1600.029 1600.029 1603.774 1603.774 1608.526 + 1608.526 1610.216 1610.216 1609.527 1609.527 1612.799 + 1612.799 1618.413 1675.735 1679.132 1679.132 1691.484 + 1691.484 1695.604 1695.604 1701.098 1701.098 1710.558 + 1710.558 1719.622 1719.622 1730.268 1730.268 1733.869 + + 1663.997 1657.461 1657.461 1653.595 1653.595 1655.175 + 1655.175 1657.931 1644.959 1647.878 1594.945 1594.331 + 1594.331 1594.363 1594.363 1597.579 1597.579 1604.321 + 1604.321 1607.030 1607.030 1610.630 1610.630 1615.772 + 1615.772 1621.032 1682.049 1687.458 1687.458 1701.594 + 1701.594 1705.748 1705.748 1708.948 1708.948 1717.093 + 1717.093 1724.440 1724.440 1733.330 1733.330 1738.152 + 1663.997 1657.461 1657.461 1653.595 1653.595 1655.175 + 1655.175 1657.931 1644.959 1647.878 1594.945 1594.331 + 1594.331 1594.363 1594.363 1597.579 1597.579 1604.321 + 1604.321 1607.030 1607.030 1610.630 1610.630 1615.772 + 1615.772 1621.032 1682.049 1687.458 1687.458 1701.594 + 1701.594 1705.748 1705.748 1708.948 1708.948 1717.093 + 1717.093 1724.440 1724.440 1733.330 1733.330 1738.152 + + 1669.255 1666.142 1666.142 1662.986 1662.986 1661.142 + 1661.142 1661.296 1635.067 1635.961 1584.914 1584.981 + 1584.981 1587.620 1587.620 1593.367 1593.367 1601.996 + 1601.996 1606.112 1606.112 1614.811 1614.811 1618.593 + 1618.593 1624.098 1689.023 1697.026 1697.026 1708.512 + 1708.512 1712.378 1712.378 1714.746 1714.746 1723.136 + 1723.136 1738.500 1738.500 1743.400 1743.400 1747.284 + 1669.255 1666.142 1666.142 1662.986 1662.986 1661.142 + 1661.142 1661.296 1635.067 1635.961 1635.961 1638.835 + 1584.981 1587.620 1587.620 1593.367 1593.367 1601.996 + 1601.996 1606.112 1606.112 1614.811 1614.811 1618.593 + 1618.593 1624.098 1689.023 1697.026 1697.026 1708.512 + 1708.512 1712.378 1712.378 1714.746 1714.746 1723.136 + 1723.136 1738.500 1738.500 1743.400 1743.400 1747.284 + + 1675.228 1673.022 1673.022 1671.794 1671.794 1669.135 + 1669.135 1666.784 1625.271 1625.115 1625.115 1627.022 + 1576.063 1578.332 1578.332 1589.583 1589.583 1601.069 + 1601.069 1609.067 1609.067 1621.147 1621.147 1622.749 + 1622.749 1628.076 1692.626 1701.974 1701.974 1711.784 + 1711.784 1716.232 1716.232 1719.646 1719.646 1728.049 + 1728.049 1756.882 1756.882 1762.370 1762.370 1761.655 + 1675.228 1673.022 1673.022 1671.794 1671.794 1669.135 + 1669.135 1666.784 1625.271 1625.115 1625.115 1627.022 + 1576.063 1578.332 1578.332 1589.583 1589.583 1601.069 + 1601.069 1609.067 1609.067 1621.147 1621.147 1622.749 + 1622.749 1628.076 1692.626 1701.974 1701.974 1711.784 + 1711.784 1716.232 1716.232 1719.646 1719.646 1728.049 + 1728.049 1756.882 1756.882 1762.370 1762.370 1761.655 + + 1677.824 1676.718 1676.718 1678.008 1678.008 1675.645 + 1675.645 1672.245 1617.534 1617.618 1617.618 1619.342 + 1570.453 1571.995 1571.995 1583.667 1583.667 1602.187 + 1602.187 1615.459 1615.459 1623.425 1623.425 1626.093 + 1626.093 1631.353 1691.887 1700.731 1700.731 1710.304 + 1710.304 1716.647 1716.647 1721.194 1721.194 1736.802 + 1736.802 1763.536 1763.536 1768.683 1768.683 1768.310 + 1677.824 1676.718 1676.718 1678.008 1678.008 1675.645 + 1675.645 1672.245 1617.534 1617.618 1617.618 1619.342 + 1619.342 1623.888 1571.995 1583.667 1583.667 1602.187 + 1602.187 1615.459 1615.459 1623.425 1623.425 1626.093 + 1626.093 1631.353 1631.353 1636.908 1700.731 1710.304 + 1710.304 1716.647 1716.647 1721.194 1721.194 1736.802 + 1736.802 1763.536 1763.536 1768.683 1768.683 1768.310 + + 1680.937 1679.878 1679.878 1681.638 1681.638 1679.343 + 1679.343 1675.770 1613.909 1615.545 1615.545 1617.840 + 1617.840 1619.901 1568.257 1577.854 1577.854 1601.627 + 1601.627 1614.966 1614.966 1622.506 1622.506 1627.294 + 1627.294 1633.534 1633.534 1639.826 1695.591 1705.429 + 1705.429 1715.360 1715.360 1721.354 1721.354 1748.796 + 1748.796 1765.332 1765.332 1766.416 1766.416 1766.172 + 1680.937 1679.878 1679.878 1681.638 1681.638 1679.343 + 1679.343 1675.770 1613.909 1615.545 1615.545 1617.840 + 1617.840 1619.901 1568.257 1577.854 1577.854 1601.627 + 1601.627 1614.966 1614.966 1622.506 1622.506 1627.294 + 1627.294 1633.534 1633.534 1639.826 1695.591 1705.429 + 1705.429 1715.360 1715.360 1721.354 1721.354 1748.796 + 1748.796 1765.332 1765.332 1766.416 1766.416 1766.172 + + 1682.703 1679.125 1679.125 1680.486 1680.486 1679.748 + 1679.748 1677.290 1612.918 1615.857 1615.857 1618.732 + 1618.732 1618.352 1565.290 1570.289 1570.289 1586.502 + 1586.502 1604.193 1604.193 1618.504 1618.504 1627.406 + 1627.406 1635.049 1635.049 1642.196 1688.695 1697.781 + 1697.781 1711.871 1711.871 1723.786 1723.786 1742.927 + 1742.927 1755.599 1755.599 1759.108 1759.108 1759.444 + 1682.703 1679.125 1679.125 1680.486 1680.486 1679.748 + 1679.748 1677.290 1612.918 1615.857 1615.857 1618.732 + 1618.732 1618.352 1618.352 1624.956 1570.289 1586.502 + 1586.502 1604.193 1604.193 1618.504 1618.504 1627.406 + 1627.406 1635.049 1635.049 1642.196 1688.695 1697.781 + 1697.781 1711.871 1711.871 1723.786 1723.786 1742.927 + 1742.927 1755.599 1755.599 1759.108 1759.108 1759.444 + + 1681.421 1677.477 1677.477 1680.006 1680.006 1679.577 + 1679.577 1677.544 1611.985 1614.971 1614.971 1618.682 + 1618.682 1619.398 1619.398 1624.971 1567.901 1578.772 + 1578.772 1595.971 1595.971 1611.644 1611.644 1626.697 + 1626.697 1635.570 1635.570 1643.105 1684.335 1693.589 + 1693.589 1710.682 1710.682 1723.765 1723.765 1736.249 + 1736.249 1745.485 1745.485 1750.021 1750.021 1750.924 + 1681.421 1677.477 1677.477 1680.006 1680.006 1679.577 + 1679.577 1677.544 1611.985 1614.971 1614.971 1618.682 + 1618.682 1619.398 1619.398 1624.971 1567.901 1578.772 + 1578.772 1595.971 1595.971 1611.644 1611.644 1626.697 + 1626.697 1635.570 1635.570 1643.105 1684.335 1693.589 + 1693.589 1710.682 1710.682 1723.765 1723.765 1736.249 + 1736.249 1745.485 1745.485 1750.021 1750.021 1750.924 + + 1677.918 1675.821 1675.821 1679.252 1679.252 1677.907 + 1677.907 1676.292 1612.662 1617.014 1617.014 1624.313 + 1624.313 1629.384 1629.384 1627.495 1570.820 1579.093 + 1579.093 1592.281 1592.281 1606.174 1606.174 1625.412 + 1625.412 1635.111 1635.111 1641.968 1682.118 1690.588 + 1690.588 1705.715 1705.715 1718.059 1718.059 1728.565 + 1728.565 1736.137 1736.137 1740.613 1740.613 1741.663 + 1677.918 1675.821 1675.821 1679.252 1679.252 1677.907 + 1677.907 1676.292 1676.292 1675.834 1617.014 1624.313 + 1624.313 1629.384 1629.384 1627.495 1570.820 1579.093 + 1579.093 1592.281 1592.281 1606.174 1606.174 1625.412 + 1625.412 1635.111 1635.111 1641.968 1682.118 1690.588 + 1690.588 1705.715 1705.715 1718.059 1718.059 1728.565 + 1728.565 1736.137 1736.137 1740.613 1740.613 1741.663 + + 1679.129 1675.532 1675.532 1678.851 1678.851 1676.859 + 1676.859 1676.261 1676.261 1676.829 1620.100 1626.791 + 1626.791 1629.189 1629.189 1630.225 1575.140 1582.622 + 1582.622 1591.771 1591.771 1601.406 1601.406 1622.469 + 1622.469 1636.627 1636.627 1640.276 1680.598 1688.592 + 1688.592 1699.398 1699.398 1711.308 1711.308 1720.578 + 1720.578 1726.757 1726.757 1730.527 1730.527 1731.468 + 1679.129 1675.532 1675.532 1678.851 1678.851 1676.859 + 1676.859 1676.261 1676.261 1676.829 1676.829 1676.041 + 1626.791 1629.189 1629.189 1630.225 1630.225 1640.299 + 1582.622 1591.771 1591.771 1601.406 1601.406 1622.469 + 1622.469 1636.627 1636.627 1640.276 1640.276 1646.295 + 1688.592 1699.398 1699.398 1711.308 1711.308 1720.578 + 1720.578 1726.757 1726.757 1730.527 1730.527 1731.468 + + 1681.774 1677.386 1677.386 1677.969 1677.969 1677.312 + 1677.312 1677.420 1677.420 1677.223 1677.223 1676.592 + 1625.709 1628.842 1628.842 1633.688 1633.688 1641.001 + 1583.555 1589.069 1589.069 1595.859 1595.859 1616.967 + 1616.967 1633.171 1633.171 1638.030 1638.030 1642.046 + 1685.913 1695.183 1695.183 1705.373 1705.373 1712.065 + 1712.065 1716.129 1716.129 1720.143 1720.143 1721.995 + 1691.886 1685.570 1677.386 1677.969 1677.969 1677.312 + 1677.312 1677.420 1677.420 1677.223 1677.223 1676.592 + 1676.592 1674.795 1628.842 1633.688 1633.688 1641.001 + 1583.555 1589.069 1589.069 1595.859 1595.859 1616.967 + 1616.967 1633.171 1633.171 1638.030 1638.030 1642.046 + 1642.046 1649.277 1695.183 1705.373 1705.373 1712.065 + 1712.065 1716.129 1716.129 1720.143 1720.143 1721.995 + + 1695.981 1687.163 1678.354 1676.363 1676.363 1675.526 + 1675.526 1676.269 1676.269 1676.486 1676.486 1677.080 + 1677.080 1675.576 1629.597 1634.516 1634.516 1641.094 + 1582.876 1586.201 1586.201 1590.747 1590.747 1607.303 + 1607.303 1623.948 1623.948 1631.479 1631.479 1637.373 + 1637.373 1646.141 1688.048 1696.355 1696.355 1701.098 + 1701.098 1704.031 1704.031 1711.173 1711.173 1715.138 + 1695.981 1687.163 1687.163 1683.395 1676.363 1675.526 + 1675.526 1676.269 1676.269 1676.486 1676.486 1677.080 + 1677.080 1675.576 1675.576 1670.965 1634.516 1641.094 + 1641.094 1649.952 1586.201 1590.747 1590.747 1607.303 + 1607.303 1623.948 1623.948 1631.479 1631.479 1637.373 + 1637.373 1646.141 1646.141 1658.282 1696.355 1701.098 + 1701.098 1704.031 1704.031 1711.173 1711.173 1715.138 + + 1700.927 1690.253 1690.253 1685.611 1675.821 1674.406 + 1674.406 1676.423 1676.423 1676.844 1676.844 1676.898 + 1676.898 1675.094 1675.094 1669.720 1635.122 1641.030 + 1641.030 1648.066 1587.420 1594.236 1594.236 1606.424 + 1606.424 1617.649 1617.649 1623.389 1623.389 1633.100 + 1633.100 1641.981 1641.981 1657.696 1679.321 1686.945 + 1686.945 1696.690 1696.690 1706.483 1706.483 1710.892 + 1700.927 1690.253 1690.253 1685.611 1685.611 1682.269 + 1674.406 1676.423 1676.423 1676.844 1676.844 1676.898 + 1676.898 1675.094 1675.094 1669.720 1669.720 1663.381 + 1663.381 1658.573 1658.573 1658.684 1594.236 1606.424 + 1606.424 1617.649 1617.649 1623.389 1623.389 1633.100 + 1633.100 1641.981 1641.981 1657.696 1679.321 1686.945 + 1686.945 1696.690 1696.690 1706.483 1706.483 1710.892 + + 1705.791 1695.383 1695.383 1688.744 1688.744 1684.301 + 1672.321 1671.764 1671.764 1674.383 1674.383 1675.598 + 1675.598 1672.506 1672.506 1666.163 1666.163 1660.254 + 1660.254 1656.356 1656.356 1653.444 1599.593 1608.370 + 1608.370 1615.300 1615.300 1620.917 1620.917 1628.436 + 1628.436 1638.173 1638.173 1657.705 1657.705 1675.395 + 1675.395 1690.869 1690.869 1702.267 1702.267 1707.195 + 1705.791 1695.383 1695.383 1688.744 1688.744 1684.301 + 1684.301 1682.436 1671.764 1674.383 1674.383 1675.598 + 1675.598 1672.506 1672.506 1666.163 1666.163 1660.254 + 1660.254 1656.356 1656.356 1653.444 1653.444 1657.248 + 1608.370 1615.300 1615.300 1620.917 1620.917 1628.436 + 1628.436 1638.173 1638.173 1657.705 1657.705 1675.395 + 1675.395 1690.869 1690.869 1702.267 1702.267 1707.195 + + 1708.997 1699.050 1699.050 1691.824 1691.824 1686.899 + 1686.899 1685.072 1668.511 1669.533 1669.533 1670.654 + 1670.654 1665.652 1665.652 1657.764 1657.764 1654.891 + 1654.891 1654.211 1654.211 1652.480 1652.480 1652.419 + 1611.527 1617.123 1617.123 1623.829 1623.829 1629.523 + 1629.523 1639.441 1639.441 1656.323 1656.323 1672.300 + 1672.300 1688.016 1688.016 1700.269 1700.269 1705.318 + 1708.997 1699.050 1699.050 1691.824 1691.824 1686.899 + 1686.899 1685.072 1668.511 1669.533 1669.533 1670.654 + 1670.654 1665.652 1665.652 1657.764 1657.764 1654.891 + 1654.891 1654.211 1654.211 1652.480 1652.480 1652.419 + 1652.419 1658.091 1617.123 1623.829 1623.829 1629.523 + 1629.523 1639.441 1639.441 1656.323 1656.323 1672.300 + 1672.300 1688.016 1688.016 1700.269 1700.269 1705.318 + + 1711.749 1703.258 1703.258 1695.953 1695.953 1689.470 + 1689.470 1689.586 1667.020 1665.116 1665.116 1662.302 + 1662.302 1654.571 1654.571 1646.249 1646.249 1648.375 + 1648.375 1651.382 1651.382 1651.594 1651.594 1652.121 + 1652.121 1656.067 1622.075 1627.397 1627.397 1634.228 + 1634.228 1646.857 1646.857 1661.364 1661.364 1673.989 + 1673.989 1688.894 1688.894 1700.966 1700.966 1705.810 + 1644.960 1647.482 1647.482 1661.659 1661.659 1676.282 + 1676.282 1685.946 1656.839 1658.936 1658.936 1665.840 + 1665.840 1669.835 1669.835 1667.268 1667.268 1664.144 + 1664.144 1665.310 1665.310 1667.254 1693.372 1702.120 + 1702.120 1702.564 1702.564 1702.307 1702.307 1704.386 + 1704.386 1702.339 1702.339 1709.071 1709.071 1724.402 + 1724.402 1733.902 1733.902 1742.196 1742.196 1747.038 + + 1645.892 1650.662 1650.662 1662.402 1662.402 1674.432 + 1674.432 1683.154 1652.215 1654.644 1654.644 1661.844 + 1661.844 1665.713 1665.713 1666.252 1666.252 1663.392 + 1663.392 1661.509 1661.509 1660.324 1684.823 1692.771 + 1692.771 1694.615 1694.615 1693.958 1693.958 1693.660 + 1693.660 1690.118 1690.118 1695.251 1695.251 1708.091 + 1708.091 1721.147 1721.147 1730.728 1730.728 1736.018 + + 1645.892 1650.662 1650.662 1662.402 1662.402 1674.432 + 1674.432 1683.154 1652.215 1654.644 1654.644 1661.844 + 1661.844 1665.713 1665.713 1666.252 1666.252 1663.392 + 1663.392 1661.509 1661.509 1660.324 1660.324 1661.068 + 1692.771 1694.615 1694.615 1693.958 1693.958 1693.660 + 1693.660 1690.118 1690.118 1695.251 1695.251 1708.091 + 1708.091 1721.147 1721.147 1730.728 1730.728 1736.018 + + 1649.263 1650.398 1650.398 1660.351 1660.351 1672.615 + 1672.615 1680.369 1646.762 1649.809 1649.809 1654.113 + 1654.113 1656.864 1656.864 1658.872 1658.872 1654.238 + 1654.238 1651.790 1651.790 1650.387 1650.387 1650.654 + 1683.513 1685.601 1685.601 1686.454 1686.454 1685.591 + 1685.591 1682.849 1682.849 1685.867 1685.867 1698.795 + 1698.795 1714.179 1714.179 1723.757 1723.757 1729.036 + + 1649.263 1650.398 1650.398 1660.351 1660.351 1672.615 + 1672.615 1680.369 1646.762 1649.809 1649.809 1654.113 + 1654.113 1656.864 1656.864 1658.872 1658.872 1654.238 + 1654.238 1651.790 1651.790 1650.387 1650.387 1650.654 + 1683.513 1685.601 1685.601 1686.454 1686.454 1685.591 + 1685.591 1682.849 1682.849 1685.867 1685.867 1698.795 + 1698.795 1714.179 1714.179 1723.757 1723.757 1729.036 + + 1652.199 1647.124 1647.124 1656.911 1656.911 1668.973 + 1668.973 1676.717 1639.406 1642.156 1642.156 1643.171 + 1643.171 1642.603 1642.603 1643.461 1643.461 1638.547 + 1638.547 1639.044 1639.044 1636.797 1636.797 1638.379 + 1676.230 1678.610 1678.610 1679.697 1679.697 1680.084 + 1680.084 1680.420 1680.420 1681.350 1681.350 1688.385 + 1688.385 1707.795 1707.795 1720.231 1720.231 1725.314 + + 1652.199 1647.124 1647.124 1656.911 1656.911 1668.973 + 1668.973 1676.717 1639.406 1642.156 1642.156 1643.171 + 1643.171 1642.603 1642.603 1643.461 1643.461 1638.547 + 1638.547 1639.044 1639.044 1636.797 1636.797 1638.379 + 1676.230 1678.610 1678.610 1679.697 1679.697 1680.084 + 1680.084 1680.420 1680.420 1681.350 1681.350 1688.385 + 1688.385 1707.795 1707.795 1720.231 1720.231 1725.314 + + 1651.335 1643.667 1643.667 1652.844 1652.844 1664.496 + 1664.496 1672.130 1630.573 1631.144 1631.144 1627.986 + 1627.986 1628.831 1628.831 1629.432 1629.432 1626.553 + 1626.553 1626.963 1626.963 1625.292 1625.292 1627.888 + 1671.505 1674.059 1674.059 1676.390 1676.390 1677.581 + 1677.581 1680.486 1680.486 1678.219 1678.219 1686.650 + 1686.650 1704.854 1704.854 1719.745 1719.745 1724.350 + + 1651.335 1643.667 1643.667 1652.844 1652.844 1664.496 + 1664.496 1672.130 1630.573 1631.144 1631.144 1627.986 + 1627.986 1628.831 1628.831 1629.432 1629.432 1626.553 + 1626.553 1626.963 1626.963 1625.292 1625.292 1627.888 + 1671.505 1674.059 1674.059 1676.390 1676.390 1677.581 + 1677.581 1680.486 1680.486 1678.219 1678.219 1686.650 + 1686.650 1704.854 1704.854 1719.745 1719.745 1724.350 + + 1650.635 1643.929 1643.929 1650.556 1650.556 1660.227 + 1660.227 1668.008 1622.890 1621.719 1621.719 1619.216 + 1619.216 1618.029 1618.029 1618.996 1618.996 1619.834 + 1619.834 1620.601 1620.601 1619.570 1619.570 1621.510 + 1669.163 1671.984 1671.984 1674.783 1674.783 1676.671 + 1676.671 1680.635 1680.635 1679.784 1679.784 1690.001 + 1690.001 1706.198 1706.198 1720.577 1720.577 1724.978 + + 1650.635 1643.929 1643.929 1650.556 1650.556 1660.227 + 1660.227 1668.008 1622.890 1621.719 1621.719 1619.216 + 1619.216 1618.029 1618.029 1618.996 1618.996 1619.834 + 1619.834 1620.601 1620.601 1619.570 1619.570 1621.510 + 1621.510 1626.233 1671.984 1674.783 1674.783 1676.671 + 1676.671 1680.635 1680.635 1679.784 1679.784 1690.001 + 1690.001 1706.198 1706.198 1720.577 1720.577 1724.978 + + 1651.606 1645.978 1645.978 1649.979 1649.979 1656.847 + 1656.847 1664.236 1617.597 1617.252 1617.252 1613.582 + 1613.582 1609.738 1609.738 1614.176 1614.176 1616.656 + 1616.656 1617.628 1617.628 1615.830 1615.830 1616.965 + 1616.965 1621.304 1671.326 1674.696 1674.696 1678.332 + 1678.332 1685.041 1685.041 1686.028 1686.028 1695.930 + 1695.930 1708.521 1708.521 1721.259 1721.259 1726.256 + + 1651.606 1645.978 1645.978 1649.979 1649.979 1656.847 + 1656.847 1664.236 1617.597 1617.252 1617.252 1613.582 + 1613.582 1609.738 1609.738 1614.176 1614.176 1616.656 + 1616.656 1617.628 1617.628 1615.830 1615.830 1616.965 + 1616.965 1621.304 1671.326 1674.696 1674.696 1678.332 + 1678.332 1685.041 1685.041 1686.028 1686.028 1695.930 + 1695.930 1708.521 1708.521 1721.259 1721.259 1726.256 + + 1654.318 1647.417 1647.417 1648.592 1648.592 1654.105 + 1654.105 1660.740 1612.608 1612.748 1612.748 1608.019 + 1608.019 1604.586 1604.586 1609.342 1609.342 1612.715 + 1612.715 1614.062 1614.062 1612.263 1612.263 1613.771 + 1613.771 1618.522 1672.294 1675.622 1675.622 1683.450 + 1683.450 1689.254 1689.254 1692.724 1692.724 1702.186 + 1702.186 1712.875 1712.875 1724.464 1724.464 1729.509 + + 1654.318 1647.417 1647.417 1648.592 1648.592 1654.105 + 1654.105 1660.740 1612.608 1612.748 1612.748 1608.019 + 1608.019 1604.586 1604.586 1609.342 1609.342 1612.715 + 1612.715 1614.062 1614.062 1612.263 1612.263 1613.771 + 1613.771 1618.522 1672.294 1675.622 1675.622 1683.450 + 1683.450 1689.254 1689.254 1692.724 1692.724 1702.186 + 1702.186 1712.875 1712.875 1724.464 1724.464 1729.509 + + 1658.500 1650.339 1650.339 1649.447 1649.447 1653.805 + 1653.805 1657.822 1605.357 1605.286 1605.286 1602.035 + 1602.035 1600.029 1600.029 1603.774 1603.774 1608.526 + 1608.526 1610.216 1610.216 1609.527 1609.527 1612.799 + 1612.799 1618.413 1675.735 1679.132 1679.132 1691.484 + 1691.484 1695.604 1695.604 1701.098 1701.098 1710.558 + 1710.558 1719.622 1719.622 1730.268 1730.268 1733.869 + + 1658.500 1650.339 1650.339 1649.447 1649.447 1653.805 + 1653.805 1657.822 1654.574 1659.684 1605.286 1602.035 + 1602.035 1600.029 1600.029 1603.774 1603.774 1608.526 + 1608.526 1610.216 1610.216 1609.527 1609.527 1612.799 + 1612.799 1618.413 1675.735 1679.132 1679.132 1691.484 + 1691.484 1695.604 1695.604 1701.098 1701.098 1710.558 + 1710.558 1719.622 1719.622 1730.268 1730.268 1733.869 + + 1663.997 1657.461 1657.461 1653.595 1653.595 1655.175 + 1655.175 1657.931 1644.959 1647.878 1594.945 1594.331 + 1594.331 1594.363 1594.363 1597.579 1597.579 1604.321 + 1604.321 1607.030 1607.030 1610.630 1610.630 1615.772 + 1615.772 1621.032 1682.049 1687.458 1687.458 1701.594 + 1701.594 1705.748 1705.748 1708.948 1708.948 1717.093 + 1717.093 1724.440 1724.440 1733.330 1733.330 1738.152 + + 1663.997 1657.461 1657.461 1653.595 1653.595 1655.175 + 1655.175 1657.931 1644.959 1647.878 1594.945 1594.331 + 1594.331 1594.363 1594.363 1597.579 1597.579 1604.321 + 1604.321 1607.030 1607.030 1610.630 1610.630 1615.772 + 1615.772 1621.032 1682.049 1687.458 1687.458 1701.594 + 1701.594 1705.748 1705.748 1708.948 1708.948 1717.093 + 1717.093 1724.440 1724.440 1733.330 1733.330 1738.152 + + 1669.255 1666.142 1666.142 1662.986 1662.986 1661.142 + 1661.142 1661.296 1635.067 1635.961 1584.914 1584.981 + 1584.981 1587.620 1587.620 1593.367 1593.367 1601.996 + 1601.996 1606.112 1606.112 1614.811 1614.811 1618.593 + 1618.593 1624.098 1689.023 1697.026 1697.026 1708.512 + 1708.512 1712.378 1712.378 1714.746 1714.746 1723.136 + 1723.136 1738.500 1738.500 1743.400 1743.400 1747.284 + + 1669.255 1666.142 1666.142 1662.986 1662.986 1661.142 + 1661.142 1661.296 1635.067 1635.961 1635.961 1638.835 + 1584.981 1587.620 1587.620 1593.367 1593.367 1601.996 + 1601.996 1606.112 1606.112 1614.811 1614.811 1618.593 + 1618.593 1624.098 1689.023 1697.026 1697.026 1708.512 + 1708.512 1712.378 1712.378 1714.746 1714.746 1723.136 + 1723.136 1738.500 1738.500 1743.400 1743.400 1747.284 + + 1675.228 1673.022 1673.022 1671.794 1671.794 1669.135 + 1669.135 1666.784 1625.271 1625.115 1625.115 1627.022 + 1576.063 1578.332 1578.332 1589.583 1589.583 1601.069 + 1601.069 1609.067 1609.067 1621.147 1621.147 1622.749 + 1622.749 1628.076 1692.626 1701.974 1701.974 1711.784 + 1711.784 1716.232 1716.232 1719.646 1719.646 1728.049 + 1728.049 1756.882 1756.882 1762.370 1762.370 1761.655 + + 1675.228 1673.022 1673.022 1671.794 1671.794 1669.135 + 1669.135 1666.784 1625.271 1625.115 1625.115 1627.022 + 1576.063 1578.332 1578.332 1589.583 1589.583 1601.069 + 1601.069 1609.067 1609.067 1621.147 1621.147 1622.749 + 1622.749 1628.076 1692.626 1701.974 1701.974 1711.784 + 1711.784 1716.232 1716.232 1719.646 1719.646 1728.049 + 1728.049 1756.882 1756.882 1762.370 1762.370 1761.655 + + 1677.824 1676.718 1676.718 1678.008 1678.008 1675.645 + 1675.645 1672.245 1617.534 1617.618 1617.618 1619.342 + 1570.453 1571.995 1571.995 1583.667 1583.667 1602.187 + 1602.187 1615.459 1615.459 1623.425 1623.425 1626.093 + 1626.093 1631.353 1691.887 1700.731 1700.731 1710.304 + 1710.304 1716.647 1716.647 1721.194 1721.194 1736.802 + 1736.802 1763.536 1763.536 1768.683 1768.683 1768.310 + + 1677.824 1676.718 1676.718 1678.008 1678.008 1675.645 + 1675.645 1672.245 1617.534 1617.618 1617.618 1619.342 + 1619.342 1623.888 1571.995 1583.667 1583.667 1602.187 + 1602.187 1615.459 1615.459 1623.425 1623.425 1626.093 + 1626.093 1631.353 1631.353 1636.908 1700.731 1710.304 + 1710.304 1716.647 1716.647 1721.194 1721.194 1736.802 + 1736.802 1763.536 1763.536 1768.683 1768.683 1768.310 + + 1680.937 1679.878 1679.878 1681.638 1681.638 1679.343 + 1679.343 1675.770 1613.909 1615.545 1615.545 1617.840 + 1617.840 1619.901 1568.257 1577.854 1577.854 1601.627 + 1601.627 1614.966 1614.966 1622.506 1622.506 1627.294 + 1627.294 1633.534 1633.534 1639.826 1695.591 1705.429 + 1705.429 1715.360 1715.360 1721.354 1721.354 1748.796 + 1748.796 1765.332 1765.332 1766.416 1766.416 1766.172 + + 1680.937 1679.878 1679.878 1681.638 1681.638 1679.343 + 1679.343 1675.770 1613.909 1615.545 1615.545 1617.840 + 1617.840 1619.901 1568.257 1577.854 1577.854 1601.627 + 1601.627 1614.966 1614.966 1622.506 1622.506 1627.294 + 1627.294 1633.534 1633.534 1639.826 1695.591 1705.429 + 1705.429 1715.360 1715.360 1721.354 1721.354 1748.796 + 1748.796 1765.332 1765.332 1766.416 1766.416 1766.172 + + 1682.703 1679.125 1679.125 1680.486 1680.486 1679.748 + 1679.748 1677.290 1612.918 1615.857 1615.857 1618.732 + 1618.732 1618.352 1565.290 1570.289 1570.289 1586.502 + 1586.502 1604.193 1604.193 1618.504 1618.504 1627.406 + 1627.406 1635.049 1635.049 1642.196 1688.695 1697.781 + 1697.781 1711.871 1711.871 1723.786 1723.786 1742.927 + 1742.927 1755.599 1755.599 1759.108 1759.108 1759.444 + + 1682.703 1679.125 1679.125 1680.486 1680.486 1679.748 + 1679.748 1677.290 1612.918 1615.857 1615.857 1618.732 + 1618.732 1618.352 1618.352 1624.956 1570.289 1586.502 + 1586.502 1604.193 1604.193 1618.504 1618.504 1627.406 + 1627.406 1635.049 1635.049 1642.196 1688.695 1697.781 + 1697.781 1711.871 1711.871 1723.786 1723.786 1742.927 + 1742.927 1755.599 1755.599 1759.108 1759.108 1759.444 + + 1681.421 1677.477 1677.477 1680.006 1680.006 1679.577 + 1679.577 1677.544 1611.985 1614.971 1614.971 1618.682 + 1618.682 1619.398 1619.398 1624.971 1567.901 1578.772 + 1578.772 1595.971 1595.971 1611.644 1611.644 1626.697 + 1626.697 1635.570 1635.570 1643.105 1684.335 1693.589 + 1693.589 1710.682 1710.682 1723.765 1723.765 1736.249 + 1736.249 1745.485 1745.485 1750.021 1750.021 1750.924 + + 1681.421 1677.477 1677.477 1680.006 1680.006 1679.577 + 1679.577 1677.544 1611.985 1614.971 1614.971 1618.682 + 1618.682 1619.398 1619.398 1624.971 1567.901 1578.772 + 1578.772 1595.971 1595.971 1611.644 1611.644 1626.697 + 1626.697 1635.570 1635.570 1643.105 1684.335 1693.589 + 1693.589 1710.682 1710.682 1723.765 1723.765 1736.249 + 1736.249 1745.485 1745.485 1750.021 1750.021 1750.924 + + 1677.918 1675.821 1675.821 1679.252 1679.252 1677.907 + 1677.907 1676.292 1612.662 1617.014 1617.014 1624.313 + 1624.313 1629.384 1629.384 1627.495 1570.820 1579.093 + 1579.093 1592.281 1592.281 1606.174 1606.174 1625.412 + 1625.412 1635.111 1635.111 1641.968 1682.118 1690.588 + 1690.588 1705.715 1705.715 1718.059 1718.059 1728.565 + 1728.565 1736.137 1736.137 1740.613 1740.613 1741.663 + + 1677.918 1675.821 1675.821 1679.252 1679.252 1677.907 + 1677.907 1676.292 1676.292 1675.834 1617.014 1624.313 + 1624.313 1629.384 1629.384 1627.495 1570.820 1579.093 + 1579.093 1592.281 1592.281 1606.174 1606.174 1625.412 + 1625.412 1635.111 1635.111 1641.968 1682.118 1690.588 + 1690.588 1705.715 1705.715 1718.059 1718.059 1728.565 + 1728.565 1736.137 1736.137 1740.613 1740.613 1741.663 + + 1679.129 1675.532 1675.532 1678.851 1678.851 1676.859 + 1676.859 1676.261 1676.261 1676.829 1620.100 1626.791 + 1626.791 1629.189 1629.189 1630.225 1575.140 1582.622 + 1582.622 1591.771 1591.771 1601.406 1601.406 1622.469 + 1622.469 1636.627 1636.627 1640.276 1680.598 1688.592 + 1688.592 1699.398 1699.398 1711.308 1711.308 1720.578 + 1720.578 1726.757 1726.757 1730.527 1730.527 1731.468 + + 1679.129 1675.532 1675.532 1678.851 1678.851 1676.859 + 1676.859 1676.261 1676.261 1676.829 1676.829 1676.041 + 1626.791 1629.189 1629.189 1630.225 1630.225 1640.299 + 1582.622 1591.771 1591.771 1601.406 1601.406 1622.469 + 1622.469 1636.627 1636.627 1640.276 1640.276 1646.295 + 1688.592 1699.398 1699.398 1711.308 1711.308 1720.578 + 1720.578 1726.757 1726.757 1730.527 1730.527 1731.468 + + 1681.774 1677.386 1677.386 1677.969 1677.969 1677.312 + 1677.312 1677.420 1677.420 1677.223 1677.223 1676.592 + 1625.709 1628.842 1628.842 1633.688 1633.688 1641.001 + 1583.555 1589.069 1589.069 1595.859 1595.859 1616.967 + 1616.967 1633.171 1633.171 1638.030 1638.030 1642.046 + 1685.913 1695.183 1695.183 1705.373 1705.373 1712.065 + 1712.065 1716.129 1716.129 1720.143 1720.143 1721.995 + + 1691.886 1685.570 1677.386 1677.969 1677.969 1677.312 + 1677.312 1677.420 1677.420 1677.223 1677.223 1676.592 + 1676.592 1674.795 1628.842 1633.688 1633.688 1641.001 + 1583.555 1589.069 1589.069 1595.859 1595.859 1616.967 + 1616.967 1633.171 1633.171 1638.030 1638.030 1642.046 + 1642.046 1649.277 1695.183 1705.373 1705.373 1712.065 + 1712.065 1716.129 1716.129 1720.143 1720.143 1721.995 + + 1695.981 1687.163 1678.354 1676.363 1676.363 1675.526 + 1675.526 1676.269 1676.269 1676.486 1676.486 1677.080 + 1677.080 1675.576 1629.597 1634.516 1634.516 1641.094 + 1582.876 1586.201 1586.201 1590.747 1590.747 1607.303 + 1607.303 1623.948 1623.948 1631.479 1631.479 1637.373 + 1637.373 1646.141 1688.048 1696.355 1696.355 1701.098 + 1701.098 1704.031 1704.031 1711.173 1711.173 1715.138 + + 1695.981 1687.163 1687.163 1683.395 1676.363 1675.526 + 1675.526 1676.269 1676.269 1676.486 1676.486 1677.080 + 1677.080 1675.576 1675.576 1670.965 1634.516 1641.094 + 1641.094 1649.952 1586.201 1590.747 1590.747 1607.303 + 1607.303 1623.948 1623.948 1631.479 1631.479 1637.373 + 1637.373 1646.141 1646.141 1658.282 1696.355 1701.098 + 1701.098 1704.031 1704.031 1711.173 1711.173 1715.138 + + 1700.927 1690.253 1690.253 1685.611 1675.821 1674.406 + 1674.406 1676.423 1676.423 1676.844 1676.844 1676.898 + 1676.898 1675.094 1675.094 1669.720 1635.122 1641.030 + 1641.030 1648.066 1587.420 1594.236 1594.236 1606.424 + 1606.424 1617.649 1617.649 1623.389 1623.389 1633.100 + 1633.100 1641.981 1641.981 1657.696 1679.321 1686.945 + 1686.945 1696.690 1696.690 1706.483 1706.483 1710.892 + + 1700.927 1690.253 1690.253 1685.611 1685.611 1682.269 + 1674.406 1676.423 1676.423 1676.844 1676.844 1676.898 + 1676.898 1675.094 1675.094 1669.720 1669.720 1663.381 + 1663.381 1658.573 1658.573 1658.684 1594.236 1606.424 + 1606.424 1617.649 1617.649 1623.389 1623.389 1633.100 + 1633.100 1641.981 1641.981 1657.696 1679.321 1686.945 + 1686.945 1696.690 1696.690 1706.483 1706.483 1710.892 + + 1705.791 1695.383 1695.383 1688.744 1688.744 1684.301 + 1672.321 1671.764 1671.764 1674.383 1674.383 1675.598 + 1675.598 1672.506 1672.506 1666.163 1666.163 1660.254 + 1660.254 1656.356 1656.356 1653.444 1599.593 1608.370 + 1608.370 1615.300 1615.300 1620.917 1620.917 1628.436 + 1628.436 1638.173 1638.173 1657.705 1657.705 1675.395 + 1675.395 1690.869 1690.869 1702.267 1702.267 1707.195 + + 1705.791 1695.383 1695.383 1688.744 1688.744 1684.301 + 1684.301 1682.436 1671.764 1674.383 1674.383 1675.598 + 1675.598 1672.506 1672.506 1666.163 1666.163 1660.254 + 1660.254 1656.356 1656.356 1653.444 1653.444 1657.248 + 1608.370 1615.300 1615.300 1620.917 1620.917 1628.436 + 1628.436 1638.173 1638.173 1657.705 1657.705 1675.395 + 1675.395 1690.869 1690.869 1702.267 1702.267 1707.195 + + 1708.997 1699.050 1699.050 1691.824 1691.824 1686.899 + 1686.899 1685.072 1668.511 1669.533 1669.533 1670.654 + 1670.654 1665.652 1665.652 1657.764 1657.764 1654.891 + 1654.891 1654.211 1654.211 1652.480 1652.480 1652.419 + 1611.527 1617.123 1617.123 1623.829 1623.829 1629.523 + 1629.523 1639.441 1639.441 1656.323 1656.323 1672.300 + 1672.300 1688.016 1688.016 1700.269 1700.269 1705.318 + + 1708.997 1699.050 1699.050 1691.824 1691.824 1686.899 + 1686.899 1685.072 1668.511 1669.533 1669.533 1670.654 + 1670.654 1665.652 1665.652 1657.764 1657.764 1654.891 + 1654.891 1654.211 1654.211 1652.480 1652.480 1652.419 + 1652.419 1658.091 1617.123 1623.829 1623.829 1629.523 + 1629.523 1639.441 1639.441 1656.323 1656.323 1672.300 + 1672.300 1688.016 1688.016 1700.269 1700.269 1705.318 + + 1711.749 1703.258 1703.258 1695.953 1695.953 1689.470 + 1689.470 1689.586 1667.020 1665.116 1665.116 1662.302 + 1662.302 1654.571 1654.571 1646.249 1646.249 1648.375 + 1648.375 1651.382 1651.382 1651.594 1651.594 1652.121 + 1652.121 1656.067 1622.075 1627.397 1627.397 1634.228 + 1634.228 1646.857 1646.857 1661.364 1661.364 1673.989 + 1673.989 1688.894 1688.894 1700.966 1700.966 1705.810 + + 1649.349 1652.173 1652.173 1666.548 1666.548 1680.940 + 1680.940 1690.574 1661.126 1663.428 1663.428 1670.446 + 1670.446 1674.376 1674.376 1671.686 1671.686 1668.648 + 1668.648 1669.938 1669.938 1671.975 1697.128 1705.990 + 1705.990 1706.932 1706.932 1707.367 1707.367 1709.253 + 1709.253 1707.056 1707.056 1714.344 1714.344 1729.052 + 1729.052 1738.242 1738.242 1746.609 1746.609 1751.141 + + 1650.464 1655.557 1655.557 1667.184 1667.184 1679.091 + 1679.091 1687.797 1656.632 1659.194 1659.194 1666.457 + 1666.457 1670.269 1670.269 1670.736 1670.736 1667.876 + 1667.876 1666.039 1666.039 1664.930 1688.984 1697.299 + 1697.299 1699.276 1699.276 1698.730 1698.730 1698.316 + 1698.316 1694.736 1694.736 1700.415 1700.415 1713.186 + 1713.186 1725.780 1725.780 1735.222 1735.222 1740.116 + 1650.464 1655.557 1655.557 1667.184 1667.184 1679.091 + 1679.091 1687.797 1656.632 1659.194 1659.194 1666.457 + 1666.457 1670.269 1670.269 1670.736 1670.736 1667.876 + 1667.876 1666.039 1666.039 1664.930 1664.930 1665.857 + 1697.299 1699.276 1699.276 1698.730 1698.730 1698.316 + 1698.316 1694.736 1694.736 1700.415 1700.415 1713.186 + 1713.186 1725.780 1725.780 1735.222 1735.222 1740.116 + + 1653.684 1654.937 1654.937 1665.076 1665.076 1677.205 + 1677.205 1685.126 1651.164 1654.355 1654.355 1658.686 + 1658.686 1661.439 1661.439 1663.470 1663.470 1658.708 + 1658.708 1656.434 1656.434 1655.046 1655.046 1655.417 + 1688.123 1690.170 1690.170 1691.262 1691.262 1690.205 + 1690.205 1687.565 1687.565 1690.965 1690.965 1704.149 + 1704.149 1718.906 1718.906 1728.233 1728.233 1733.065 + 1653.684 1654.937 1654.937 1665.076 1665.076 1677.205 + 1677.205 1685.126 1651.164 1654.355 1654.355 1658.686 + 1658.686 1661.439 1661.439 1663.470 1663.470 1658.708 + 1658.708 1656.434 1656.434 1655.046 1655.046 1655.417 + 1688.123 1690.170 1690.170 1691.262 1691.262 1690.205 + 1690.205 1687.565 1687.565 1690.965 1690.965 1704.149 + 1704.149 1718.906 1718.906 1728.233 1728.233 1733.065 + + 1656.459 1651.350 1651.350 1661.549 1661.549 1673.485 + 1673.485 1681.497 1643.758 1646.725 1646.725 1647.707 + 1647.707 1647.326 1647.326 1648.123 1648.123 1643.182 + 1643.182 1643.885 1643.885 1641.291 1641.291 1642.993 + 1680.927 1683.422 1683.422 1684.465 1684.465 1684.825 + 1684.825 1685.169 1685.169 1686.336 1686.336 1693.600 + 1693.600 1712.819 1712.819 1724.558 1724.558 1729.170 + 1656.459 1651.350 1651.350 1661.549 1661.549 1673.485 + 1673.485 1681.497 1643.758 1646.725 1646.725 1647.707 + 1647.707 1647.326 1647.326 1648.123 1648.123 1643.182 + 1643.182 1643.885 1643.885 1641.291 1641.291 1642.993 + 1680.927 1683.422 1683.422 1684.465 1684.465 1684.825 + 1684.825 1685.169 1685.169 1686.336 1686.336 1693.600 + 1693.600 1712.819 1712.819 1724.558 1724.558 1729.170 + + 1655.264 1647.888 1647.888 1657.367 1657.367 1668.945 + 1668.945 1676.893 1634.932 1635.727 1635.727 1632.512 + 1632.512 1633.803 1633.803 1634.253 1634.253 1631.436 + 1631.436 1631.941 1631.941 1629.895 1629.895 1632.561 + 1676.222 1678.800 1678.800 1681.171 1681.171 1682.471 + 1682.471 1685.338 1685.338 1683.166 1683.166 1692.033 + 1692.033 1709.793 1709.793 1723.763 1723.763 1728.011 + 1655.264 1647.888 1647.888 1657.367 1657.367 1668.945 + 1668.945 1676.893 1634.932 1635.727 1635.727 1632.512 + 1632.512 1633.803 1633.803 1634.253 1634.253 1631.436 + 1631.436 1631.941 1631.941 1629.895 1629.895 1632.561 + 1676.222 1678.800 1678.800 1681.171 1681.171 1682.471 + 1682.471 1685.338 1685.338 1683.166 1683.166 1692.033 + 1692.033 1709.793 1709.793 1723.763 1723.763 1728.011 + + 1654.667 1648.239 1648.239 1654.946 1654.946 1664.658 + 1664.658 1672.753 1627.324 1626.278 1626.278 1623.751 + 1623.751 1623.019 1623.019 1623.979 1623.979 1624.997 + 1624.997 1625.672 1625.672 1624.499 1624.499 1626.500 + 1673.964 1676.792 1676.792 1679.587 1679.587 1681.569 + 1681.569 1685.463 1685.463 1684.599 1684.599 1695.460 + 1695.460 1711.166 1711.166 1724.565 1724.565 1728.609 + 1654.667 1648.239 1648.239 1654.946 1654.946 1664.658 + 1664.658 1672.753 1627.324 1626.278 1626.278 1623.751 + 1623.751 1623.019 1623.019 1623.979 1623.979 1624.997 + 1624.997 1625.672 1625.672 1624.499 1624.499 1626.500 + 1626.500 1631.233 1676.792 1679.587 1679.587 1681.569 + 1681.569 1685.463 1685.463 1684.599 1684.599 1695.460 + 1695.460 1711.166 1711.166 1724.565 1724.565 1728.609 + + 1655.890 1650.292 1650.292 1654.222 1654.222 1661.154 + 1661.154 1668.867 1622.089 1621.896 1621.896 1618.036 + 1618.036 1614.804 1614.804 1619.426 1619.426 1622.009 + 1622.009 1622.888 1622.888 1620.870 1620.870 1622.102 + 1622.102 1626.407 1676.389 1679.633 1679.633 1683.318 + 1683.318 1690.019 1690.019 1690.931 1690.931 1701.272 + 1701.272 1713.561 1713.561 1725.542 1725.542 1729.991 + 1655.890 1650.292 1650.292 1654.222 1654.222 1661.154 + 1661.154 1668.867 1622.089 1621.896 1621.896 1618.036 + 1618.036 1614.804 1614.804 1619.426 1619.426 1622.009 + 1622.009 1622.888 1622.888 1620.870 1620.870 1622.102 + 1622.102 1626.407 1676.389 1679.633 1679.633 1683.318 + 1683.318 1690.019 1690.019 1690.931 1690.931 1701.272 + 1701.272 1713.561 1713.561 1725.542 1725.542 1729.991 + + 1658.857 1651.877 1651.877 1652.610 1652.610 1658.143 + 1658.143 1665.158 1617.057 1617.446 1617.446 1612.458 + 1612.458 1609.723 1609.723 1614.703 1614.703 1618.148 + 1618.148 1619.320 1619.320 1617.292 1617.292 1618.884 + 1618.884 1623.670 1677.549 1680.756 1680.756 1688.403 + 1688.403 1694.172 1694.172 1697.673 1697.673 1707.451 + 1707.451 1717.945 1717.945 1728.913 1728.913 1733.282 + 1658.857 1651.877 1651.877 1652.610 1652.610 1658.143 + 1658.143 1665.158 1617.057 1617.446 1617.446 1612.458 + 1612.458 1609.723 1609.723 1614.703 1614.703 1618.148 + 1618.148 1619.320 1619.320 1617.292 1617.292 1618.884 + 1618.884 1623.670 1677.549 1680.756 1680.756 1688.403 + 1688.403 1694.172 1694.172 1697.673 1697.673 1707.451 + 1707.451 1717.945 1717.945 1728.913 1728.913 1733.282 + + 1663.154 1655.435 1655.435 1653.220 1653.220 1657.803 + 1657.803 1662.220 1609.412 1609.545 1609.545 1606.692 + 1606.692 1605.066 1605.066 1609.124 1609.124 1613.964 + 1613.964 1615.340 1615.340 1614.553 1614.553 1617.907 + 1617.907 1623.606 1680.862 1684.199 1684.199 1696.521 + 1696.521 1700.412 1700.412 1706.030 1706.030 1715.792 + 1715.792 1724.567 1724.567 1734.438 1734.438 1737.768 + 1663.154 1655.435 1655.435 1653.220 1653.220 1657.803 + 1657.803 1662.220 1659.351 1665.640 1609.545 1606.692 + 1606.692 1605.066 1605.066 1609.124 1609.124 1613.964 + 1613.964 1615.340 1615.340 1614.553 1614.553 1617.907 + 1617.907 1623.606 1680.862 1684.199 1684.199 1696.521 + 1696.521 1700.412 1700.412 1706.030 1706.030 1715.792 + 1715.792 1724.567 1724.567 1734.438 1734.438 1737.768 + + 1668.701 1662.838 1662.838 1657.818 1657.818 1659.337 + 1659.337 1662.323 1650.112 1653.743 1599.482 1599.074 + 1599.074 1599.481 1599.481 1602.923 1602.923 1609.761 + 1609.761 1612.164 1612.164 1615.776 1615.776 1620.852 + 1620.852 1626.190 1687.192 1692.529 1692.529 1706.564 + 1706.564 1710.570 1710.570 1713.801 1713.801 1722.274 + 1722.274 1729.590 1729.590 1738.249 1738.249 1742.440 + 1668.701 1662.838 1662.838 1657.818 1657.818 1659.337 + 1659.337 1662.323 1650.112 1653.743 1599.482 1599.074 + 1599.074 1599.481 1599.481 1602.923 1602.923 1609.761 + 1609.761 1612.164 1612.164 1615.776 1615.776 1620.852 + 1620.852 1626.190 1687.192 1692.529 1692.529 1706.564 + 1706.564 1710.570 1710.570 1713.801 1713.801 1722.274 + 1722.274 1729.590 1729.590 1738.249 1738.249 1742.440 + + 1673.913 1671.027 1671.027 1667.721 1667.721 1665.572 + 1665.572 1665.766 1639.990 1641.157 1589.615 1589.851 + 1589.851 1592.775 1592.775 1598.467 1598.467 1607.402 + 1607.402 1611.185 1611.185 1620.050 1620.050 1623.497 + 1623.497 1629.136 1694.633 1702.835 1702.835 1713.442 + 1713.442 1717.242 1717.242 1719.697 1719.697 1728.412 + 1728.412 1742.559 1742.559 1747.963 1747.963 1751.483 + 1673.913 1671.027 1671.027 1667.721 1667.721 1665.572 + 1665.572 1665.766 1639.990 1641.157 1641.157 1644.458 + 1589.851 1592.775 1592.775 1598.467 1598.467 1607.402 + 1607.402 1611.185 1611.185 1620.050 1620.050 1623.497 + 1623.497 1629.136 1694.633 1702.835 1702.835 1713.442 + 1713.442 1717.242 1717.242 1719.697 1719.697 1728.412 + 1728.412 1742.559 1742.559 1747.963 1747.963 1751.483 + + 1679.859 1677.577 1677.577 1676.601 1676.601 1673.918 + 1673.918 1671.515 1629.641 1629.514 1629.514 1631.620 + 1580.828 1583.296 1583.296 1594.878 1594.878 1606.330 + 1606.330 1614.390 1614.390 1626.293 1626.293 1627.552 + 1627.552 1632.994 1698.260 1707.692 1707.692 1716.893 + 1716.893 1721.160 1721.160 1724.672 1724.672 1733.548 + 1733.548 1760.816 1760.816 1765.703 1765.703 1765.312 + 1679.859 1677.577 1677.577 1676.601 1676.601 1673.918 + 1673.918 1671.515 1629.641 1629.514 1629.514 1631.620 + 1580.828 1583.296 1583.296 1594.878 1594.878 1606.330 + 1606.330 1614.390 1614.390 1626.293 1626.293 1627.552 + 1627.552 1632.994 1698.260 1707.692 1707.692 1716.893 + 1716.893 1721.160 1721.160 1724.672 1724.672 1733.548 + 1733.548 1760.816 1760.816 1765.703 1765.703 1765.312 + + 1682.410 1680.913 1680.913 1682.763 1682.763 1680.655 + 1680.655 1677.253 1621.430 1621.509 1621.509 1623.384 + 1575.169 1576.784 1576.784 1588.857 1588.857 1607.451 + 1607.451 1620.603 1620.603 1628.368 1628.368 1631.001 + 1631.001 1636.343 1697.380 1705.938 1705.938 1715.382 + 1715.382 1721.679 1721.679 1726.242 1726.242 1742.301 + 1742.301 1768.528 1768.528 1772.532 1772.532 1772.111 + 1682.410 1680.913 1680.913 1682.763 1682.763 1680.655 + 1680.655 1677.253 1621.430 1621.509 1621.509 1623.384 + 1623.384 1628.334 1576.784 1588.857 1588.857 1607.451 + 1607.451 1620.603 1620.603 1628.368 1628.368 1631.001 + 1631.001 1636.343 1636.343 1641.779 1705.938 1715.382 + 1715.382 1721.679 1721.679 1726.242 1726.242 1742.301 + 1742.301 1768.528 1768.528 1772.532 1772.532 1772.111 + + 1685.636 1684.044 1684.044 1686.348 1686.348 1684.423 + 1684.423 1680.896 1617.723 1619.508 1619.508 1622.070 + 1622.070 1624.310 1572.998 1582.933 1582.933 1607.304 + 1607.304 1620.213 1620.213 1627.488 1627.488 1632.218 + 1632.218 1638.423 1638.423 1644.702 1700.885 1710.641 + 1710.641 1720.498 1720.498 1726.350 1726.350 1753.208 + 1753.208 1769.471 1769.471 1770.467 1770.467 1770.234 + 1685.636 1684.044 1684.044 1686.348 1686.348 1684.423 + 1684.423 1680.896 1617.723 1619.508 1619.508 1622.070 + 1622.070 1624.310 1572.998 1582.933 1582.933 1607.304 + 1607.304 1620.213 1620.213 1627.488 1627.488 1632.218 + 1632.218 1638.423 1638.423 1644.702 1700.885 1710.641 + 1710.641 1720.498 1720.498 1726.350 1726.350 1753.208 + 1753.208 1769.471 1769.471 1770.467 1770.467 1770.234 + + 1687.511 1683.438 1683.438 1684.969 1684.969 1684.639 + 1684.639 1682.363 1617.036 1620.307 1620.307 1623.651 + 1623.651 1622.990 1570.049 1575.187 1575.187 1591.845 + 1591.845 1609.682 1609.682 1623.764 1623.764 1632.439 + 1632.439 1640.016 1640.016 1647.143 1693.825 1702.988 + 1702.988 1717.174 1717.174 1729.010 1729.010 1747.850 + 1747.850 1759.570 1759.570 1763.145 1763.145 1763.526 + 1687.511 1683.438 1683.438 1684.969 1684.969 1684.639 + 1684.639 1682.363 1617.036 1620.307 1620.307 1623.651 + 1623.651 1622.990 1622.990 1629.611 1575.187 1591.845 + 1591.845 1609.682 1609.682 1623.764 1623.764 1632.439 + 1632.439 1640.016 1640.016 1647.143 1693.825 1702.988 + 1702.988 1717.174 1717.174 1729.010 1729.010 1747.850 + 1747.850 1759.570 1759.570 1763.145 1763.145 1763.526 + + 1686.373 1681.693 1681.693 1684.432 1684.432 1684.368 + 1684.368 1682.510 1616.628 1620.093 1620.093 1624.366 + 1624.366 1624.316 1624.316 1629.220 1572.737 1583.853 + 1583.853 1601.234 1601.234 1617.081 1617.081 1631.909 + 1631.909 1640.579 1640.579 1648.017 1689.472 1698.881 + 1698.881 1716.041 1716.041 1728.456 1728.456 1740.380 + 1740.380 1749.494 1749.494 1754.098 1754.098 1755.016 + 1686.373 1681.693 1681.693 1684.432 1684.432 1684.368 + 1684.368 1682.510 1616.628 1620.093 1620.093 1624.366 + 1624.366 1624.316 1624.316 1629.220 1572.737 1583.853 + 1583.853 1601.234 1601.234 1617.081 1617.081 1631.909 + 1631.909 1640.579 1640.579 1648.017 1689.472 1698.881 + 1698.881 1716.041 1716.041 1728.456 1728.456 1740.380 + 1740.380 1749.494 1749.494 1754.098 1754.098 1755.016 + + 1682.800 1679.917 1679.917 1683.826 1683.826 1682.645 + 1682.645 1681.052 1617.906 1622.854 1622.854 1631.035 + 1631.035 1635.672 1635.672 1631.324 1575.743 1584.119 + 1584.119 1597.346 1597.346 1611.718 1611.718 1630.797 + 1630.797 1640.106 1640.106 1646.624 1687.226 1695.776 + 1695.776 1711.097 1711.097 1722.442 1722.442 1732.339 + 1732.339 1740.074 1740.074 1744.721 1744.721 1745.818 + 1682.800 1679.917 1679.917 1683.826 1683.826 1682.645 + 1682.645 1681.052 1681.052 1680.771 1622.854 1631.035 + 1631.035 1635.672 1635.672 1631.324 1575.743 1584.119 + 1584.119 1597.346 1597.346 1611.718 1611.718 1630.797 + 1630.797 1640.106 1640.106 1646.624 1687.226 1695.776 + 1695.776 1711.097 1711.097 1722.442 1722.442 1732.339 + 1732.339 1740.074 1740.074 1744.721 1744.721 1745.818 + + 1683.880 1679.750 1679.750 1683.487 1683.487 1681.574 + 1681.574 1680.870 1680.870 1681.680 1626.252 1633.397 + 1633.397 1634.771 1634.771 1634.292 1580.206 1587.717 + 1587.717 1596.675 1596.675 1606.853 1606.853 1627.980 + 1627.980 1641.716 1641.716 1645.110 1685.518 1693.617 + 1693.617 1704.505 1704.505 1716.038 1716.038 1724.679 + 1724.679 1730.702 1730.702 1734.703 1734.703 1735.775 + 1683.880 1679.750 1679.750 1683.487 1683.487 1681.574 + 1681.574 1680.870 1680.870 1681.680 1681.680 1680.971 + 1633.397 1634.771 1634.771 1634.292 1634.292 1644.823 + 1587.717 1596.675 1596.675 1606.853 1606.853 1627.980 + 1627.980 1641.716 1641.716 1645.110 1645.110 1651.191 + 1693.617 1704.505 1704.505 1716.038 1716.038 1724.679 + 1724.679 1730.702 1730.702 1734.703 1734.703 1735.775 + + 1686.379 1681.927 1681.927 1682.497 1682.497 1681.905 + 1681.905 1681.915 1681.915 1681.893 1681.893 1681.333 + 1631.599 1634.103 1634.103 1638.530 1638.530 1645.690 + 1588.559 1593.920 1593.920 1601.138 1601.138 1622.600 + 1622.600 1638.248 1638.248 1642.934 1642.934 1646.820 + 1690.281 1699.582 1699.582 1709.605 1709.605 1715.759 + 1715.759 1719.917 1719.917 1724.284 1724.284 1726.187 + 1696.470 1690.380 1681.927 1682.497 1682.497 1681.905 + 1681.905 1681.915 1681.915 1681.893 1681.893 1681.333 + 1681.333 1679.438 1634.103 1638.530 1638.530 1645.690 + 1588.559 1593.920 1593.920 1601.138 1601.138 1622.600 + 1622.600 1638.248 1638.248 1642.934 1642.934 1646.820 + 1646.820 1654.072 1699.582 1709.605 1709.605 1715.759 + 1715.759 1719.917 1719.917 1724.284 1724.284 1726.187 + + 1700.420 1691.826 1682.923 1680.961 1680.961 1680.085 + 1680.085 1680.798 1680.798 1681.095 1681.095 1681.731 + 1681.731 1680.115 1634.840 1639.455 1639.455 1645.877 + 1587.836 1591.087 1591.087 1595.599 1595.599 1612.865 + 1612.865 1629.026 1629.026 1636.489 1636.489 1642.097 + 1642.097 1650.854 1691.014 1698.792 1698.792 1703.855 + 1703.855 1707.532 1707.532 1715.095 1715.095 1718.911 + 1700.420 1691.826 1691.826 1688.266 1680.961 1680.085 + 1680.085 1680.798 1680.798 1681.095 1681.095 1681.731 + 1681.731 1680.115 1680.115 1675.095 1639.455 1645.877 + 1645.877 1654.726 1591.087 1595.599 1595.599 1612.865 + 1612.865 1629.026 1629.026 1636.489 1636.489 1642.097 + 1642.097 1650.854 1650.854 1662.995 1698.792 1703.855 + 1703.855 1707.532 1707.532 1715.095 1715.095 1718.911 + + 1705.176 1694.681 1694.681 1690.249 1680.427 1679.013 + 1679.013 1680.897 1680.897 1681.461 1681.461 1681.453 + 1681.453 1679.504 1679.504 1673.817 1640.092 1645.835 + 1645.835 1652.790 1592.385 1599.322 1599.322 1611.647 + 1611.647 1622.607 1622.607 1628.371 1628.371 1638.126 + 1638.126 1646.903 1646.903 1662.434 1682.245 1690.118 + 1690.118 1700.287 1700.287 1710.361 1710.361 1714.612 + 1705.176 1694.681 1694.681 1690.249 1690.249 1687.257 + 1679.013 1680.897 1680.897 1681.461 1681.461 1681.453 + 1681.453 1679.504 1679.504 1673.817 1673.817 1666.989 + 1666.989 1662.148 1662.148 1662.803 1599.322 1611.647 + 1611.647 1622.607 1622.607 1628.371 1628.371 1638.126 + 1638.126 1646.903 1646.903 1662.434 1682.245 1690.118 + 1690.118 1700.287 1700.287 1710.361 1710.361 1714.612 + + 1710.025 1699.725 1699.725 1693.244 1693.244 1689.066 + 1676.684 1676.072 1676.072 1678.883 1678.883 1680.187 + 1680.187 1676.976 1676.976 1670.403 1670.403 1663.831 + 1663.831 1660.153 1660.153 1657.716 1604.855 1613.393 + 1613.393 1620.247 1620.247 1625.939 1625.939 1633.379 + 1633.379 1643.352 1643.352 1662.089 1662.089 1679.211 + 1679.211 1694.638 1694.638 1706.228 1706.228 1710.975 + 1710.025 1699.725 1699.725 1693.244 1693.244 1689.066 + 1689.066 1687.551 1676.072 1678.883 1678.883 1680.187 + 1680.187 1676.976 1676.976 1670.403 1670.403 1663.831 + 1663.831 1660.153 1660.153 1657.716 1657.716 1661.782 + 1613.393 1620.247 1620.247 1625.939 1625.939 1633.379 + 1633.379 1643.352 1643.352 1662.089 1662.089 1679.211 + 1679.211 1694.638 1694.638 1706.228 1706.228 1710.975 + + 1713.218 1703.351 1703.351 1696.254 1696.254 1691.484 + 1691.484 1689.894 1672.834 1674.117 1674.117 1675.075 + 1675.075 1670.033 1670.033 1661.936 1661.936 1658.816 + 1658.816 1658.532 1658.532 1657.149 1657.149 1657.154 + 1616.680 1622.160 1622.160 1628.844 1628.844 1634.428 + 1634.428 1644.538 1644.538 1660.723 1660.723 1675.992 + 1675.992 1691.947 1691.947 1704.323 1704.323 1709.187 + 1713.218 1703.351 1703.351 1696.254 1696.254 1691.484 + 1691.484 1689.894 1672.834 1674.117 1674.117 1675.075 + 1675.075 1670.033 1670.033 1661.936 1661.936 1658.816 + 1658.816 1658.532 1658.532 1657.149 1657.149 1657.154 + 1657.154 1662.907 1622.160 1628.844 1628.844 1634.428 + 1634.428 1644.538 1644.538 1660.723 1660.723 1675.992 + 1675.992 1691.947 1691.947 1704.323 1704.323 1709.187 + + 1716.085 1707.630 1707.630 1700.302 1700.302 1693.981 + 1693.981 1694.208 1671.512 1669.681 1669.681 1666.811 + 1666.811 1659.073 1659.073 1650.638 1650.638 1652.806 + 1652.806 1656.006 1656.006 1656.423 1656.423 1656.982 + 1656.982 1661.013 1627.164 1632.421 1632.421 1639.301 + 1639.301 1651.886 1651.886 1666.114 1666.114 1678.098 + 1678.098 1693.012 1693.012 1705.130 1705.130 1709.792 + 1649.349 1652.173 1652.173 1666.548 1666.548 1680.940 + 1680.940 1690.574 1661.126 1663.428 1663.428 1670.446 + 1670.446 1674.376 1674.376 1671.686 1671.686 1668.648 + 1668.648 1669.938 1669.938 1671.975 1697.128 1705.990 + 1705.990 1706.932 1706.932 1707.367 1707.367 1709.253 + 1709.253 1707.056 1707.056 1714.344 1714.344 1729.052 + 1729.052 1738.242 1738.242 1746.609 1746.609 1751.141 + + 1650.464 1655.557 1655.557 1667.184 1667.184 1679.091 + 1679.091 1687.797 1656.632 1659.194 1659.194 1666.457 + 1666.457 1670.269 1670.269 1670.736 1670.736 1667.876 + 1667.876 1666.039 1666.039 1664.930 1688.984 1697.299 + 1697.299 1699.276 1699.276 1698.730 1698.730 1698.316 + 1698.316 1694.736 1694.736 1700.415 1700.415 1713.186 + 1713.186 1725.780 1725.780 1735.222 1735.222 1740.116 + + 1650.464 1655.557 1655.557 1667.184 1667.184 1679.091 + 1679.091 1687.797 1656.632 1659.194 1659.194 1666.457 + 1666.457 1670.269 1670.269 1670.736 1670.736 1667.876 + 1667.876 1666.039 1666.039 1664.930 1664.930 1665.857 + 1697.299 1699.276 1699.276 1698.730 1698.730 1698.316 + 1698.316 1694.736 1694.736 1700.415 1700.415 1713.186 + 1713.186 1725.780 1725.780 1735.222 1735.222 1740.116 + + 1653.684 1654.937 1654.937 1665.076 1665.076 1677.205 + 1677.205 1685.126 1651.164 1654.355 1654.355 1658.686 + 1658.686 1661.439 1661.439 1663.470 1663.470 1658.708 + 1658.708 1656.434 1656.434 1655.046 1655.046 1655.417 + 1688.123 1690.170 1690.170 1691.262 1691.262 1690.205 + 1690.205 1687.565 1687.565 1690.965 1690.965 1704.149 + 1704.149 1718.906 1718.906 1728.233 1728.233 1733.065 + + 1653.684 1654.937 1654.937 1665.076 1665.076 1677.205 + 1677.205 1685.126 1651.164 1654.355 1654.355 1658.686 + 1658.686 1661.439 1661.439 1663.470 1663.470 1658.708 + 1658.708 1656.434 1656.434 1655.046 1655.046 1655.417 + 1688.123 1690.170 1690.170 1691.262 1691.262 1690.205 + 1690.205 1687.565 1687.565 1690.965 1690.965 1704.149 + 1704.149 1718.906 1718.906 1728.233 1728.233 1733.065 + + 1656.459 1651.350 1651.350 1661.549 1661.549 1673.485 + 1673.485 1681.497 1643.758 1646.725 1646.725 1647.707 + 1647.707 1647.326 1647.326 1648.123 1648.123 1643.182 + 1643.182 1643.885 1643.885 1641.291 1641.291 1642.993 + 1680.927 1683.422 1683.422 1684.465 1684.465 1684.825 + 1684.825 1685.169 1685.169 1686.336 1686.336 1693.600 + 1693.600 1712.819 1712.819 1724.558 1724.558 1729.170 + + 1656.459 1651.350 1651.350 1661.549 1661.549 1673.485 + 1673.485 1681.497 1643.758 1646.725 1646.725 1647.707 + 1647.707 1647.326 1647.326 1648.123 1648.123 1643.182 + 1643.182 1643.885 1643.885 1641.291 1641.291 1642.993 + 1680.927 1683.422 1683.422 1684.465 1684.465 1684.825 + 1684.825 1685.169 1685.169 1686.336 1686.336 1693.600 + 1693.600 1712.819 1712.819 1724.558 1724.558 1729.170 + + 1655.264 1647.888 1647.888 1657.367 1657.367 1668.945 + 1668.945 1676.893 1634.932 1635.727 1635.727 1632.512 + 1632.512 1633.803 1633.803 1634.253 1634.253 1631.436 + 1631.436 1631.941 1631.941 1629.895 1629.895 1632.561 + 1676.222 1678.800 1678.800 1681.171 1681.171 1682.471 + 1682.471 1685.338 1685.338 1683.166 1683.166 1692.033 + 1692.033 1709.793 1709.793 1723.763 1723.763 1728.011 + + 1655.264 1647.888 1647.888 1657.367 1657.367 1668.945 + 1668.945 1676.893 1634.932 1635.727 1635.727 1632.512 + 1632.512 1633.803 1633.803 1634.253 1634.253 1631.436 + 1631.436 1631.941 1631.941 1629.895 1629.895 1632.561 + 1676.222 1678.800 1678.800 1681.171 1681.171 1682.471 + 1682.471 1685.338 1685.338 1683.166 1683.166 1692.033 + 1692.033 1709.793 1709.793 1723.763 1723.763 1728.011 + + 1654.667 1648.239 1648.239 1654.946 1654.946 1664.658 + 1664.658 1672.753 1627.324 1626.278 1626.278 1623.751 + 1623.751 1623.019 1623.019 1623.979 1623.979 1624.997 + 1624.997 1625.672 1625.672 1624.499 1624.499 1626.500 + 1673.964 1676.792 1676.792 1679.587 1679.587 1681.569 + 1681.569 1685.463 1685.463 1684.599 1684.599 1695.460 + 1695.460 1711.166 1711.166 1724.565 1724.565 1728.609 + + 1654.667 1648.239 1648.239 1654.946 1654.946 1664.658 + 1664.658 1672.753 1627.324 1626.278 1626.278 1623.751 + 1623.751 1623.019 1623.019 1623.979 1623.979 1624.997 + 1624.997 1625.672 1625.672 1624.499 1624.499 1626.500 + 1626.500 1631.233 1676.792 1679.587 1679.587 1681.569 + 1681.569 1685.463 1685.463 1684.599 1684.599 1695.460 + 1695.460 1711.166 1711.166 1724.565 1724.565 1728.609 + + 1655.890 1650.292 1650.292 1654.222 1654.222 1661.154 + 1661.154 1668.867 1622.089 1621.896 1621.896 1618.036 + 1618.036 1614.804 1614.804 1619.426 1619.426 1622.009 + 1622.009 1622.888 1622.888 1620.870 1620.870 1622.102 + 1622.102 1626.407 1676.389 1679.633 1679.633 1683.318 + 1683.318 1690.019 1690.019 1690.931 1690.931 1701.272 + 1701.272 1713.561 1713.561 1725.542 1725.542 1729.991 + + 1655.890 1650.292 1650.292 1654.222 1654.222 1661.154 + 1661.154 1668.867 1622.089 1621.896 1621.896 1618.036 + 1618.036 1614.804 1614.804 1619.426 1619.426 1622.009 + 1622.009 1622.888 1622.888 1620.870 1620.870 1622.102 + 1622.102 1626.407 1676.389 1679.633 1679.633 1683.318 + 1683.318 1690.019 1690.019 1690.931 1690.931 1701.272 + 1701.272 1713.561 1713.561 1725.542 1725.542 1729.991 + + 1658.857 1651.877 1651.877 1652.610 1652.610 1658.143 + 1658.143 1665.158 1617.057 1617.446 1617.446 1612.458 + 1612.458 1609.723 1609.723 1614.703 1614.703 1618.148 + 1618.148 1619.320 1619.320 1617.292 1617.292 1618.884 + 1618.884 1623.670 1677.549 1680.756 1680.756 1688.403 + 1688.403 1694.172 1694.172 1697.673 1697.673 1707.451 + 1707.451 1717.945 1717.945 1728.913 1728.913 1733.282 + + 1658.857 1651.877 1651.877 1652.610 1652.610 1658.143 + 1658.143 1665.158 1617.057 1617.446 1617.446 1612.458 + 1612.458 1609.723 1609.723 1614.703 1614.703 1618.148 + 1618.148 1619.320 1619.320 1617.292 1617.292 1618.884 + 1618.884 1623.670 1677.549 1680.756 1680.756 1688.403 + 1688.403 1694.172 1694.172 1697.673 1697.673 1707.451 + 1707.451 1717.945 1717.945 1728.913 1728.913 1733.282 + + 1663.154 1655.435 1655.435 1653.220 1653.220 1657.803 + 1657.803 1662.220 1609.412 1609.545 1609.545 1606.692 + 1606.692 1605.066 1605.066 1609.124 1609.124 1613.964 + 1613.964 1615.340 1615.340 1614.553 1614.553 1617.907 + 1617.907 1623.606 1680.862 1684.199 1684.199 1696.521 + 1696.521 1700.412 1700.412 1706.030 1706.030 1715.792 + 1715.792 1724.567 1724.567 1734.438 1734.438 1737.768 + + 1663.154 1655.435 1655.435 1653.220 1653.220 1657.803 + 1657.803 1662.220 1659.351 1665.640 1609.545 1606.692 + 1606.692 1605.066 1605.066 1609.124 1609.124 1613.964 + 1613.964 1615.340 1615.340 1614.553 1614.553 1617.907 + 1617.907 1623.606 1680.862 1684.199 1684.199 1696.521 + 1696.521 1700.412 1700.412 1706.030 1706.030 1715.792 + 1715.792 1724.567 1724.567 1734.438 1734.438 1737.768 + + 1668.701 1662.838 1662.838 1657.818 1657.818 1659.337 + 1659.337 1662.323 1650.112 1653.743 1599.482 1599.074 + 1599.074 1599.481 1599.481 1602.923 1602.923 1609.761 + 1609.761 1612.164 1612.164 1615.776 1615.776 1620.852 + 1620.852 1626.190 1687.192 1692.529 1692.529 1706.564 + 1706.564 1710.570 1710.570 1713.801 1713.801 1722.274 + 1722.274 1729.590 1729.590 1738.249 1738.249 1742.440 + + 1668.701 1662.838 1662.838 1657.818 1657.818 1659.337 + 1659.337 1662.323 1650.112 1653.743 1599.482 1599.074 + 1599.074 1599.481 1599.481 1602.923 1602.923 1609.761 + 1609.761 1612.164 1612.164 1615.776 1615.776 1620.852 + 1620.852 1626.190 1687.192 1692.529 1692.529 1706.564 + 1706.564 1710.570 1710.570 1713.801 1713.801 1722.274 + 1722.274 1729.590 1729.590 1738.249 1738.249 1742.440 + + 1673.913 1671.027 1671.027 1667.721 1667.721 1665.572 + 1665.572 1665.766 1639.990 1641.157 1589.615 1589.851 + 1589.851 1592.775 1592.775 1598.467 1598.467 1607.402 + 1607.402 1611.185 1611.185 1620.050 1620.050 1623.497 + 1623.497 1629.136 1694.633 1702.835 1702.835 1713.442 + 1713.442 1717.242 1717.242 1719.697 1719.697 1728.412 + 1728.412 1742.559 1742.559 1747.963 1747.963 1751.483 + + 1673.913 1671.027 1671.027 1667.721 1667.721 1665.572 + 1665.572 1665.766 1639.990 1641.157 1641.157 1644.458 + 1589.851 1592.775 1592.775 1598.467 1598.467 1607.402 + 1607.402 1611.185 1611.185 1620.050 1620.050 1623.497 + 1623.497 1629.136 1694.633 1702.835 1702.835 1713.442 + 1713.442 1717.242 1717.242 1719.697 1719.697 1728.412 + 1728.412 1742.559 1742.559 1747.963 1747.963 1751.483 + + 1679.859 1677.577 1677.577 1676.601 1676.601 1673.918 + 1673.918 1671.515 1629.641 1629.514 1629.514 1631.620 + 1580.828 1583.296 1583.296 1594.878 1594.878 1606.330 + 1606.330 1614.390 1614.390 1626.293 1626.293 1627.552 + 1627.552 1632.994 1698.260 1707.692 1707.692 1716.893 + 1716.893 1721.160 1721.160 1724.672 1724.672 1733.548 + 1733.548 1760.816 1760.816 1765.703 1765.703 1765.312 + + 1679.859 1677.577 1677.577 1676.601 1676.601 1673.918 + 1673.918 1671.515 1629.641 1629.514 1629.514 1631.620 + 1580.828 1583.296 1583.296 1594.878 1594.878 1606.330 + 1606.330 1614.390 1614.390 1626.293 1626.293 1627.552 + 1627.552 1632.994 1698.260 1707.692 1707.692 1716.893 + 1716.893 1721.160 1721.160 1724.672 1724.672 1733.548 + 1733.548 1760.816 1760.816 1765.703 1765.703 1765.312 + + 1682.410 1680.913 1680.913 1682.763 1682.763 1680.655 + 1680.655 1677.253 1621.430 1621.509 1621.509 1623.384 + 1575.169 1576.784 1576.784 1588.857 1588.857 1607.451 + 1607.451 1620.603 1620.603 1628.368 1628.368 1631.001 + 1631.001 1636.343 1697.380 1705.938 1705.938 1715.382 + 1715.382 1721.679 1721.679 1726.242 1726.242 1742.301 + 1742.301 1768.528 1768.528 1772.532 1772.532 1772.111 + + 1682.410 1680.913 1680.913 1682.763 1682.763 1680.655 + 1680.655 1677.253 1621.430 1621.509 1621.509 1623.384 + 1623.384 1628.334 1576.784 1588.857 1588.857 1607.451 + 1607.451 1620.603 1620.603 1628.368 1628.368 1631.001 + 1631.001 1636.343 1636.343 1641.779 1705.938 1715.382 + 1715.382 1721.679 1721.679 1726.242 1726.242 1742.301 + 1742.301 1768.528 1768.528 1772.532 1772.532 1772.111 + + 1685.636 1684.044 1684.044 1686.348 1686.348 1684.423 + 1684.423 1680.896 1617.723 1619.508 1619.508 1622.070 + 1622.070 1624.310 1572.998 1582.933 1582.933 1607.304 + 1607.304 1620.213 1620.213 1627.488 1627.488 1632.218 + 1632.218 1638.423 1638.423 1644.702 1700.885 1710.641 + 1710.641 1720.498 1720.498 1726.350 1726.350 1753.208 + 1753.208 1769.471 1769.471 1770.467 1770.467 1770.234 + + 1685.636 1684.044 1684.044 1686.348 1686.348 1684.423 + 1684.423 1680.896 1617.723 1619.508 1619.508 1622.070 + 1622.070 1624.310 1572.998 1582.933 1582.933 1607.304 + 1607.304 1620.213 1620.213 1627.488 1627.488 1632.218 + 1632.218 1638.423 1638.423 1644.702 1700.885 1710.641 + 1710.641 1720.498 1720.498 1726.350 1726.350 1753.208 + 1753.208 1769.471 1769.471 1770.467 1770.467 1770.234 + + 1687.511 1683.438 1683.438 1684.969 1684.969 1684.639 + 1684.639 1682.363 1617.036 1620.307 1620.307 1623.651 + 1623.651 1622.990 1570.049 1575.187 1575.187 1591.845 + 1591.845 1609.682 1609.682 1623.764 1623.764 1632.439 + 1632.439 1640.016 1640.016 1647.143 1693.825 1702.988 + 1702.988 1717.174 1717.174 1729.010 1729.010 1747.850 + 1747.850 1759.570 1759.570 1763.145 1763.145 1763.526 + + 1687.511 1683.438 1683.438 1684.969 1684.969 1684.639 + 1684.639 1682.363 1617.036 1620.307 1620.307 1623.651 + 1623.651 1622.990 1622.990 1629.611 1575.187 1591.845 + 1591.845 1609.682 1609.682 1623.764 1623.764 1632.439 + 1632.439 1640.016 1640.016 1647.143 1693.825 1702.988 + 1702.988 1717.174 1717.174 1729.010 1729.010 1747.850 + 1747.850 1759.570 1759.570 1763.145 1763.145 1763.526 + + 1686.373 1681.693 1681.693 1684.432 1684.432 1684.368 + 1684.368 1682.510 1616.628 1620.093 1620.093 1624.366 + 1624.366 1624.316 1624.316 1629.220 1572.737 1583.853 + 1583.853 1601.234 1601.234 1617.081 1617.081 1631.909 + 1631.909 1640.579 1640.579 1648.017 1689.472 1698.881 + 1698.881 1716.041 1716.041 1728.456 1728.456 1740.380 + 1740.380 1749.494 1749.494 1754.098 1754.098 1755.016 + + 1686.373 1681.693 1681.693 1684.432 1684.432 1684.368 + 1684.368 1682.510 1616.628 1620.093 1620.093 1624.366 + 1624.366 1624.316 1624.316 1629.220 1572.737 1583.853 + 1583.853 1601.234 1601.234 1617.081 1617.081 1631.909 + 1631.909 1640.579 1640.579 1648.017 1689.472 1698.881 + 1698.881 1716.041 1716.041 1728.456 1728.456 1740.380 + 1740.380 1749.494 1749.494 1754.098 1754.098 1755.016 + + 1682.800 1679.917 1679.917 1683.826 1683.826 1682.645 + 1682.645 1681.052 1617.906 1622.854 1622.854 1631.035 + 1631.035 1635.672 1635.672 1631.324 1575.743 1584.119 + 1584.119 1597.346 1597.346 1611.718 1611.718 1630.797 + 1630.797 1640.106 1640.106 1646.624 1687.226 1695.776 + 1695.776 1711.097 1711.097 1722.442 1722.442 1732.339 + 1732.339 1740.074 1740.074 1744.721 1744.721 1745.818 + + 1682.800 1679.917 1679.917 1683.826 1683.826 1682.645 + 1682.645 1681.052 1681.052 1680.771 1622.854 1631.035 + 1631.035 1635.672 1635.672 1631.324 1575.743 1584.119 + 1584.119 1597.346 1597.346 1611.718 1611.718 1630.797 + 1630.797 1640.106 1640.106 1646.624 1687.226 1695.776 + 1695.776 1711.097 1711.097 1722.442 1722.442 1732.339 + 1732.339 1740.074 1740.074 1744.721 1744.721 1745.818 + + 1683.880 1679.750 1679.750 1683.487 1683.487 1681.574 + 1681.574 1680.870 1680.870 1681.680 1626.252 1633.397 + 1633.397 1634.771 1634.771 1634.292 1580.206 1587.717 + 1587.717 1596.675 1596.675 1606.853 1606.853 1627.980 + 1627.980 1641.716 1641.716 1645.110 1685.518 1693.617 + 1693.617 1704.505 1704.505 1716.038 1716.038 1724.679 + 1724.679 1730.702 1730.702 1734.703 1734.703 1735.775 + + 1683.880 1679.750 1679.750 1683.487 1683.487 1681.574 + 1681.574 1680.870 1680.870 1681.680 1681.680 1680.971 + 1633.397 1634.771 1634.771 1634.292 1634.292 1644.823 + 1587.717 1596.675 1596.675 1606.853 1606.853 1627.980 + 1627.980 1641.716 1641.716 1645.110 1645.110 1651.191 + 1693.617 1704.505 1704.505 1716.038 1716.038 1724.679 + 1724.679 1730.702 1730.702 1734.703 1734.703 1735.775 + + 1686.379 1681.927 1681.927 1682.497 1682.497 1681.905 + 1681.905 1681.915 1681.915 1681.893 1681.893 1681.333 + 1631.599 1634.103 1634.103 1638.530 1638.530 1645.690 + 1588.559 1593.920 1593.920 1601.138 1601.138 1622.600 + 1622.600 1638.248 1638.248 1642.934 1642.934 1646.820 + 1690.281 1699.582 1699.582 1709.605 1709.605 1715.759 + 1715.759 1719.917 1719.917 1724.284 1724.284 1726.187 + + 1696.470 1690.380 1681.927 1682.497 1682.497 1681.905 + 1681.905 1681.915 1681.915 1681.893 1681.893 1681.333 + 1681.333 1679.438 1634.103 1638.530 1638.530 1645.690 + 1588.559 1593.920 1593.920 1601.138 1601.138 1622.600 + 1622.600 1638.248 1638.248 1642.934 1642.934 1646.820 + 1646.820 1654.072 1699.582 1709.605 1709.605 1715.759 + 1715.759 1719.917 1719.917 1724.284 1724.284 1726.187 + + 1700.420 1691.826 1682.923 1680.961 1680.961 1680.085 + 1680.085 1680.798 1680.798 1681.095 1681.095 1681.731 + 1681.731 1680.115 1634.840 1639.455 1639.455 1645.877 + 1587.836 1591.087 1591.087 1595.599 1595.599 1612.865 + 1612.865 1629.026 1629.026 1636.489 1636.489 1642.097 + 1642.097 1650.854 1691.014 1698.792 1698.792 1703.855 + 1703.855 1707.532 1707.532 1715.095 1715.095 1718.911 + + 1700.420 1691.826 1691.826 1688.266 1680.961 1680.085 + 1680.085 1680.798 1680.798 1681.095 1681.095 1681.731 + 1681.731 1680.115 1680.115 1675.095 1639.455 1645.877 + 1645.877 1654.726 1591.087 1595.599 1595.599 1612.865 + 1612.865 1629.026 1629.026 1636.489 1636.489 1642.097 + 1642.097 1650.854 1650.854 1662.995 1698.792 1703.855 + 1703.855 1707.532 1707.532 1715.095 1715.095 1718.911 + + 1705.176 1694.681 1694.681 1690.249 1680.427 1679.013 + 1679.013 1680.897 1680.897 1681.461 1681.461 1681.453 + 1681.453 1679.504 1679.504 1673.817 1640.092 1645.835 + 1645.835 1652.790 1592.385 1599.322 1599.322 1611.647 + 1611.647 1622.607 1622.607 1628.371 1628.371 1638.126 + 1638.126 1646.903 1646.903 1662.434 1682.245 1690.118 + 1690.118 1700.287 1700.287 1710.361 1710.361 1714.612 + + 1705.176 1694.681 1694.681 1690.249 1690.249 1687.257 + 1679.013 1680.897 1680.897 1681.461 1681.461 1681.453 + 1681.453 1679.504 1679.504 1673.817 1673.817 1666.989 + 1666.989 1662.148 1662.148 1662.803 1599.322 1611.647 + 1611.647 1622.607 1622.607 1628.371 1628.371 1638.126 + 1638.126 1646.903 1646.903 1662.434 1682.245 1690.118 + 1690.118 1700.287 1700.287 1710.361 1710.361 1714.612 + + 1710.025 1699.725 1699.725 1693.244 1693.244 1689.066 + 1676.684 1676.072 1676.072 1678.883 1678.883 1680.187 + 1680.187 1676.976 1676.976 1670.403 1670.403 1663.831 + 1663.831 1660.153 1660.153 1657.716 1604.855 1613.393 + 1613.393 1620.247 1620.247 1625.939 1625.939 1633.379 + 1633.379 1643.352 1643.352 1662.089 1662.089 1679.211 + 1679.211 1694.638 1694.638 1706.228 1706.228 1710.975 + + 1710.025 1699.725 1699.725 1693.244 1693.244 1689.066 + 1689.066 1687.551 1676.072 1678.883 1678.883 1680.187 + 1680.187 1676.976 1676.976 1670.403 1670.403 1663.831 + 1663.831 1660.153 1660.153 1657.716 1657.716 1661.782 + 1613.393 1620.247 1620.247 1625.939 1625.939 1633.379 + 1633.379 1643.352 1643.352 1662.089 1662.089 1679.211 + 1679.211 1694.638 1694.638 1706.228 1706.228 1710.975 + + 1713.218 1703.351 1703.351 1696.254 1696.254 1691.484 + 1691.484 1689.894 1672.834 1674.117 1674.117 1675.075 + 1675.075 1670.033 1670.033 1661.936 1661.936 1658.816 + 1658.816 1658.532 1658.532 1657.149 1657.149 1657.154 + 1616.680 1622.160 1622.160 1628.844 1628.844 1634.428 + 1634.428 1644.538 1644.538 1660.723 1660.723 1675.992 + 1675.992 1691.947 1691.947 1704.323 1704.323 1709.187 + + 1713.218 1703.351 1703.351 1696.254 1696.254 1691.484 + 1691.484 1689.894 1672.834 1674.117 1674.117 1675.075 + 1675.075 1670.033 1670.033 1661.936 1661.936 1658.816 + 1658.816 1658.532 1658.532 1657.149 1657.149 1657.154 + 1657.154 1662.907 1622.160 1628.844 1628.844 1634.428 + 1634.428 1644.538 1644.538 1660.723 1660.723 1675.992 + 1675.992 1691.947 1691.947 1704.323 1704.323 1709.187 + + 1716.085 1707.630 1707.630 1700.302 1700.302 1693.981 + 1693.981 1694.208 1671.512 1669.681 1669.681 1666.811 + 1666.811 1659.073 1659.073 1650.638 1650.638 1652.806 + 1652.806 1656.006 1656.006 1656.423 1656.423 1656.982 + 1656.982 1661.013 1627.164 1632.421 1632.421 1639.301 + 1639.301 1651.886 1651.886 1666.114 1666.114 1678.098 + 1678.098 1693.012 1693.012 1705.130 1705.130 1709.792 + + 1652.256 1655.486 1655.486 1669.845 1669.845 1684.051 + 1684.051 1693.652 1664.114 1666.433 1666.433 1673.506 + 1673.506 1677.384 1677.384 1674.632 1674.632 1671.663 + 1671.663 1672.963 1672.963 1675.052 1700.139 1709.043 + 1709.043 1709.949 1709.949 1710.804 1710.804 1712.423 + 1712.423 1710.314 1710.314 1717.667 1717.667 1731.723 + 1731.723 1740.808 1740.808 1749.169 1749.169 1753.466 + + 1653.537 1658.794 1658.794 1670.343 1670.343 1682.180 + 1682.180 1690.872 1659.609 1662.186 1662.186 1669.517 + 1669.517 1673.277 1673.277 1673.589 1673.589 1670.885 + 1670.885 1668.976 1668.976 1667.969 1691.897 1700.086 + 1700.086 1702.311 1702.311 1701.918 1701.918 1701.440 + 1701.440 1698.006 1698.006 1703.895 1703.895 1716.513 + 1716.513 1728.630 1728.630 1737.901 1737.901 1742.506 + 1653.537 1658.794 1658.794 1670.343 1670.343 1682.180 + 1682.180 1690.872 1659.609 1662.186 1662.186 1669.517 + 1669.517 1673.277 1673.277 1673.589 1673.589 1670.885 + 1670.885 1668.976 1668.976 1667.969 1667.969 1668.974 + 1700.086 1702.311 1702.311 1701.918 1701.918 1701.440 + 1701.440 1698.006 1698.006 1703.895 1703.895 1716.513 + 1716.513 1728.630 1728.630 1737.901 1737.901 1742.506 + + 1656.657 1657.993 1657.993 1668.202 1668.202 1680.257 + 1680.257 1688.168 1654.133 1657.363 1657.363 1661.727 + 1661.727 1664.482 1664.482 1666.465 1666.465 1661.659 + 1661.659 1659.520 1659.520 1658.156 1658.156 1658.587 + 1691.039 1693.330 1693.330 1694.481 1694.481 1693.288 + 1693.288 1690.840 1690.840 1694.470 1694.470 1707.593 + 1707.593 1721.899 1721.899 1730.985 1730.985 1735.489 + 1656.657 1657.993 1657.993 1668.202 1668.202 1680.257 + 1680.257 1688.168 1654.133 1657.363 1657.363 1661.727 + 1661.727 1664.482 1664.482 1666.465 1666.465 1661.659 + 1661.659 1659.520 1659.520 1658.156 1658.156 1658.587 + 1691.039 1693.330 1693.330 1694.481 1694.481 1693.288 + 1693.288 1690.840 1690.840 1694.470 1694.470 1707.593 + 1707.593 1721.899 1721.899 1730.985 1730.985 1735.489 + + 1659.252 1654.244 1654.244 1664.636 1664.636 1676.470 + 1676.470 1684.520 1646.721 1649.762 1649.762 1650.700 + 1650.700 1650.410 1650.410 1651.100 1651.100 1646.197 + 1646.197 1646.966 1646.966 1644.378 1644.378 1646.251 + 1683.973 1686.627 1686.627 1687.691 1687.691 1688.006 + 1688.006 1688.424 1688.424 1689.822 1689.822 1697.220 + 1697.220 1715.999 1715.999 1727.198 1727.198 1731.490 + 1659.252 1654.244 1654.244 1664.636 1664.636 1676.470 + 1676.470 1684.520 1646.721 1649.762 1649.762 1650.700 + 1650.700 1650.410 1650.410 1651.100 1651.100 1646.197 + 1646.197 1646.966 1646.966 1644.378 1644.378 1646.251 + 1683.973 1686.627 1686.627 1687.691 1687.691 1688.006 + 1688.006 1688.424 1688.424 1689.822 1689.822 1697.220 + 1697.220 1715.999 1715.999 1727.198 1727.198 1731.490 + + 1657.891 1650.747 1650.747 1660.391 1660.391 1671.889 + 1671.889 1679.901 1637.885 1638.758 1638.758 1635.498 + 1635.498 1637.000 1637.000 1637.273 1637.273 1634.506 + 1634.506 1634.999 1634.999 1632.967 1632.967 1635.822 + 1679.318 1682.059 1682.059 1684.378 1684.378 1685.818 + 1685.818 1688.547 1688.547 1686.622 1686.622 1695.665 + 1695.665 1712.702 1712.702 1726.159 1726.159 1730.180 + 1657.891 1650.747 1650.747 1660.391 1660.391 1671.889 + 1671.889 1679.901 1637.885 1638.758 1638.758 1635.498 + 1635.498 1637.000 1637.000 1637.273 1637.273 1634.506 + 1634.506 1634.999 1634.999 1632.967 1632.967 1635.822 + 1679.318 1682.059 1682.059 1684.378 1684.378 1685.818 + 1685.818 1688.547 1688.547 1686.622 1686.622 1695.665 + 1695.665 1712.702 1712.702 1726.159 1726.159 1730.180 + + 1657.401 1651.147 1651.147 1657.893 1657.893 1667.602 + 1667.602 1675.730 1630.299 1629.301 1629.301 1626.707 + 1626.707 1626.207 1626.207 1627.069 1627.069 1628.126 + 1628.126 1628.728 1628.728 1627.601 1627.601 1629.718 + 1677.057 1679.959 1679.959 1682.790 1682.790 1684.891 + 1684.891 1688.728 1688.728 1687.959 1687.959 1699.117 + 1699.117 1714.150 1714.150 1726.971 1726.971 1730.795 + 1657.401 1651.147 1651.147 1657.893 1657.893 1667.602 + 1667.602 1675.730 1630.299 1629.301 1629.301 1626.707 + 1626.707 1626.207 1626.207 1627.069 1627.069 1628.126 + 1628.126 1628.728 1628.728 1627.601 1627.601 1629.718 + 1629.718 1634.516 1679.959 1682.790 1682.790 1684.891 + 1684.891 1688.728 1688.728 1687.959 1687.959 1699.117 + 1699.117 1714.150 1714.150 1726.971 1726.971 1730.795 + + 1658.821 1653.208 1653.208 1657.073 1657.073 1664.028 + 1664.028 1671.789 1625.128 1625.010 1625.010 1620.960 + 1620.960 1618.071 1618.071 1622.601 1622.601 1625.170 + 1625.170 1625.927 1625.927 1623.962 1623.962 1625.272 + 1625.272 1629.622 1679.563 1682.845 1682.845 1686.708 + 1686.708 1693.307 1693.307 1694.249 1694.249 1704.887 + 1704.887 1716.743 1716.743 1728.200 1728.200 1732.324 + 1658.821 1653.208 1653.208 1657.073 1657.073 1664.028 + 1664.028 1671.789 1625.128 1625.010 1625.010 1620.960 + 1620.960 1618.071 1618.071 1622.601 1622.601 1625.170 + 1625.170 1625.927 1625.927 1623.962 1623.962 1625.272 + 1625.272 1629.622 1679.563 1682.845 1682.845 1686.708 + 1686.708 1693.307 1693.307 1694.249 1694.249 1704.887 + 1704.887 1716.743 1716.743 1728.200 1728.200 1732.324 + + 1661.927 1654.968 1654.968 1655.337 1655.337 1660.838 + 1660.838 1668.000 1620.165 1620.633 1620.633 1615.358 + 1615.358 1613.055 1613.055 1617.986 1617.986 1621.375 + 1621.375 1622.384 1622.384 1620.382 1620.382 1622.015 + 1622.015 1626.799 1680.814 1684.021 1684.021 1691.779 + 1691.779 1697.536 1697.536 1701.068 1701.068 1711.062 + 1711.062 1721.336 1721.336 1731.674 1731.674 1735.663 + 1661.927 1654.968 1654.968 1655.337 1655.337 1660.838 + 1660.838 1668.000 1620.165 1620.633 1620.633 1615.358 + 1615.358 1613.055 1613.055 1617.986 1617.986 1621.375 + 1621.375 1622.384 1622.384 1620.382 1620.382 1622.015 + 1622.015 1626.799 1680.814 1684.021 1684.021 1691.779 + 1691.779 1697.536 1697.536 1701.068 1701.068 1711.062 + 1711.062 1721.336 1721.336 1731.674 1731.674 1735.663 + + 1666.198 1659.011 1659.011 1655.833 1655.833 1660.351 + 1660.351 1664.948 1612.589 1612.834 1612.834 1609.751 + 1609.751 1608.318 1608.318 1612.520 1612.520 1617.260 + 1617.260 1618.438 1618.438 1617.705 1617.705 1621.107 + 1621.107 1626.759 1684.464 1687.941 1687.941 1699.960 + 1699.960 1703.765 1703.765 1709.394 1709.394 1719.391 + 1719.391 1727.805 1727.805 1737.040 1737.040 1740.213 + 1666.198 1659.011 1659.011 1655.833 1655.833 1660.351 + 1660.351 1664.948 1662.233 1668.824 1612.834 1609.751 + 1609.751 1608.318 1608.318 1612.520 1612.520 1617.260 + 1617.260 1618.438 1618.438 1617.705 1617.705 1621.107 + 1621.107 1626.759 1684.464 1687.941 1687.941 1699.960 + 1699.960 1703.765 1703.765 1709.394 1709.394 1719.391 + 1719.391 1727.805 1727.805 1737.040 1737.040 1740.213 + + 1671.622 1666.459 1666.459 1660.861 1660.861 1662.026 + 1662.026 1664.965 1653.171 1656.680 1602.702 1602.162 + 1602.162 1602.808 1602.808 1606.403 1606.403 1613.108 + 1613.108 1615.394 1615.394 1619.042 1619.042 1624.105 + 1624.105 1629.446 1690.858 1696.104 1696.104 1709.931 + 1709.931 1713.883 1713.883 1717.109 1717.109 1725.834 + 1725.834 1733.167 1733.167 1741.445 1741.445 1745.280 + 1671.622 1666.459 1666.459 1660.861 1660.861 1662.026 + 1662.026 1664.965 1653.171 1656.680 1602.702 1602.162 + 1602.162 1602.808 1602.808 1606.403 1606.403 1613.108 + 1613.108 1615.394 1615.394 1619.042 1619.042 1624.105 + 1624.105 1629.446 1690.858 1696.104 1696.104 1709.931 + 1709.931 1713.883 1713.883 1717.109 1717.109 1725.834 + 1725.834 1733.167 1733.167 1741.445 1741.445 1745.280 + + 1676.771 1674.271 1674.271 1670.894 1670.894 1668.437 + 1668.437 1668.429 1643.417 1644.123 1592.787 1593.037 + 1593.037 1596.113 1596.113 1601.756 1601.756 1610.739 + 1610.739 1614.524 1614.524 1623.332 1623.332 1626.945 + 1626.945 1632.635 1698.329 1706.287 1706.287 1716.892 + 1716.892 1720.553 1720.553 1723.075 1723.075 1731.914 + 1731.914 1745.177 1745.177 1751.093 1751.093 1754.307 + 1676.771 1674.271 1674.271 1670.894 1670.894 1668.437 + 1668.437 1668.429 1643.417 1644.123 1644.123 1646.925 + 1593.037 1596.113 1596.113 1601.756 1601.756 1610.739 + 1610.739 1614.524 1614.524 1623.332 1623.332 1626.945 + 1626.945 1632.635 1698.329 1706.287 1706.287 1716.892 + 1716.892 1720.553 1720.553 1723.075 1723.075 1731.914 + 1731.914 1745.177 1745.177 1751.093 1751.093 1754.307 + + 1682.714 1680.735 1680.735 1679.607 1679.607 1676.963 + 1676.963 1674.354 1633.493 1632.763 1632.763 1634.111 + 1583.952 1586.595 1586.595 1598.319 1598.319 1609.738 + 1609.738 1617.945 1617.945 1629.494 1629.494 1630.931 + 1630.931 1636.456 1702.194 1711.393 1711.393 1720.239 + 1720.239 1724.480 1724.480 1728.128 1728.128 1737.350 + 1737.350 1762.880 1762.880 1767.916 1767.916 1767.661 + 1682.714 1680.735 1680.735 1679.607 1679.607 1676.963 + 1676.963 1674.354 1633.493 1632.763 1632.763 1634.111 + 1583.952 1586.595 1586.595 1598.319 1598.319 1609.738 + 1609.738 1617.945 1617.945 1629.494 1629.494 1630.931 + 1630.931 1636.456 1702.194 1711.393 1711.393 1720.239 + 1720.239 1724.480 1724.480 1728.128 1728.128 1737.350 + 1737.350 1762.880 1762.880 1767.916 1767.916 1767.661 + + 1685.301 1683.963 1683.963 1685.584 1685.584 1683.771 + 1683.771 1680.256 1625.609 1624.968 1624.968 1625.904 + 1578.252 1579.917 1579.917 1592.257 1592.257 1610.887 + 1610.887 1624.047 1624.047 1631.612 1631.612 1634.298 + 1634.298 1639.631 1701.434 1709.649 1709.649 1718.878 + 1718.878 1725.106 1725.106 1729.738 1729.738 1746.357 + 1746.357 1771.691 1771.691 1774.942 1774.942 1774.516 + 1685.301 1683.963 1683.963 1685.584 1685.584 1683.771 + 1683.771 1680.256 1625.609 1624.968 1624.968 1625.904 + 1625.904 1630.064 1579.917 1592.257 1592.257 1610.887 + 1610.887 1624.047 1624.047 1631.612 1631.612 1634.298 + 1634.298 1639.631 1639.631 1645.094 1709.649 1718.878 + 1718.878 1725.106 1725.106 1729.738 1729.738 1746.357 + 1746.357 1771.691 1771.691 1774.942 1774.942 1774.516 + + 1688.681 1686.996 1686.996 1689.181 1689.181 1687.563 + 1687.563 1683.964 1622.098 1623.144 1623.144 1624.637 + 1624.637 1625.938 1576.099 1586.296 1586.296 1610.965 + 1610.965 1623.690 1623.690 1630.807 1630.807 1635.552 + 1635.552 1641.674 1641.674 1647.916 1704.554 1714.176 + 1714.176 1723.952 1723.952 1729.876 1729.876 1755.951 + 1755.951 1772.126 1772.126 1773.041 1773.041 1772.821 + 1688.681 1686.996 1686.996 1689.181 1689.181 1687.563 + 1687.563 1683.964 1622.098 1623.144 1623.144 1624.637 + 1624.637 1625.938 1576.099 1586.296 1586.296 1610.965 + 1610.965 1623.690 1623.690 1630.807 1630.807 1635.552 + 1635.552 1641.674 1641.674 1647.916 1704.554 1714.176 + 1714.176 1723.952 1723.952 1729.876 1729.876 1755.951 + 1755.951 1772.126 1772.126 1773.041 1773.041 1772.821 + + 1690.672 1686.547 1686.547 1687.825 1687.825 1687.691 + 1687.691 1685.405 1621.729 1624.342 1624.342 1626.731 + 1626.731 1624.855 1573.150 1578.423 1578.423 1595.387 + 1595.387 1613.365 1613.365 1627.282 1627.282 1635.832 + 1635.832 1643.117 1643.117 1650.177 1697.630 1706.570 + 1706.570 1720.788 1720.788 1732.618 1732.618 1750.895 + 1750.895 1762.102 1762.102 1765.786 1765.786 1766.189 + 1690.672 1686.547 1686.547 1687.825 1687.825 1687.691 + 1687.691 1685.405 1621.729 1624.342 1624.342 1626.731 + 1626.731 1624.855 1624.855 1631.103 1578.423 1595.387 + 1595.387 1613.365 1613.365 1627.282 1627.282 1635.832 + 1635.832 1643.117 1643.117 1650.177 1697.630 1706.570 + 1706.570 1720.788 1720.788 1732.618 1732.618 1750.895 + 1750.895 1762.102 1762.102 1765.786 1765.786 1766.189 + + 1689.672 1684.719 1684.719 1687.241 1687.241 1687.379 + 1687.379 1685.525 1621.986 1625.133 1625.133 1628.971 + 1628.971 1627.411 1627.411 1631.221 1575.907 1587.243 + 1587.243 1604.747 1604.747 1620.764 1620.764 1635.472 + 1635.472 1643.705 1643.705 1650.995 1693.285 1702.496 + 1702.496 1719.683 1719.683 1731.423 1731.423 1743.120 + 1743.120 1752.163 1752.163 1756.869 1756.869 1757.781 + 1689.672 1684.719 1684.719 1687.241 1687.241 1687.379 + 1687.379 1685.525 1621.986 1625.133 1625.133 1628.971 + 1628.971 1627.411 1627.411 1631.221 1575.907 1587.243 + 1587.243 1604.747 1604.747 1620.764 1620.764 1635.472 + 1635.472 1643.705 1643.705 1650.995 1693.285 1702.496 + 1702.496 1719.683 1719.683 1731.423 1731.423 1743.120 + 1743.120 1752.163 1752.163 1756.869 1756.869 1757.781 + + 1686.107 1682.820 1682.820 1686.713 1686.713 1685.704 + 1685.704 1684.058 1623.793 1628.649 1628.649 1636.593 + 1636.593 1639.256 1639.256 1633.330 1578.961 1587.478 + 1587.478 1600.692 1600.692 1615.488 1615.488 1634.412 + 1634.412 1643.446 1643.446 1649.854 1691.289 1699.491 + 1699.491 1714.697 1714.697 1725.083 1725.083 1734.877 + 1734.877 1742.828 1742.828 1747.613 1747.613 1748.685 + 1686.107 1682.820 1682.820 1686.713 1686.713 1685.704 + 1685.704 1684.058 1684.058 1683.697 1628.649 1636.593 + 1636.593 1639.256 1639.256 1633.330 1578.961 1587.478 + 1587.478 1600.692 1600.692 1615.488 1615.488 1634.412 + 1634.412 1643.446 1643.446 1649.854 1691.289 1699.491 + 1699.491 1714.697 1714.697 1725.083 1725.083 1734.877 + 1734.877 1742.828 1742.828 1747.613 1747.613 1748.685 + + 1687.029 1682.732 1682.732 1686.477 1686.477 1684.732 + 1684.732 1683.854 1683.854 1684.751 1632.105 1639.020 + 1639.020 1640.396 1640.396 1637.583 1583.492 1591.102 + 1591.102 1599.913 1599.913 1610.610 1610.610 1631.696 + 1631.696 1645.082 1645.082 1648.218 1689.916 1697.582 + 1697.582 1708.032 1708.032 1719.025 1719.025 1727.416 + 1727.416 1733.528 1733.528 1737.624 1737.624 1738.650 + 1687.029 1682.732 1682.732 1686.477 1686.477 1684.732 + 1684.732 1683.854 1683.854 1684.751 1684.751 1683.984 + 1639.020 1640.396 1640.396 1637.583 1637.583 1646.813 + 1591.102 1599.913 1599.913 1610.610 1610.610 1631.696 + 1631.696 1645.082 1645.082 1648.218 1648.218 1654.242 + 1697.582 1708.032 1708.032 1719.025 1719.025 1727.416 + 1727.416 1733.528 1733.528 1737.624 1737.624 1738.650 + + 1689.289 1684.830 1684.830 1685.519 1685.519 1684.952 + 1684.952 1684.869 1684.869 1685.048 1685.048 1684.432 + 1637.228 1639.292 1639.292 1642.238 1642.238 1648.281 + 1591.815 1597.142 1597.142 1604.780 1604.780 1626.423 + 1626.423 1641.681 1641.681 1646.023 1646.023 1649.928 + 1694.389 1703.249 1703.249 1712.622 1712.622 1718.623 + 1718.623 1722.838 1722.838 1727.233 1727.233 1729.023 + 1699.490 1693.419 1684.830 1685.519 1685.519 1684.952 + 1684.952 1684.869 1684.869 1685.048 1685.048 1684.432 + 1684.432 1682.475 1639.292 1642.238 1642.238 1648.281 + 1591.815 1597.142 1597.142 1604.780 1604.780 1626.423 + 1626.423 1641.681 1641.681 1646.023 1646.023 1649.928 + 1649.928 1657.448 1703.249 1712.622 1712.622 1718.623 + 1718.623 1722.838 1722.838 1727.233 1727.233 1729.023 + + 1703.374 1694.860 1685.708 1683.979 1683.979 1683.144 + 1683.144 1683.816 1683.816 1684.242 1684.242 1684.859 + 1684.859 1683.259 1639.627 1643.364 1643.364 1648.893 + 1591.035 1594.304 1594.304 1599.019 1599.019 1616.671 + 1616.671 1632.460 1632.460 1639.921 1639.921 1645.435 + 1645.435 1654.273 1694.463 1701.598 1701.598 1706.600 + 1706.600 1710.462 1710.462 1718.124 1718.124 1721.762 + 1703.374 1694.860 1694.860 1691.255 1683.979 1683.144 + 1683.144 1683.816 1683.816 1684.242 1684.242 1684.859 + 1684.859 1683.259 1683.259 1678.102 1643.364 1648.893 + 1648.893 1656.990 1594.304 1599.019 1599.019 1616.671 + 1616.671 1632.460 1632.460 1639.921 1639.921 1645.435 + 1645.435 1654.273 1654.273 1666.652 1701.598 1706.600 + 1706.600 1710.462 1710.462 1718.124 1718.124 1721.762 + + 1708.001 1697.627 1697.627 1693.293 1683.354 1682.103 + 1682.103 1683.872 1683.872 1684.524 1684.524 1684.531 + 1684.531 1682.621 1682.621 1676.874 1644.092 1649.167 + 1649.167 1655.651 1595.724 1602.816 1602.816 1615.200 + 1615.200 1625.972 1625.972 1631.782 1631.782 1641.506 + 1641.506 1650.482 1650.482 1665.896 1684.698 1692.693 + 1692.693 1703.143 1703.143 1713.364 1713.364 1717.449 + 1708.001 1697.627 1697.627 1693.293 1693.293 1690.228 + 1682.103 1683.872 1683.872 1684.524 1684.524 1684.531 + 1684.531 1682.621 1682.621 1676.874 1676.874 1669.929 + 1669.929 1665.084 1665.084 1665.272 1602.816 1615.200 + 1615.200 1625.972 1625.972 1631.782 1631.782 1641.506 + 1641.506 1650.482 1650.482 1665.896 1684.698 1692.693 + 1692.693 1703.143 1703.143 1713.364 1713.364 1717.449 + + 1712.832 1702.626 1702.626 1696.255 1696.255 1692.122 + 1679.721 1679.173 1679.173 1681.909 1681.909 1683.267 + 1683.267 1680.065 1680.065 1673.385 1673.385 1666.806 + 1666.806 1663.272 1663.272 1660.874 1608.388 1616.830 + 1616.830 1623.631 1623.631 1629.371 1629.371 1636.760 + 1636.760 1646.824 1646.824 1664.835 1664.835 1681.692 + 1681.692 1697.334 1697.334 1709.163 1709.163 1713.774 + 1712.832 1702.626 1702.626 1696.255 1696.255 1692.122 + 1692.122 1690.469 1679.173 1681.909 1681.909 1683.267 + 1683.267 1680.065 1680.065 1673.385 1673.385 1666.806 + 1666.806 1663.272 1663.272 1660.874 1660.874 1664.434 + 1616.830 1623.631 1623.631 1629.371 1629.371 1636.760 + 1636.760 1646.824 1646.824 1664.835 1664.835 1681.692 + 1681.692 1697.334 1697.334 1709.163 1709.163 1713.774 + + 1716.025 1706.236 1706.236 1699.229 1699.229 1694.570 + 1694.570 1692.919 1675.940 1677.222 1677.222 1678.102 + 1678.102 1673.030 1673.030 1664.813 1664.813 1661.868 + 1661.868 1661.734 1661.734 1660.417 1660.417 1660.300 + 1620.185 1625.626 1625.626 1632.274 1632.274 1637.813 + 1637.813 1648.018 1648.018 1663.538 1663.538 1678.357 + 1678.357 1694.592 1694.592 1707.172 1707.172 1711.933 + 1716.025 1706.236 1706.236 1699.229 1699.229 1694.570 + 1694.570 1692.919 1675.940 1677.222 1677.222 1678.102 + 1678.102 1673.030 1673.030 1664.813 1664.813 1661.868 + 1661.868 1661.734 1661.734 1660.417 1660.417 1660.300 + 1660.300 1665.746 1625.626 1632.274 1632.274 1637.813 + 1637.813 1648.018 1648.018 1663.538 1663.538 1678.357 + 1678.357 1694.592 1694.592 1707.172 1707.172 1711.933 + + 1718.967 1710.535 1710.535 1703.228 1703.228 1697.010 + 1697.010 1697.293 1674.437 1672.729 1672.729 1669.875 + 1669.875 1662.165 1662.165 1653.741 1653.741 1655.951 + 1655.951 1659.212 1659.212 1659.747 1659.747 1660.347 + 1660.347 1664.334 1630.717 1635.914 1635.914 1642.770 + 1642.770 1655.321 1655.321 1669.278 1669.278 1680.782 + 1680.782 1695.724 1695.724 1707.959 1707.959 1712.537 + 1652.256 1655.486 1655.486 1669.845 1669.845 1684.051 + 1684.051 1693.652 1664.114 1666.433 1666.433 1673.506 + 1673.506 1677.384 1677.384 1674.632 1674.632 1671.663 + 1671.663 1672.963 1672.963 1675.052 1700.139 1709.043 + 1709.043 1709.949 1709.949 1710.804 1710.804 1712.423 + 1712.423 1710.314 1710.314 1717.667 1717.667 1731.723 + 1731.723 1740.808 1740.808 1749.169 1749.169 1753.466 + + 1653.537 1658.794 1658.794 1670.343 1670.343 1682.180 + 1682.180 1690.872 1659.609 1662.186 1662.186 1669.517 + 1669.517 1673.277 1673.277 1673.589 1673.589 1670.885 + 1670.885 1668.976 1668.976 1667.969 1691.897 1700.086 + 1700.086 1702.311 1702.311 1701.918 1701.918 1701.440 + 1701.440 1698.006 1698.006 1703.895 1703.895 1716.513 + 1716.513 1728.630 1728.630 1737.901 1737.901 1742.506 + + 1653.537 1658.794 1658.794 1670.343 1670.343 1682.180 + 1682.180 1690.872 1659.609 1662.186 1662.186 1669.517 + 1669.517 1673.277 1673.277 1673.589 1673.589 1670.885 + 1670.885 1668.976 1668.976 1667.969 1667.969 1668.974 + 1700.086 1702.311 1702.311 1701.918 1701.918 1701.440 + 1701.440 1698.006 1698.006 1703.895 1703.895 1716.513 + 1716.513 1728.630 1728.630 1737.901 1737.901 1742.506 + + 1656.657 1657.993 1657.993 1668.202 1668.202 1680.257 + 1680.257 1688.168 1654.133 1657.363 1657.363 1661.727 + 1661.727 1664.482 1664.482 1666.465 1666.465 1661.659 + 1661.659 1659.520 1659.520 1658.156 1658.156 1658.587 + 1691.039 1693.330 1693.330 1694.481 1694.481 1693.288 + 1693.288 1690.840 1690.840 1694.470 1694.470 1707.593 + 1707.593 1721.899 1721.899 1730.985 1730.985 1735.489 + + 1656.657 1657.993 1657.993 1668.202 1668.202 1680.257 + 1680.257 1688.168 1654.133 1657.363 1657.363 1661.727 + 1661.727 1664.482 1664.482 1666.465 1666.465 1661.659 + 1661.659 1659.520 1659.520 1658.156 1658.156 1658.587 + 1691.039 1693.330 1693.330 1694.481 1694.481 1693.288 + 1693.288 1690.840 1690.840 1694.470 1694.470 1707.593 + 1707.593 1721.899 1721.899 1730.985 1730.985 1735.489 + + 1659.252 1654.244 1654.244 1664.636 1664.636 1676.470 + 1676.470 1684.520 1646.721 1649.762 1649.762 1650.700 + 1650.700 1650.410 1650.410 1651.100 1651.100 1646.197 + 1646.197 1646.966 1646.966 1644.378 1644.378 1646.251 + 1683.973 1686.627 1686.627 1687.691 1687.691 1688.006 + 1688.006 1688.424 1688.424 1689.822 1689.822 1697.220 + 1697.220 1715.999 1715.999 1727.198 1727.198 1731.490 + + 1659.252 1654.244 1654.244 1664.636 1664.636 1676.470 + 1676.470 1684.520 1646.721 1649.762 1649.762 1650.700 + 1650.700 1650.410 1650.410 1651.100 1651.100 1646.197 + 1646.197 1646.966 1646.966 1644.378 1644.378 1646.251 + 1683.973 1686.627 1686.627 1687.691 1687.691 1688.006 + 1688.006 1688.424 1688.424 1689.822 1689.822 1697.220 + 1697.220 1715.999 1715.999 1727.198 1727.198 1731.490 + + 1657.891 1650.747 1650.747 1660.391 1660.391 1671.889 + 1671.889 1679.901 1637.885 1638.758 1638.758 1635.498 + 1635.498 1637.000 1637.000 1637.273 1637.273 1634.506 + 1634.506 1634.999 1634.999 1632.967 1632.967 1635.822 + 1679.318 1682.059 1682.059 1684.378 1684.378 1685.818 + 1685.818 1688.547 1688.547 1686.622 1686.622 1695.665 + 1695.665 1712.702 1712.702 1726.159 1726.159 1730.180 + + 1657.891 1650.747 1650.747 1660.391 1660.391 1671.889 + 1671.889 1679.901 1637.885 1638.758 1638.758 1635.498 + 1635.498 1637.000 1637.000 1637.273 1637.273 1634.506 + 1634.506 1634.999 1634.999 1632.967 1632.967 1635.822 + 1679.318 1682.059 1682.059 1684.378 1684.378 1685.818 + 1685.818 1688.547 1688.547 1686.622 1686.622 1695.665 + 1695.665 1712.702 1712.702 1726.159 1726.159 1730.180 + + 1657.401 1651.147 1651.147 1657.893 1657.893 1667.602 + 1667.602 1675.730 1630.299 1629.301 1629.301 1626.707 + 1626.707 1626.207 1626.207 1627.069 1627.069 1628.126 + 1628.126 1628.728 1628.728 1627.601 1627.601 1629.718 + 1677.057 1679.959 1679.959 1682.790 1682.790 1684.891 + 1684.891 1688.728 1688.728 1687.959 1687.959 1699.117 + 1699.117 1714.150 1714.150 1726.971 1726.971 1730.795 + + 1657.401 1651.147 1651.147 1657.893 1657.893 1667.602 + 1667.602 1675.730 1630.299 1629.301 1629.301 1626.707 + 1626.707 1626.207 1626.207 1627.069 1627.069 1628.126 + 1628.126 1628.728 1628.728 1627.601 1627.601 1629.718 + 1629.718 1634.516 1679.959 1682.790 1682.790 1684.891 + 1684.891 1688.728 1688.728 1687.959 1687.959 1699.117 + 1699.117 1714.150 1714.150 1726.971 1726.971 1730.795 + + 1658.821 1653.208 1653.208 1657.073 1657.073 1664.028 + 1664.028 1671.789 1625.128 1625.010 1625.010 1620.960 + 1620.960 1618.071 1618.071 1622.601 1622.601 1625.170 + 1625.170 1625.927 1625.927 1623.962 1623.962 1625.272 + 1625.272 1629.622 1679.563 1682.845 1682.845 1686.708 + 1686.708 1693.307 1693.307 1694.249 1694.249 1704.887 + 1704.887 1716.743 1716.743 1728.200 1728.200 1732.324 + + 1658.821 1653.208 1653.208 1657.073 1657.073 1664.028 + 1664.028 1671.789 1625.128 1625.010 1625.010 1620.960 + 1620.960 1618.071 1618.071 1622.601 1622.601 1625.170 + 1625.170 1625.927 1625.927 1623.962 1623.962 1625.272 + 1625.272 1629.622 1679.563 1682.845 1682.845 1686.708 + 1686.708 1693.307 1693.307 1694.249 1694.249 1704.887 + 1704.887 1716.743 1716.743 1728.200 1728.200 1732.324 + + 1661.927 1654.968 1654.968 1655.337 1655.337 1660.838 + 1660.838 1668.000 1620.165 1620.633 1620.633 1615.358 + 1615.358 1613.055 1613.055 1617.986 1617.986 1621.375 + 1621.375 1622.384 1622.384 1620.382 1620.382 1622.015 + 1622.015 1626.799 1680.814 1684.021 1684.021 1691.779 + 1691.779 1697.536 1697.536 1701.068 1701.068 1711.062 + 1711.062 1721.336 1721.336 1731.674 1731.674 1735.663 + + 1661.927 1654.968 1654.968 1655.337 1655.337 1660.838 + 1660.838 1668.000 1620.165 1620.633 1620.633 1615.358 + 1615.358 1613.055 1613.055 1617.986 1617.986 1621.375 + 1621.375 1622.384 1622.384 1620.382 1620.382 1622.015 + 1622.015 1626.799 1680.814 1684.021 1684.021 1691.779 + 1691.779 1697.536 1697.536 1701.068 1701.068 1711.062 + 1711.062 1721.336 1721.336 1731.674 1731.674 1735.663 + + 1666.198 1659.011 1659.011 1655.833 1655.833 1660.351 + 1660.351 1664.948 1612.589 1612.834 1612.834 1609.751 + 1609.751 1608.318 1608.318 1612.520 1612.520 1617.260 + 1617.260 1618.438 1618.438 1617.705 1617.705 1621.107 + 1621.107 1626.759 1684.464 1687.941 1687.941 1699.960 + 1699.960 1703.765 1703.765 1709.394 1709.394 1719.391 + 1719.391 1727.805 1727.805 1737.040 1737.040 1740.213 + + 1666.198 1659.011 1659.011 1655.833 1655.833 1660.351 + 1660.351 1664.948 1662.233 1668.824 1612.834 1609.751 + 1609.751 1608.318 1608.318 1612.520 1612.520 1617.260 + 1617.260 1618.438 1618.438 1617.705 1617.705 1621.107 + 1621.107 1626.759 1684.464 1687.941 1687.941 1699.960 + 1699.960 1703.765 1703.765 1709.394 1709.394 1719.391 + 1719.391 1727.805 1727.805 1737.040 1737.040 1740.213 + + 1671.622 1666.459 1666.459 1660.861 1660.861 1662.026 + 1662.026 1664.965 1653.171 1656.680 1602.702 1602.162 + 1602.162 1602.808 1602.808 1606.403 1606.403 1613.108 + 1613.108 1615.394 1615.394 1619.042 1619.042 1624.105 + 1624.105 1629.446 1690.858 1696.104 1696.104 1709.931 + 1709.931 1713.883 1713.883 1717.109 1717.109 1725.834 + 1725.834 1733.167 1733.167 1741.445 1741.445 1745.280 + + 1671.622 1666.459 1666.459 1660.861 1660.861 1662.026 + 1662.026 1664.965 1653.171 1656.680 1602.702 1602.162 + 1602.162 1602.808 1602.808 1606.403 1606.403 1613.108 + 1613.108 1615.394 1615.394 1619.042 1619.042 1624.105 + 1624.105 1629.446 1690.858 1696.104 1696.104 1709.931 + 1709.931 1713.883 1713.883 1717.109 1717.109 1725.834 + 1725.834 1733.167 1733.167 1741.445 1741.445 1745.280 + + 1676.771 1674.271 1674.271 1670.894 1670.894 1668.437 + 1668.437 1668.429 1643.417 1644.123 1592.787 1593.037 + 1593.037 1596.113 1596.113 1601.756 1601.756 1610.739 + 1610.739 1614.524 1614.524 1623.332 1623.332 1626.945 + 1626.945 1632.635 1698.329 1706.287 1706.287 1716.892 + 1716.892 1720.553 1720.553 1723.075 1723.075 1731.914 + 1731.914 1745.177 1745.177 1751.093 1751.093 1754.307 + + 1676.771 1674.271 1674.271 1670.894 1670.894 1668.437 + 1668.437 1668.429 1643.417 1644.123 1644.123 1646.925 + 1593.037 1596.113 1596.113 1601.756 1601.756 1610.739 + 1610.739 1614.524 1614.524 1623.332 1623.332 1626.945 + 1626.945 1632.635 1698.329 1706.287 1706.287 1716.892 + 1716.892 1720.553 1720.553 1723.075 1723.075 1731.914 + 1731.914 1745.177 1745.177 1751.093 1751.093 1754.307 + + 1682.714 1680.735 1680.735 1679.607 1679.607 1676.963 + 1676.963 1674.354 1633.493 1632.763 1632.763 1634.111 + 1583.952 1586.595 1586.595 1598.319 1598.319 1609.738 + 1609.738 1617.945 1617.945 1629.494 1629.494 1630.931 + 1630.931 1636.456 1702.194 1711.393 1711.393 1720.239 + 1720.239 1724.480 1724.480 1728.128 1728.128 1737.350 + 1737.350 1762.880 1762.880 1767.916 1767.916 1767.661 + + 1682.714 1680.735 1680.735 1679.607 1679.607 1676.963 + 1676.963 1674.354 1633.493 1632.763 1632.763 1634.111 + 1583.952 1586.595 1586.595 1598.319 1598.319 1609.738 + 1609.738 1617.945 1617.945 1629.494 1629.494 1630.931 + 1630.931 1636.456 1702.194 1711.393 1711.393 1720.239 + 1720.239 1724.480 1724.480 1728.128 1728.128 1737.350 + 1737.350 1762.880 1762.880 1767.916 1767.916 1767.661 + + 1685.301 1683.963 1683.963 1685.584 1685.584 1683.771 + 1683.771 1680.256 1625.609 1624.968 1624.968 1625.904 + 1578.252 1579.917 1579.917 1592.257 1592.257 1610.887 + 1610.887 1624.047 1624.047 1631.612 1631.612 1634.298 + 1634.298 1639.631 1701.434 1709.649 1709.649 1718.878 + 1718.878 1725.106 1725.106 1729.738 1729.738 1746.357 + 1746.357 1771.691 1771.691 1774.942 1774.942 1774.516 + + 1685.301 1683.963 1683.963 1685.584 1685.584 1683.771 + 1683.771 1680.256 1625.609 1624.968 1624.968 1625.904 + 1625.904 1630.064 1579.917 1592.257 1592.257 1610.887 + 1610.887 1624.047 1624.047 1631.612 1631.612 1634.298 + 1634.298 1639.631 1639.631 1645.094 1709.649 1718.878 + 1718.878 1725.106 1725.106 1729.738 1729.738 1746.357 + 1746.357 1771.691 1771.691 1774.942 1774.942 1774.516 + + 1688.681 1686.996 1686.996 1689.181 1689.181 1687.563 + 1687.563 1683.964 1622.098 1623.144 1623.144 1624.637 + 1624.637 1625.938 1576.099 1586.296 1586.296 1610.965 + 1610.965 1623.690 1623.690 1630.807 1630.807 1635.552 + 1635.552 1641.674 1641.674 1647.916 1704.554 1714.176 + 1714.176 1723.952 1723.952 1729.876 1729.876 1755.951 + 1755.951 1772.126 1772.126 1773.041 1773.041 1772.821 + + 1688.681 1686.996 1686.996 1689.181 1689.181 1687.563 + 1687.563 1683.964 1622.098 1623.144 1623.144 1624.637 + 1624.637 1625.938 1576.099 1586.296 1586.296 1610.965 + 1610.965 1623.690 1623.690 1630.807 1630.807 1635.552 + 1635.552 1641.674 1641.674 1647.916 1704.554 1714.176 + 1714.176 1723.952 1723.952 1729.876 1729.876 1755.951 + 1755.951 1772.126 1772.126 1773.041 1773.041 1772.821 + + 1690.672 1686.547 1686.547 1687.825 1687.825 1687.691 + 1687.691 1685.405 1621.729 1624.342 1624.342 1626.731 + 1626.731 1624.855 1573.150 1578.423 1578.423 1595.387 + 1595.387 1613.365 1613.365 1627.282 1627.282 1635.832 + 1635.832 1643.117 1643.117 1650.177 1697.630 1706.570 + 1706.570 1720.788 1720.788 1732.618 1732.618 1750.895 + 1750.895 1762.102 1762.102 1765.786 1765.786 1766.189 + + 1690.672 1686.547 1686.547 1687.825 1687.825 1687.691 + 1687.691 1685.405 1621.729 1624.342 1624.342 1626.731 + 1626.731 1624.855 1624.855 1631.103 1578.423 1595.387 + 1595.387 1613.365 1613.365 1627.282 1627.282 1635.832 + 1635.832 1643.117 1643.117 1650.177 1697.630 1706.570 + 1706.570 1720.788 1720.788 1732.618 1732.618 1750.895 + 1750.895 1762.102 1762.102 1765.786 1765.786 1766.189 + + 1689.672 1684.719 1684.719 1687.241 1687.241 1687.379 + 1687.379 1685.525 1621.986 1625.133 1625.133 1628.971 + 1628.971 1627.411 1627.411 1631.221 1575.907 1587.243 + 1587.243 1604.747 1604.747 1620.764 1620.764 1635.472 + 1635.472 1643.705 1643.705 1650.995 1693.285 1702.496 + 1702.496 1719.683 1719.683 1731.423 1731.423 1743.120 + 1743.120 1752.163 1752.163 1756.869 1756.869 1757.781 + + 1689.672 1684.719 1684.719 1687.241 1687.241 1687.379 + 1687.379 1685.525 1621.986 1625.133 1625.133 1628.971 + 1628.971 1627.411 1627.411 1631.221 1575.907 1587.243 + 1587.243 1604.747 1604.747 1620.764 1620.764 1635.472 + 1635.472 1643.705 1643.705 1650.995 1693.285 1702.496 + 1702.496 1719.683 1719.683 1731.423 1731.423 1743.120 + 1743.120 1752.163 1752.163 1756.869 1756.869 1757.781 + + 1686.107 1682.820 1682.820 1686.713 1686.713 1685.704 + 1685.704 1684.058 1623.793 1628.649 1628.649 1636.593 + 1636.593 1639.256 1639.256 1633.330 1578.961 1587.478 + 1587.478 1600.692 1600.692 1615.488 1615.488 1634.412 + 1634.412 1643.446 1643.446 1649.854 1691.289 1699.491 + 1699.491 1714.697 1714.697 1725.083 1725.083 1734.877 + 1734.877 1742.828 1742.828 1747.613 1747.613 1748.685 + + 1686.107 1682.820 1682.820 1686.713 1686.713 1685.704 + 1685.704 1684.058 1684.058 1683.697 1628.649 1636.593 + 1636.593 1639.256 1639.256 1633.330 1578.961 1587.478 + 1587.478 1600.692 1600.692 1615.488 1615.488 1634.412 + 1634.412 1643.446 1643.446 1649.854 1691.289 1699.491 + 1699.491 1714.697 1714.697 1725.083 1725.083 1734.877 + 1734.877 1742.828 1742.828 1747.613 1747.613 1748.685 + + 1687.029 1682.732 1682.732 1686.477 1686.477 1684.732 + 1684.732 1683.854 1683.854 1684.751 1632.105 1639.020 + 1639.020 1640.396 1640.396 1637.583 1583.492 1591.102 + 1591.102 1599.913 1599.913 1610.610 1610.610 1631.696 + 1631.696 1645.082 1645.082 1648.218 1689.916 1697.582 + 1697.582 1708.032 1708.032 1719.025 1719.025 1727.416 + 1727.416 1733.528 1733.528 1737.624 1737.624 1738.650 + + 1687.029 1682.732 1682.732 1686.477 1686.477 1684.732 + 1684.732 1683.854 1683.854 1684.751 1684.751 1683.984 + 1639.020 1640.396 1640.396 1637.583 1637.583 1646.813 + 1591.102 1599.913 1599.913 1610.610 1610.610 1631.696 + 1631.696 1645.082 1645.082 1648.218 1648.218 1654.242 + 1697.582 1708.032 1708.032 1719.025 1719.025 1727.416 + 1727.416 1733.528 1733.528 1737.624 1737.624 1738.650 + + 1689.289 1684.830 1684.830 1685.519 1685.519 1684.952 + 1684.952 1684.869 1684.869 1685.048 1685.048 1684.432 + 1637.228 1639.292 1639.292 1642.238 1642.238 1648.281 + 1591.815 1597.142 1597.142 1604.780 1604.780 1626.423 + 1626.423 1641.681 1641.681 1646.023 1646.023 1649.928 + 1694.389 1703.249 1703.249 1712.622 1712.622 1718.623 + 1718.623 1722.838 1722.838 1727.233 1727.233 1729.023 + + 1699.490 1693.419 1684.830 1685.519 1685.519 1684.952 + 1684.952 1684.869 1684.869 1685.048 1685.048 1684.432 + 1684.432 1682.475 1639.292 1642.238 1642.238 1648.281 + 1591.815 1597.142 1597.142 1604.780 1604.780 1626.423 + 1626.423 1641.681 1641.681 1646.023 1646.023 1649.928 + 1649.928 1657.448 1703.249 1712.622 1712.622 1718.623 + 1718.623 1722.838 1722.838 1727.233 1727.233 1729.023 + + 1703.374 1694.860 1685.708 1683.979 1683.979 1683.144 + 1683.144 1683.816 1683.816 1684.242 1684.242 1684.859 + 1684.859 1683.259 1639.627 1643.364 1643.364 1648.893 + 1591.035 1594.304 1594.304 1599.019 1599.019 1616.671 + 1616.671 1632.460 1632.460 1639.921 1639.921 1645.435 + 1645.435 1654.273 1694.463 1701.598 1701.598 1706.600 + 1706.600 1710.462 1710.462 1718.124 1718.124 1721.762 + + 1703.374 1694.860 1694.860 1691.255 1683.979 1683.144 + 1683.144 1683.816 1683.816 1684.242 1684.242 1684.859 + 1684.859 1683.259 1683.259 1678.102 1643.364 1648.893 + 1648.893 1656.990 1594.304 1599.019 1599.019 1616.671 + 1616.671 1632.460 1632.460 1639.921 1639.921 1645.435 + 1645.435 1654.273 1654.273 1666.652 1701.598 1706.600 + 1706.600 1710.462 1710.462 1718.124 1718.124 1721.762 + + 1708.001 1697.627 1697.627 1693.293 1683.354 1682.103 + 1682.103 1683.872 1683.872 1684.524 1684.524 1684.531 + 1684.531 1682.621 1682.621 1676.874 1644.092 1649.167 + 1649.167 1655.651 1595.724 1602.816 1602.816 1615.200 + 1615.200 1625.972 1625.972 1631.782 1631.782 1641.506 + 1641.506 1650.482 1650.482 1665.896 1684.698 1692.693 + 1692.693 1703.143 1703.143 1713.364 1713.364 1717.449 + + 1708.001 1697.627 1697.627 1693.293 1693.293 1690.228 + 1682.103 1683.872 1683.872 1684.524 1684.524 1684.531 + 1684.531 1682.621 1682.621 1676.874 1676.874 1669.929 + 1669.929 1665.084 1665.084 1665.272 1602.816 1615.200 + 1615.200 1625.972 1625.972 1631.782 1631.782 1641.506 + 1641.506 1650.482 1650.482 1665.896 1684.698 1692.693 + 1692.693 1703.143 1703.143 1713.364 1713.364 1717.449 + + 1712.832 1702.626 1702.626 1696.255 1696.255 1692.122 + 1679.721 1679.173 1679.173 1681.909 1681.909 1683.267 + 1683.267 1680.065 1680.065 1673.385 1673.385 1666.806 + 1666.806 1663.272 1663.272 1660.874 1608.388 1616.830 + 1616.830 1623.631 1623.631 1629.371 1629.371 1636.760 + 1636.760 1646.824 1646.824 1664.835 1664.835 1681.692 + 1681.692 1697.334 1697.334 1709.163 1709.163 1713.774 + + 1712.832 1702.626 1702.626 1696.255 1696.255 1692.122 + 1692.122 1690.469 1679.173 1681.909 1681.909 1683.267 + 1683.267 1680.065 1680.065 1673.385 1673.385 1666.806 + 1666.806 1663.272 1663.272 1660.874 1660.874 1664.434 + 1616.830 1623.631 1623.631 1629.371 1629.371 1636.760 + 1636.760 1646.824 1646.824 1664.835 1664.835 1681.692 + 1681.692 1697.334 1697.334 1709.163 1709.163 1713.774 + + 1716.025 1706.236 1706.236 1699.229 1699.229 1694.570 + 1694.570 1692.919 1675.940 1677.222 1677.222 1678.102 + 1678.102 1673.030 1673.030 1664.813 1664.813 1661.868 + 1661.868 1661.734 1661.734 1660.417 1660.417 1660.300 + 1620.185 1625.626 1625.626 1632.274 1632.274 1637.813 + 1637.813 1648.018 1648.018 1663.538 1663.538 1678.357 + 1678.357 1694.592 1694.592 1707.172 1707.172 1711.933 + + 1716.025 1706.236 1706.236 1699.229 1699.229 1694.570 + 1694.570 1692.919 1675.940 1677.222 1677.222 1678.102 + 1678.102 1673.030 1673.030 1664.813 1664.813 1661.868 + 1661.868 1661.734 1661.734 1660.417 1660.417 1660.300 + 1660.300 1665.746 1625.626 1632.274 1632.274 1637.813 + 1637.813 1648.018 1648.018 1663.538 1663.538 1678.357 + 1678.357 1694.592 1694.592 1707.172 1707.172 1711.933 + + 1718.967 1710.535 1710.535 1703.228 1703.228 1697.010 + 1697.010 1697.293 1674.437 1672.729 1672.729 1669.875 + 1669.875 1662.165 1662.165 1653.741 1653.741 1655.951 + 1655.951 1659.212 1659.212 1659.747 1659.747 1660.347 + 1660.347 1664.334 1630.717 1635.914 1635.914 1642.770 + 1642.770 1655.321 1655.321 1669.278 1669.278 1680.782 + 1680.782 1695.724 1695.724 1707.959 1707.959 1712.537 + + 1655.163 1658.798 1658.798 1673.141 1673.141 1687.162 + 1687.162 1696.731 1667.102 1669.438 1669.438 1676.565 + 1676.565 1680.393 1680.393 1677.579 1677.579 1674.678 + 1674.678 1675.988 1675.988 1678.130 1703.150 1712.097 + 1712.097 1712.966 1712.966 1714.240 1714.240 1715.594 + 1715.594 1713.573 1713.573 1720.990 1720.990 1734.393 + 1734.393 1743.374 1743.374 1751.729 1751.729 1755.792 + + 1656.610 1662.031 1662.031 1673.501 1673.501 1685.269 + 1685.269 1693.947 1662.587 1665.179 1665.179 1672.576 + 1672.576 1676.286 1676.286 1676.442 1676.442 1673.893 + 1673.893 1671.914 1671.914 1671.009 1694.810 1702.872 + 1702.872 1705.346 1705.346 1705.106 1705.106 1704.564 + 1704.564 1701.276 1701.276 1707.374 1707.374 1719.840 + 1719.840 1731.480 1731.480 1740.580 1740.580 1744.895 + 1656.610 1662.031 1662.031 1673.501 1673.501 1685.269 + 1685.269 1693.947 1662.587 1665.179 1665.179 1672.576 + 1672.576 1676.286 1676.286 1676.442 1676.442 1673.893 + 1673.893 1671.914 1671.914 1671.009 1671.009 1672.091 + 1702.872 1705.346 1705.346 1705.106 1705.106 1704.564 + 1704.564 1701.276 1701.276 1707.374 1707.374 1719.840 + 1719.840 1731.480 1731.480 1740.580 1740.580 1744.895 + + 1659.630 1661.049 1661.049 1671.328 1671.328 1683.310 + 1683.310 1691.210 1657.102 1660.370 1660.370 1664.768 + 1664.768 1667.525 1667.525 1669.460 1669.460 1664.610 + 1664.610 1662.606 1662.606 1661.266 1661.266 1661.757 + 1693.955 1696.489 1696.489 1697.700 1697.700 1696.370 + 1696.370 1694.116 1694.116 1697.976 1697.976 1711.038 + 1711.038 1724.891 1724.891 1733.737 1733.737 1737.912 + 1659.630 1661.049 1661.049 1671.328 1671.328 1683.310 + 1683.310 1691.210 1657.102 1660.370 1660.370 1664.768 + 1664.768 1667.525 1667.525 1669.460 1669.460 1664.610 + 1664.610 1662.606 1662.606 1661.266 1661.266 1661.757 + 1693.955 1696.489 1696.489 1697.700 1697.700 1696.370 + 1696.370 1694.116 1694.116 1697.976 1697.976 1711.038 + 1711.038 1724.891 1724.891 1733.737 1733.737 1737.912 + + 1662.045 1657.137 1657.137 1667.722 1667.722 1679.455 + 1679.455 1687.544 1649.684 1652.799 1652.799 1653.692 + 1653.692 1653.493 1653.493 1654.077 1654.077 1649.212 + 1649.212 1650.047 1650.047 1647.466 1647.466 1649.510 + 1687.020 1689.833 1689.833 1690.917 1690.917 1691.187 + 1691.187 1691.679 1691.679 1693.309 1693.309 1700.840 + 1700.840 1719.180 1719.180 1729.837 1729.837 1733.810 + 1662.045 1657.137 1657.137 1667.722 1667.722 1679.455 + 1679.455 1687.544 1649.684 1652.799 1652.799 1653.692 + 1653.692 1653.493 1653.493 1654.077 1654.077 1649.212 + 1649.212 1650.047 1650.047 1647.466 1647.466 1649.510 + 1687.020 1689.833 1689.833 1690.917 1690.917 1691.187 + 1691.187 1691.679 1691.679 1693.309 1693.309 1700.840 + 1700.840 1719.180 1719.180 1729.837 1729.837 1733.810 + + 1660.517 1653.606 1653.606 1663.415 1663.415 1674.833 + 1674.833 1682.909 1640.838 1641.789 1641.789 1638.485 + 1638.485 1640.197 1640.197 1640.293 1640.293 1637.576 + 1637.576 1638.057 1638.057 1636.040 1636.040 1639.083 + 1682.414 1685.317 1685.317 1687.584 1687.584 1689.165 + 1689.165 1691.757 1691.757 1690.077 1690.077 1699.298 + 1699.298 1715.610 1715.610 1728.556 1728.556 1732.349 + 1660.517 1653.606 1653.606 1663.415 1663.415 1674.833 + 1674.833 1682.909 1640.838 1641.789 1641.789 1638.485 + 1638.485 1640.197 1640.197 1640.293 1640.293 1637.576 + 1637.576 1638.057 1638.057 1636.040 1636.040 1639.083 + 1682.414 1685.317 1685.317 1687.584 1687.584 1689.165 + 1689.165 1691.757 1691.757 1690.077 1690.077 1699.298 + 1699.298 1715.610 1715.610 1728.556 1728.556 1732.349 + + 1660.135 1654.055 1654.055 1660.839 1660.839 1670.546 + 1670.546 1678.707 1633.274 1632.324 1632.324 1629.662 + 1629.662 1629.396 1629.396 1630.160 1630.160 1631.255 + 1631.255 1631.785 1631.785 1630.702 1630.702 1632.936 + 1680.150 1683.125 1683.125 1685.994 1685.994 1688.212 + 1688.212 1691.994 1691.994 1691.320 1691.320 1702.774 + 1702.774 1717.135 1717.135 1729.377 1729.377 1732.981 + 1660.135 1654.055 1654.055 1660.839 1660.839 1670.546 + 1670.546 1678.707 1633.274 1632.324 1632.324 1629.662 + 1629.662 1629.396 1629.396 1630.160 1630.160 1631.255 + 1631.255 1631.785 1631.785 1630.702 1630.702 1632.936 + 1632.936 1637.799 1683.125 1685.994 1685.994 1688.212 + 1688.212 1691.994 1691.994 1691.320 1691.320 1702.774 + 1702.774 1717.135 1717.135 1729.377 1729.377 1732.981 + + 1661.752 1656.124 1656.124 1659.923 1659.923 1666.902 + 1666.902 1674.711 1628.167 1628.124 1628.124 1623.883 + 1623.883 1621.337 1621.337 1625.776 1625.776 1628.332 + 1628.332 1628.966 1628.966 1627.053 1627.053 1628.443 + 1628.443 1632.837 1682.737 1686.056 1686.056 1690.098 + 1690.098 1696.596 1696.596 1697.568 1697.568 1708.502 + 1708.502 1719.924 1719.924 1730.858 1730.858 1734.658 + 1661.752 1656.124 1656.124 1659.923 1659.923 1666.902 + 1666.902 1674.711 1628.167 1628.124 1628.124 1623.883 + 1623.883 1621.337 1621.337 1625.776 1625.776 1628.332 + 1628.332 1628.966 1628.966 1627.053 1627.053 1628.443 + 1628.443 1632.837 1682.737 1686.056 1686.056 1690.098 + 1690.098 1696.596 1696.596 1697.568 1697.568 1708.502 + 1708.502 1719.924 1719.924 1730.858 1730.858 1734.658 + + 1664.996 1658.059 1658.059 1658.064 1658.064 1663.533 + 1663.533 1670.842 1623.272 1623.821 1623.821 1618.259 + 1618.259 1616.387 1616.387 1621.270 1621.270 1624.601 + 1624.601 1625.448 1625.448 1623.472 1623.472 1625.146 + 1625.146 1629.928 1684.079 1687.286 1687.286 1695.155 + 1695.155 1700.900 1700.900 1704.462 1704.462 1714.672 + 1714.672 1724.726 1724.726 1734.436 1734.436 1738.043 + 1664.996 1658.059 1658.059 1658.064 1658.064 1663.533 + 1663.533 1670.842 1623.272 1623.821 1623.821 1618.259 + 1618.259 1616.387 1616.387 1621.270 1621.270 1624.601 + 1624.601 1625.448 1625.448 1623.472 1623.472 1625.146 + 1625.146 1629.928 1684.079 1687.286 1687.286 1695.155 + 1695.155 1700.900 1700.900 1704.462 1704.462 1714.672 + 1714.672 1724.726 1724.726 1734.436 1734.436 1738.043 + + 1669.243 1662.586 1662.586 1658.447 1658.447 1662.900 + 1662.900 1667.677 1615.766 1616.123 1616.123 1612.809 + 1612.809 1611.571 1611.571 1615.916 1615.916 1620.556 + 1620.556 1621.536 1621.536 1620.856 1620.856 1624.307 + 1624.307 1629.912 1688.067 1691.683 1691.683 1703.399 + 1703.399 1707.118 1707.118 1712.759 1712.759 1722.991 + 1722.991 1731.043 1731.043 1739.643 1739.643 1742.658 + 1669.243 1662.586 1662.586 1658.447 1658.447 1662.900 + 1662.900 1667.677 1665.116 1672.009 1616.123 1612.809 + 1612.809 1611.571 1611.571 1615.916 1615.916 1620.556 + 1620.556 1621.536 1621.536 1620.856 1620.856 1624.307 + 1624.307 1629.912 1688.067 1691.683 1691.683 1703.399 + 1703.399 1707.118 1707.118 1712.759 1712.759 1722.991 + 1722.991 1731.043 1731.043 1739.643 1739.643 1742.658 + + 1674.543 1670.081 1670.081 1663.903 1663.903 1664.716 + 1664.716 1667.608 1656.230 1659.616 1605.922 1605.250 + 1605.250 1606.136 1606.136 1609.884 1609.884 1616.456 + 1616.456 1618.623 1618.623 1622.309 1622.309 1627.358 + 1627.358 1632.703 1694.525 1699.679 1699.679 1713.297 + 1713.297 1717.197 1717.197 1720.418 1720.418 1729.393 + 1729.393 1736.744 1736.744 1744.641 1744.641 1748.120 + 1674.543 1670.081 1670.081 1663.903 1663.903 1664.716 + 1664.716 1667.608 1656.230 1659.616 1605.922 1605.250 + 1605.250 1606.136 1606.136 1609.884 1609.884 1616.456 + 1616.456 1618.623 1618.623 1622.309 1622.309 1627.358 + 1627.358 1632.703 1694.525 1699.679 1699.679 1713.297 + 1713.297 1717.197 1717.197 1720.418 1720.418 1729.393 + 1729.393 1736.744 1736.744 1744.641 1744.641 1748.120 + + 1679.630 1677.515 1677.515 1674.068 1674.068 1671.302 + 1671.302 1671.092 1646.842 1647.089 1595.959 1596.224 + 1596.224 1599.450 1599.450 1605.044 1605.044 1614.075 + 1614.075 1617.863 1617.863 1626.615 1626.615 1630.393 + 1630.393 1636.135 1702.025 1709.739 1709.739 1720.343 + 1720.343 1723.864 1723.864 1726.453 1726.453 1735.416 + 1735.416 1747.796 1747.796 1754.223 1754.223 1757.131 + 1679.630 1677.515 1677.515 1674.068 1674.068 1671.302 + 1671.302 1671.092 1646.842 1647.089 1647.089 1649.392 + 1596.224 1599.450 1599.450 1605.044 1605.044 1614.075 + 1614.075 1617.863 1617.863 1626.615 1626.615 1630.393 + 1630.393 1636.135 1702.025 1709.739 1709.739 1720.343 + 1720.343 1723.864 1723.864 1726.453 1726.453 1735.416 + 1735.416 1747.796 1747.796 1754.223 1754.223 1757.131 + + 1685.570 1683.893 1683.893 1682.614 1682.614 1680.007 + 1680.007 1677.192 1637.344 1636.011 1636.011 1636.602 + 1587.075 1589.895 1589.895 1601.761 1601.761 1613.145 + 1613.145 1621.500 1621.500 1632.696 1632.696 1634.310 + 1634.310 1639.918 1706.128 1715.093 1715.093 1723.585 + 1723.585 1727.800 1727.800 1731.584 1731.584 1741.152 + 1741.152 1764.944 1764.944 1770.129 1770.129 1770.011 + 1685.570 1683.893 1683.893 1682.614 1682.614 1680.007 + 1680.007 1677.192 1637.344 1636.011 1636.011 1636.602 + 1587.075 1589.895 1589.895 1601.761 1601.761 1613.145 + 1613.145 1621.500 1621.500 1632.696 1632.696 1634.310 + 1634.310 1639.918 1706.128 1715.093 1715.093 1723.585 + 1723.585 1727.800 1727.800 1731.584 1731.584 1741.152 + 1741.152 1764.944 1764.944 1770.129 1770.129 1770.011 + + 1688.193 1687.013 1687.013 1688.405 1688.405 1686.886 + 1686.886 1683.260 1629.789 1628.426 1628.426 1628.423 + 1581.335 1583.050 1583.050 1595.657 1595.657 1614.324 + 1614.324 1627.490 1627.490 1634.856 1634.856 1637.595 + 1637.595 1642.920 1705.487 1713.360 1713.360 1722.373 + 1722.373 1728.532 1728.532 1733.235 1733.235 1750.414 + 1750.414 1774.853 1774.853 1777.352 1777.352 1776.921 + 1688.193 1687.013 1687.013 1688.405 1688.405 1686.886 + 1686.886 1683.260 1629.789 1628.426 1628.426 1628.423 + 1628.423 1631.794 1583.050 1595.657 1595.657 1614.324 + 1614.324 1627.490 1627.490 1634.856 1634.856 1637.595 + 1637.595 1642.920 1642.920 1648.410 1713.360 1722.373 + 1722.373 1728.532 1728.532 1733.235 1733.235 1750.414 + 1750.414 1774.853 1774.853 1777.352 1777.352 1776.921 + + 1691.726 1689.949 1689.949 1692.014 1692.014 1690.702 + 1690.702 1687.033 1626.474 1626.780 1626.780 1627.205 + 1627.205 1627.565 1579.199 1589.658 1589.658 1614.626 + 1614.626 1627.166 1627.166 1634.126 1634.126 1638.887 + 1638.887 1644.925 1644.925 1651.130 1708.223 1717.711 + 1717.711 1727.405 1727.405 1733.403 1733.403 1758.695 + 1758.695 1774.781 1774.781 1775.614 1775.614 1775.408 + 1691.726 1689.949 1689.949 1692.014 1692.014 1690.702 + 1690.702 1687.033 1626.474 1626.780 1626.780 1627.205 + 1627.205 1627.565 1579.199 1589.658 1589.658 1614.626 + 1614.626 1627.166 1627.166 1634.126 1634.126 1638.887 + 1638.887 1644.925 1644.925 1651.130 1708.223 1717.711 + 1717.711 1727.405 1727.405 1733.403 1733.403 1758.695 + 1758.695 1774.781 1774.781 1775.614 1775.614 1775.408 + + 1693.832 1689.655 1689.655 1690.680 1690.680 1690.743 + 1690.743 1688.446 1626.423 1628.378 1628.378 1629.811 + 1629.811 1626.720 1576.251 1581.660 1581.660 1598.928 + 1598.928 1617.047 1617.047 1630.802 1630.802 1639.225 + 1639.225 1646.218 1646.218 1653.212 1701.434 1710.153 + 1710.153 1724.403 1724.403 1736.226 1736.226 1753.940 + 1753.940 1764.633 1764.633 1768.428 1768.428 1768.852 + 1693.832 1689.655 1689.655 1690.680 1690.680 1690.743 + 1690.743 1688.446 1626.423 1628.378 1628.378 1629.811 + 1629.811 1626.720 1626.720 1632.595 1581.660 1598.928 + 1598.928 1617.047 1617.047 1630.802 1630.802 1639.225 + 1639.225 1646.218 1646.218 1653.212 1701.434 1710.153 + 1710.153 1724.403 1724.403 1736.226 1736.226 1753.940 + 1753.940 1764.633 1764.633 1768.428 1768.428 1768.852 + + 1692.971 1687.744 1687.744 1690.049 1690.049 1690.391 + 1690.391 1688.539 1627.344 1630.173 1630.173 1633.577 + 1633.577 1630.506 1630.506 1633.222 1579.077 1590.633 + 1590.633 1608.260 1608.260 1624.448 1624.448 1639.035 + 1639.035 1646.830 1646.830 1653.973 1697.098 1706.112 + 1706.112 1723.326 1723.326 1734.390 1734.390 1745.861 + 1745.861 1754.832 1754.832 1759.640 1759.640 1760.547 + 1692.971 1687.744 1687.744 1690.049 1690.049 1690.391 + 1690.391 1688.539 1627.344 1630.173 1630.173 1633.577 + 1633.577 1630.506 1630.506 1633.222 1579.077 1590.633 + 1590.633 1608.260 1608.260 1624.448 1624.448 1639.035 + 1639.035 1646.830 1646.830 1653.973 1697.098 1706.112 + 1706.112 1723.326 1723.326 1734.390 1734.390 1745.861 + 1745.861 1754.832 1754.832 1759.640 1759.640 1760.547 + + 1689.414 1685.722 1685.722 1689.600 1689.600 1688.764 + 1688.764 1687.065 1629.680 1634.444 1634.444 1642.151 + 1642.151 1642.840 1642.840 1635.335 1582.179 1590.838 + 1590.838 1604.039 1604.039 1619.257 1619.257 1638.028 + 1638.028 1646.787 1646.787 1653.083 1695.351 1703.206 + 1703.206 1718.298 1718.298 1727.723 1727.723 1737.416 + 1737.416 1745.582 1745.582 1750.504 1750.504 1751.552 + 1689.414 1685.722 1685.722 1689.600 1689.600 1688.764 + 1688.764 1687.065 1687.065 1686.624 1634.444 1642.151 + 1642.151 1642.840 1642.840 1635.335 1582.179 1590.838 + 1590.838 1604.039 1604.039 1619.257 1619.257 1638.028 + 1638.028 1646.787 1646.787 1653.083 1695.351 1703.206 + 1703.206 1718.298 1718.298 1727.723 1727.723 1737.416 + 1737.416 1745.582 1745.582 1750.504 1750.504 1751.552 + + 1690.177 1685.715 1685.715 1689.467 1689.467 1687.889 + 1687.889 1686.839 1686.839 1687.822 1637.959 1644.644 + 1644.644 1646.020 1646.020 1640.875 1586.778 1594.486 + 1594.486 1603.151 1603.151 1614.367 1614.367 1635.411 + 1635.411 1648.447 1648.447 1651.325 1694.315 1701.547 + 1701.547 1711.559 1711.559 1722.013 1722.013 1730.153 + 1730.153 1736.355 1736.355 1740.545 1740.545 1741.526 + 1690.177 1685.715 1685.715 1689.467 1689.467 1687.889 + 1687.889 1686.839 1686.839 1687.822 1687.822 1686.997 + 1644.644 1646.020 1646.020 1640.875 1640.875 1648.804 + 1594.486 1603.151 1603.151 1614.367 1614.367 1635.411 + 1635.411 1648.447 1648.447 1651.325 1651.325 1657.294 + 1701.547 1711.559 1711.559 1722.013 1722.013 1730.153 + 1730.153 1736.355 1736.355 1740.545 1740.545 1741.526 + + 1692.199 1687.733 1687.733 1688.542 1688.542 1687.999 + 1687.999 1687.823 1687.823 1688.202 1688.202 1687.532 + 1642.857 1644.481 1644.481 1645.946 1645.946 1650.871 + 1595.071 1600.364 1600.364 1608.422 1608.422 1630.246 + 1630.246 1645.115 1645.115 1649.112 1649.112 1653.036 + 1698.496 1706.916 1706.916 1715.639 1715.639 1721.487 + 1721.487 1725.758 1725.758 1730.182 1730.182 1731.859 + 1702.511 1696.457 1687.733 1688.542 1688.542 1687.999 + 1687.999 1687.823 1687.823 1688.202 1688.202 1687.532 + 1687.532 1685.512 1644.481 1645.946 1645.946 1650.871 + 1595.071 1600.364 1600.364 1608.422 1608.422 1630.246 + 1630.246 1645.115 1645.115 1649.112 1649.112 1653.036 + 1653.036 1660.824 1706.916 1715.639 1715.639 1721.487 + 1721.487 1725.758 1725.758 1730.182 1730.182 1731.859 + + 1706.329 1697.894 1688.493 1686.997 1686.997 1686.204 + 1686.204 1686.833 1686.833 1687.389 1687.389 1687.987 + 1687.987 1686.403 1644.413 1647.273 1647.273 1651.910 + 1594.235 1597.522 1597.522 1602.438 1602.438 1620.477 + 1620.477 1635.895 1635.895 1643.352 1643.352 1648.772 + 1648.772 1657.692 1697.912 1704.405 1704.405 1709.345 + 1709.345 1713.392 1713.392 1721.154 1721.154 1724.613 + 1706.329 1697.894 1697.894 1694.244 1686.997 1686.204 + 1686.204 1686.833 1686.833 1687.389 1687.389 1687.987 + 1687.987 1686.403 1686.403 1681.110 1647.273 1651.910 + 1651.910 1659.253 1597.522 1602.438 1602.438 1620.477 + 1620.477 1635.895 1635.895 1643.352 1643.352 1648.772 + 1648.772 1657.692 1657.692 1670.308 1704.405 1709.345 + 1709.345 1713.392 1713.392 1721.154 1721.154 1724.613 + + 1710.825 1700.573 1700.573 1696.337 1686.281 1685.193 + 1685.193 1686.847 1686.847 1687.587 1687.587 1687.608 + 1687.608 1685.738 1685.738 1679.931 1648.091 1652.499 + 1652.499 1658.512 1599.062 1606.310 1606.310 1618.753 + 1618.753 1629.337 1629.337 1635.194 1635.194 1644.887 + 1644.887 1654.061 1654.061 1669.358 1687.151 1695.267 + 1695.267 1706.000 1706.000 1716.367 1716.367 1720.287 + 1710.825 1700.573 1700.573 1696.337 1696.337 1693.198 + 1685.193 1686.847 1686.847 1687.587 1687.587 1687.608 + 1687.608 1685.738 1685.738 1679.931 1679.931 1672.869 + 1672.869 1668.021 1668.021 1667.740 1606.310 1618.753 + 1618.753 1629.337 1629.337 1635.194 1635.194 1644.887 + 1644.887 1654.061 1654.061 1669.358 1687.151 1695.267 + 1695.267 1706.000 1706.000 1716.367 1716.367 1720.287 + + 1715.639 1705.528 1705.528 1699.266 1699.266 1695.178 + 1682.759 1682.275 1682.275 1684.935 1684.935 1686.347 + 1686.347 1683.153 1683.153 1676.368 1676.368 1669.781 + 1669.781 1666.390 1666.390 1664.031 1611.921 1620.267 + 1620.267 1627.016 1627.016 1632.803 1632.803 1640.142 + 1640.142 1650.296 1650.296 1667.581 1667.581 1684.173 + 1684.173 1700.030 1700.030 1712.098 1712.098 1716.573 + 1715.639 1705.528 1705.528 1699.266 1699.266 1695.178 + 1695.178 1693.387 1682.275 1684.935 1684.935 1686.347 + 1686.347 1683.153 1683.153 1676.368 1676.368 1669.781 + 1669.781 1666.390 1666.390 1664.031 1664.031 1667.085 + 1620.267 1627.016 1627.016 1632.803 1632.803 1640.142 + 1640.142 1650.296 1650.296 1667.581 1667.581 1684.173 + 1684.173 1700.030 1700.030 1712.098 1712.098 1716.573 + + 1718.831 1709.120 1709.120 1702.204 1702.204 1697.656 + 1697.656 1695.945 1679.045 1680.327 1680.327 1681.129 + 1681.129 1676.027 1676.027 1667.690 1667.690 1664.921 + 1664.921 1664.936 1664.936 1663.684 1663.684 1663.446 + 1623.690 1629.092 1629.092 1635.704 1635.704 1641.198 + 1641.198 1651.499 1651.499 1666.353 1666.353 1680.721 + 1680.721 1697.237 1697.237 1710.020 1710.020 1714.679 + 1718.831 1709.120 1709.120 1702.204 1702.204 1697.656 + 1697.656 1695.945 1679.045 1680.327 1680.327 1681.129 + 1681.129 1676.027 1676.027 1667.690 1667.690 1664.921 + 1664.921 1664.936 1664.936 1663.684 1663.684 1663.446 + 1663.446 1668.585 1629.092 1635.704 1635.704 1641.198 + 1641.198 1651.499 1651.499 1666.353 1666.353 1680.721 + 1680.721 1697.237 1697.237 1710.020 1710.020 1714.679 + + 1721.849 1713.440 1713.440 1706.154 1706.154 1700.039 + 1700.039 1700.378 1677.362 1675.777 1675.777 1672.938 + 1672.938 1665.257 1665.257 1656.844 1656.844 1659.095 + 1659.095 1662.418 1662.418 1663.070 1663.070 1663.712 + 1663.712 1667.655 1634.271 1639.407 1639.407 1646.239 + 1646.239 1658.756 1658.756 1672.443 1672.443 1683.466 + 1683.466 1698.435 1698.435 1710.788 1710.788 1715.282 + 1655.163 1658.798 1658.798 1673.141 1673.141 1687.162 + 1687.162 1696.731 1667.102 1669.438 1669.438 1676.565 + 1676.565 1680.393 1680.393 1677.579 1677.579 1674.678 + 1674.678 1675.988 1675.988 1678.130 1703.150 1712.097 + 1712.097 1712.966 1712.966 1714.240 1714.240 1715.594 + 1715.594 1713.573 1713.573 1720.990 1720.990 1734.393 + 1734.393 1743.374 1743.374 1751.729 1751.729 1755.792 + + 1656.610 1662.031 1662.031 1673.501 1673.501 1685.269 + 1685.269 1693.947 1662.587 1665.179 1665.179 1672.576 + 1672.576 1676.286 1676.286 1676.442 1676.442 1673.893 + 1673.893 1671.914 1671.914 1671.009 1694.810 1702.872 + 1702.872 1705.346 1705.346 1705.106 1705.106 1704.564 + 1704.564 1701.276 1701.276 1707.374 1707.374 1719.840 + 1719.840 1731.480 1731.480 1740.580 1740.580 1744.895 + + 1656.610 1662.031 1662.031 1673.501 1673.501 1685.269 + 1685.269 1693.947 1662.587 1665.179 1665.179 1672.576 + 1672.576 1676.286 1676.286 1676.442 1676.442 1673.893 + 1673.893 1671.914 1671.914 1671.009 1671.009 1672.091 + 1702.872 1705.346 1705.346 1705.106 1705.106 1704.564 + 1704.564 1701.276 1701.276 1707.374 1707.374 1719.840 + 1719.840 1731.480 1731.480 1740.580 1740.580 1744.895 + + 1659.630 1661.049 1661.049 1671.328 1671.328 1683.310 + 1683.310 1691.210 1657.102 1660.370 1660.370 1664.768 + 1664.768 1667.525 1667.525 1669.460 1669.460 1664.610 + 1664.610 1662.606 1662.606 1661.266 1661.266 1661.757 + 1693.955 1696.489 1696.489 1697.700 1697.700 1696.370 + 1696.370 1694.116 1694.116 1697.976 1697.976 1711.038 + 1711.038 1724.891 1724.891 1733.737 1733.737 1737.912 + + 1659.630 1661.049 1661.049 1671.328 1671.328 1683.310 + 1683.310 1691.210 1657.102 1660.370 1660.370 1664.768 + 1664.768 1667.525 1667.525 1669.460 1669.460 1664.610 + 1664.610 1662.606 1662.606 1661.266 1661.266 1661.757 + 1693.955 1696.489 1696.489 1697.700 1697.700 1696.370 + 1696.370 1694.116 1694.116 1697.976 1697.976 1711.038 + 1711.038 1724.891 1724.891 1733.737 1733.737 1737.912 + + 1662.045 1657.137 1657.137 1667.722 1667.722 1679.455 + 1679.455 1687.544 1649.684 1652.799 1652.799 1653.692 + 1653.692 1653.493 1653.493 1654.077 1654.077 1649.212 + 1649.212 1650.047 1650.047 1647.466 1647.466 1649.510 + 1687.020 1689.833 1689.833 1690.917 1690.917 1691.187 + 1691.187 1691.679 1691.679 1693.309 1693.309 1700.840 + 1700.840 1719.180 1719.180 1729.837 1729.837 1733.810 + + 1662.045 1657.137 1657.137 1667.722 1667.722 1679.455 + 1679.455 1687.544 1649.684 1652.799 1652.799 1653.692 + 1653.692 1653.493 1653.493 1654.077 1654.077 1649.212 + 1649.212 1650.047 1650.047 1647.466 1647.466 1649.510 + 1687.020 1689.833 1689.833 1690.917 1690.917 1691.187 + 1691.187 1691.679 1691.679 1693.309 1693.309 1700.840 + 1700.840 1719.180 1719.180 1729.837 1729.837 1733.810 + + 1660.517 1653.606 1653.606 1663.415 1663.415 1674.833 + 1674.833 1682.909 1640.838 1641.789 1641.789 1638.485 + 1638.485 1640.197 1640.197 1640.293 1640.293 1637.576 + 1637.576 1638.057 1638.057 1636.040 1636.040 1639.083 + 1682.414 1685.317 1685.317 1687.584 1687.584 1689.165 + 1689.165 1691.757 1691.757 1690.077 1690.077 1699.298 + 1699.298 1715.610 1715.610 1728.556 1728.556 1732.349 + + 1660.517 1653.606 1653.606 1663.415 1663.415 1674.833 + 1674.833 1682.909 1640.838 1641.789 1641.789 1638.485 + 1638.485 1640.197 1640.197 1640.293 1640.293 1637.576 + 1637.576 1638.057 1638.057 1636.040 1636.040 1639.083 + 1682.414 1685.317 1685.317 1687.584 1687.584 1689.165 + 1689.165 1691.757 1691.757 1690.077 1690.077 1699.298 + 1699.298 1715.610 1715.610 1728.556 1728.556 1732.349 + + 1660.135 1654.055 1654.055 1660.839 1660.839 1670.546 + 1670.546 1678.707 1633.274 1632.324 1632.324 1629.662 + 1629.662 1629.396 1629.396 1630.160 1630.160 1631.255 + 1631.255 1631.785 1631.785 1630.702 1630.702 1632.936 + 1680.150 1683.125 1683.125 1685.994 1685.994 1688.212 + 1688.212 1691.994 1691.994 1691.320 1691.320 1702.774 + 1702.774 1717.135 1717.135 1729.377 1729.377 1732.981 + + 1660.135 1654.055 1654.055 1660.839 1660.839 1670.546 + 1670.546 1678.707 1633.274 1632.324 1632.324 1629.662 + 1629.662 1629.396 1629.396 1630.160 1630.160 1631.255 + 1631.255 1631.785 1631.785 1630.702 1630.702 1632.936 + 1632.936 1637.799 1683.125 1685.994 1685.994 1688.212 + 1688.212 1691.994 1691.994 1691.320 1691.320 1702.774 + 1702.774 1717.135 1717.135 1729.377 1729.377 1732.981 + + 1661.752 1656.124 1656.124 1659.923 1659.923 1666.902 + 1666.902 1674.711 1628.167 1628.124 1628.124 1623.883 + 1623.883 1621.337 1621.337 1625.776 1625.776 1628.332 + 1628.332 1628.966 1628.966 1627.053 1627.053 1628.443 + 1628.443 1632.837 1682.737 1686.056 1686.056 1690.098 + 1690.098 1696.596 1696.596 1697.568 1697.568 1708.502 + 1708.502 1719.924 1719.924 1730.858 1730.858 1734.658 + + 1661.752 1656.124 1656.124 1659.923 1659.923 1666.902 + 1666.902 1674.711 1628.167 1628.124 1628.124 1623.883 + 1623.883 1621.337 1621.337 1625.776 1625.776 1628.332 + 1628.332 1628.966 1628.966 1627.053 1627.053 1628.443 + 1628.443 1632.837 1682.737 1686.056 1686.056 1690.098 + 1690.098 1696.596 1696.596 1697.568 1697.568 1708.502 + 1708.502 1719.924 1719.924 1730.858 1730.858 1734.658 + + 1664.996 1658.059 1658.059 1658.064 1658.064 1663.533 + 1663.533 1670.842 1623.272 1623.821 1623.821 1618.259 + 1618.259 1616.387 1616.387 1621.270 1621.270 1624.601 + 1624.601 1625.448 1625.448 1623.472 1623.472 1625.146 + 1625.146 1629.928 1684.079 1687.286 1687.286 1695.155 + 1695.155 1700.900 1700.900 1704.462 1704.462 1714.672 + 1714.672 1724.726 1724.726 1734.436 1734.436 1738.043 + + 1664.996 1658.059 1658.059 1658.064 1658.064 1663.533 + 1663.533 1670.842 1623.272 1623.821 1623.821 1618.259 + 1618.259 1616.387 1616.387 1621.270 1621.270 1624.601 + 1624.601 1625.448 1625.448 1623.472 1623.472 1625.146 + 1625.146 1629.928 1684.079 1687.286 1687.286 1695.155 + 1695.155 1700.900 1700.900 1704.462 1704.462 1714.672 + 1714.672 1724.726 1724.726 1734.436 1734.436 1738.043 + + 1669.243 1662.586 1662.586 1658.447 1658.447 1662.900 + 1662.900 1667.677 1615.766 1616.123 1616.123 1612.809 + 1612.809 1611.571 1611.571 1615.916 1615.916 1620.556 + 1620.556 1621.536 1621.536 1620.856 1620.856 1624.307 + 1624.307 1629.912 1688.067 1691.683 1691.683 1703.399 + 1703.399 1707.118 1707.118 1712.759 1712.759 1722.991 + 1722.991 1731.043 1731.043 1739.643 1739.643 1742.658 + + 1669.243 1662.586 1662.586 1658.447 1658.447 1662.900 + 1662.900 1667.677 1665.116 1672.009 1616.123 1612.809 + 1612.809 1611.571 1611.571 1615.916 1615.916 1620.556 + 1620.556 1621.536 1621.536 1620.856 1620.856 1624.307 + 1624.307 1629.912 1688.067 1691.683 1691.683 1703.399 + 1703.399 1707.118 1707.118 1712.759 1712.759 1722.991 + 1722.991 1731.043 1731.043 1739.643 1739.643 1742.658 + + 1674.543 1670.081 1670.081 1663.903 1663.903 1664.716 + 1664.716 1667.608 1656.230 1659.616 1605.922 1605.250 + 1605.250 1606.136 1606.136 1609.884 1609.884 1616.456 + 1616.456 1618.623 1618.623 1622.309 1622.309 1627.358 + 1627.358 1632.703 1694.525 1699.679 1699.679 1713.297 + 1713.297 1717.197 1717.197 1720.418 1720.418 1729.393 + 1729.393 1736.744 1736.744 1744.641 1744.641 1748.120 + + 1674.543 1670.081 1670.081 1663.903 1663.903 1664.716 + 1664.716 1667.608 1656.230 1659.616 1605.922 1605.250 + 1605.250 1606.136 1606.136 1609.884 1609.884 1616.456 + 1616.456 1618.623 1618.623 1622.309 1622.309 1627.358 + 1627.358 1632.703 1694.525 1699.679 1699.679 1713.297 + 1713.297 1717.197 1717.197 1720.418 1720.418 1729.393 + 1729.393 1736.744 1736.744 1744.641 1744.641 1748.120 + + 1679.630 1677.515 1677.515 1674.068 1674.068 1671.302 + 1671.302 1671.092 1646.842 1647.089 1595.959 1596.224 + 1596.224 1599.450 1599.450 1605.044 1605.044 1614.075 + 1614.075 1617.863 1617.863 1626.615 1626.615 1630.393 + 1630.393 1636.135 1702.025 1709.739 1709.739 1720.343 + 1720.343 1723.864 1723.864 1726.453 1726.453 1735.416 + 1735.416 1747.796 1747.796 1754.223 1754.223 1757.131 + + 1679.630 1677.515 1677.515 1674.068 1674.068 1671.302 + 1671.302 1671.092 1646.842 1647.089 1647.089 1649.392 + 1596.224 1599.450 1599.450 1605.044 1605.044 1614.075 + 1614.075 1617.863 1617.863 1626.615 1626.615 1630.393 + 1630.393 1636.135 1702.025 1709.739 1709.739 1720.343 + 1720.343 1723.864 1723.864 1726.453 1726.453 1735.416 + 1735.416 1747.796 1747.796 1754.223 1754.223 1757.131 + + 1685.570 1683.893 1683.893 1682.614 1682.614 1680.007 + 1680.007 1677.192 1637.344 1636.011 1636.011 1636.602 + 1587.075 1589.895 1589.895 1601.761 1601.761 1613.145 + 1613.145 1621.500 1621.500 1632.696 1632.696 1634.310 + 1634.310 1639.918 1706.128 1715.093 1715.093 1723.585 + 1723.585 1727.800 1727.800 1731.584 1731.584 1741.152 + 1741.152 1764.944 1764.944 1770.129 1770.129 1770.011 + + 1685.570 1683.893 1683.893 1682.614 1682.614 1680.007 + 1680.007 1677.192 1637.344 1636.011 1636.011 1636.602 + 1587.075 1589.895 1589.895 1601.761 1601.761 1613.145 + 1613.145 1621.500 1621.500 1632.696 1632.696 1634.310 + 1634.310 1639.918 1706.128 1715.093 1715.093 1723.585 + 1723.585 1727.800 1727.800 1731.584 1731.584 1741.152 + 1741.152 1764.944 1764.944 1770.129 1770.129 1770.011 + + 1688.193 1687.013 1687.013 1688.405 1688.405 1686.886 + 1686.886 1683.260 1629.789 1628.426 1628.426 1628.423 + 1581.335 1583.050 1583.050 1595.657 1595.657 1614.324 + 1614.324 1627.490 1627.490 1634.856 1634.856 1637.595 + 1637.595 1642.920 1705.487 1713.360 1713.360 1722.373 + 1722.373 1728.532 1728.532 1733.235 1733.235 1750.414 + 1750.414 1774.853 1774.853 1777.352 1777.352 1776.921 + + 1688.193 1687.013 1687.013 1688.405 1688.405 1686.886 + 1686.886 1683.260 1629.789 1628.426 1628.426 1628.423 + 1628.423 1631.794 1583.050 1595.657 1595.657 1614.324 + 1614.324 1627.490 1627.490 1634.856 1634.856 1637.595 + 1637.595 1642.920 1642.920 1648.410 1713.360 1722.373 + 1722.373 1728.532 1728.532 1733.235 1733.235 1750.414 + 1750.414 1774.853 1774.853 1777.352 1777.352 1776.921 + + 1691.726 1689.949 1689.949 1692.014 1692.014 1690.702 + 1690.702 1687.033 1626.474 1626.780 1626.780 1627.205 + 1627.205 1627.565 1579.199 1589.658 1589.658 1614.626 + 1614.626 1627.166 1627.166 1634.126 1634.126 1638.887 + 1638.887 1644.925 1644.925 1651.130 1708.223 1717.711 + 1717.711 1727.405 1727.405 1733.403 1733.403 1758.695 + 1758.695 1774.781 1774.781 1775.614 1775.614 1775.408 + + 1691.726 1689.949 1689.949 1692.014 1692.014 1690.702 + 1690.702 1687.033 1626.474 1626.780 1626.780 1627.205 + 1627.205 1627.565 1579.199 1589.658 1589.658 1614.626 + 1614.626 1627.166 1627.166 1634.126 1634.126 1638.887 + 1638.887 1644.925 1644.925 1651.130 1708.223 1717.711 + 1717.711 1727.405 1727.405 1733.403 1733.403 1758.695 + 1758.695 1774.781 1774.781 1775.614 1775.614 1775.408 + + 1693.832 1689.655 1689.655 1690.680 1690.680 1690.743 + 1690.743 1688.446 1626.423 1628.378 1628.378 1629.811 + 1629.811 1626.720 1576.251 1581.660 1581.660 1598.928 + 1598.928 1617.047 1617.047 1630.802 1630.802 1639.225 + 1639.225 1646.218 1646.218 1653.212 1701.434 1710.153 + 1710.153 1724.403 1724.403 1736.226 1736.226 1753.940 + 1753.940 1764.633 1764.633 1768.428 1768.428 1768.852 + + 1693.832 1689.655 1689.655 1690.680 1690.680 1690.743 + 1690.743 1688.446 1626.423 1628.378 1628.378 1629.811 + 1629.811 1626.720 1626.720 1632.595 1581.660 1598.928 + 1598.928 1617.047 1617.047 1630.802 1630.802 1639.225 + 1639.225 1646.218 1646.218 1653.212 1701.434 1710.153 + 1710.153 1724.403 1724.403 1736.226 1736.226 1753.940 + 1753.940 1764.633 1764.633 1768.428 1768.428 1768.852 + + 1692.971 1687.744 1687.744 1690.049 1690.049 1690.391 + 1690.391 1688.539 1627.344 1630.173 1630.173 1633.577 + 1633.577 1630.506 1630.506 1633.222 1579.077 1590.633 + 1590.633 1608.260 1608.260 1624.448 1624.448 1639.035 + 1639.035 1646.830 1646.830 1653.973 1697.098 1706.112 + 1706.112 1723.326 1723.326 1734.390 1734.390 1745.861 + 1745.861 1754.832 1754.832 1759.640 1759.640 1760.547 + + 1692.971 1687.744 1687.744 1690.049 1690.049 1690.391 + 1690.391 1688.539 1627.344 1630.173 1630.173 1633.577 + 1633.577 1630.506 1630.506 1633.222 1579.077 1590.633 + 1590.633 1608.260 1608.260 1624.448 1624.448 1639.035 + 1639.035 1646.830 1646.830 1653.973 1697.098 1706.112 + 1706.112 1723.326 1723.326 1734.390 1734.390 1745.861 + 1745.861 1754.832 1754.832 1759.640 1759.640 1760.547 + + 1689.414 1685.722 1685.722 1689.600 1689.600 1688.764 + 1688.764 1687.065 1629.680 1634.444 1634.444 1642.151 + 1642.151 1642.840 1642.840 1635.335 1582.179 1590.838 + 1590.838 1604.039 1604.039 1619.257 1619.257 1638.028 + 1638.028 1646.787 1646.787 1653.083 1695.351 1703.206 + 1703.206 1718.298 1718.298 1727.723 1727.723 1737.416 + 1737.416 1745.582 1745.582 1750.504 1750.504 1751.552 + + 1689.414 1685.722 1685.722 1689.600 1689.600 1688.764 + 1688.764 1687.065 1687.065 1686.624 1634.444 1642.151 + 1642.151 1642.840 1642.840 1635.335 1582.179 1590.838 + 1590.838 1604.039 1604.039 1619.257 1619.257 1638.028 + 1638.028 1646.787 1646.787 1653.083 1695.351 1703.206 + 1703.206 1718.298 1718.298 1727.723 1727.723 1737.416 + 1737.416 1745.582 1745.582 1750.504 1750.504 1751.552 + + 1690.177 1685.715 1685.715 1689.467 1689.467 1687.889 + 1687.889 1686.839 1686.839 1687.822 1637.959 1644.644 + 1644.644 1646.020 1646.020 1640.875 1586.778 1594.486 + 1594.486 1603.151 1603.151 1614.367 1614.367 1635.411 + 1635.411 1648.447 1648.447 1651.325 1694.315 1701.547 + 1701.547 1711.559 1711.559 1722.013 1722.013 1730.153 + 1730.153 1736.355 1736.355 1740.545 1740.545 1741.526 + + 1690.177 1685.715 1685.715 1689.467 1689.467 1687.889 + 1687.889 1686.839 1686.839 1687.822 1687.822 1686.997 + 1644.644 1646.020 1646.020 1640.875 1640.875 1648.804 + 1594.486 1603.151 1603.151 1614.367 1614.367 1635.411 + 1635.411 1648.447 1648.447 1651.325 1651.325 1657.294 + 1701.547 1711.559 1711.559 1722.013 1722.013 1730.153 + 1730.153 1736.355 1736.355 1740.545 1740.545 1741.526 + + 1692.199 1687.733 1687.733 1688.542 1688.542 1687.999 + 1687.999 1687.823 1687.823 1688.202 1688.202 1687.532 + 1642.857 1644.481 1644.481 1645.946 1645.946 1650.871 + 1595.071 1600.364 1600.364 1608.422 1608.422 1630.246 + 1630.246 1645.115 1645.115 1649.112 1649.112 1653.036 + 1698.496 1706.916 1706.916 1715.639 1715.639 1721.487 + 1721.487 1725.758 1725.758 1730.182 1730.182 1731.859 + + 1702.511 1696.457 1687.733 1688.542 1688.542 1687.999 + 1687.999 1687.823 1687.823 1688.202 1688.202 1687.532 + 1687.532 1685.512 1644.481 1645.946 1645.946 1650.871 + 1595.071 1600.364 1600.364 1608.422 1608.422 1630.246 + 1630.246 1645.115 1645.115 1649.112 1649.112 1653.036 + 1653.036 1660.824 1706.916 1715.639 1715.639 1721.487 + 1721.487 1725.758 1725.758 1730.182 1730.182 1731.859 + + 1706.329 1697.894 1688.493 1686.997 1686.997 1686.204 + 1686.204 1686.833 1686.833 1687.389 1687.389 1687.987 + 1687.987 1686.403 1644.413 1647.273 1647.273 1651.910 + 1594.235 1597.522 1597.522 1602.438 1602.438 1620.477 + 1620.477 1635.895 1635.895 1643.352 1643.352 1648.772 + 1648.772 1657.692 1697.912 1704.405 1704.405 1709.345 + 1709.345 1713.392 1713.392 1721.154 1721.154 1724.613 + + 1706.329 1697.894 1697.894 1694.244 1686.997 1686.204 + 1686.204 1686.833 1686.833 1687.389 1687.389 1687.987 + 1687.987 1686.403 1686.403 1681.110 1647.273 1651.910 + 1651.910 1659.253 1597.522 1602.438 1602.438 1620.477 + 1620.477 1635.895 1635.895 1643.352 1643.352 1648.772 + 1648.772 1657.692 1657.692 1670.308 1704.405 1709.345 + 1709.345 1713.392 1713.392 1721.154 1721.154 1724.613 + + 1710.825 1700.573 1700.573 1696.337 1686.281 1685.193 + 1685.193 1686.847 1686.847 1687.587 1687.587 1687.608 + 1687.608 1685.738 1685.738 1679.931 1648.091 1652.499 + 1652.499 1658.512 1599.062 1606.310 1606.310 1618.753 + 1618.753 1629.337 1629.337 1635.194 1635.194 1644.887 + 1644.887 1654.061 1654.061 1669.358 1687.151 1695.267 + 1695.267 1706.000 1706.000 1716.367 1716.367 1720.287 + + 1710.825 1700.573 1700.573 1696.337 1696.337 1693.198 + 1685.193 1686.847 1686.847 1687.587 1687.587 1687.608 + 1687.608 1685.738 1685.738 1679.931 1679.931 1672.869 + 1672.869 1668.021 1668.021 1667.740 1606.310 1618.753 + 1618.753 1629.337 1629.337 1635.194 1635.194 1644.887 + 1644.887 1654.061 1654.061 1669.358 1687.151 1695.267 + 1695.267 1706.000 1706.000 1716.367 1716.367 1720.287 + + 1715.639 1705.528 1705.528 1699.266 1699.266 1695.178 + 1682.759 1682.275 1682.275 1684.935 1684.935 1686.347 + 1686.347 1683.153 1683.153 1676.368 1676.368 1669.781 + 1669.781 1666.390 1666.390 1664.031 1611.921 1620.267 + 1620.267 1627.016 1627.016 1632.803 1632.803 1640.142 + 1640.142 1650.296 1650.296 1667.581 1667.581 1684.173 + 1684.173 1700.030 1700.030 1712.098 1712.098 1716.573 + + 1715.639 1705.528 1705.528 1699.266 1699.266 1695.178 + 1695.178 1693.387 1682.275 1684.935 1684.935 1686.347 + 1686.347 1683.153 1683.153 1676.368 1676.368 1669.781 + 1669.781 1666.390 1666.390 1664.031 1664.031 1667.085 + 1620.267 1627.016 1627.016 1632.803 1632.803 1640.142 + 1640.142 1650.296 1650.296 1667.581 1667.581 1684.173 + 1684.173 1700.030 1700.030 1712.098 1712.098 1716.573 + + 1718.831 1709.120 1709.120 1702.204 1702.204 1697.656 + 1697.656 1695.945 1679.045 1680.327 1680.327 1681.129 + 1681.129 1676.027 1676.027 1667.690 1667.690 1664.921 + 1664.921 1664.936 1664.936 1663.684 1663.684 1663.446 + 1623.690 1629.092 1629.092 1635.704 1635.704 1641.198 + 1641.198 1651.499 1651.499 1666.353 1666.353 1680.721 + 1680.721 1697.237 1697.237 1710.020 1710.020 1714.679 + + 1718.831 1709.120 1709.120 1702.204 1702.204 1697.656 + 1697.656 1695.945 1679.045 1680.327 1680.327 1681.129 + 1681.129 1676.027 1676.027 1667.690 1667.690 1664.921 + 1664.921 1664.936 1664.936 1663.684 1663.684 1663.446 + 1663.446 1668.585 1629.092 1635.704 1635.704 1641.198 + 1641.198 1651.499 1651.499 1666.353 1666.353 1680.721 + 1680.721 1697.237 1697.237 1710.020 1710.020 1714.679 + + 1721.849 1713.440 1713.440 1706.154 1706.154 1700.039 + 1700.039 1700.378 1677.362 1675.777 1675.777 1672.938 + 1672.938 1665.257 1665.257 1656.844 1656.844 1659.095 + 1659.095 1662.418 1662.418 1663.070 1663.070 1663.712 + 1663.712 1667.655 1634.271 1639.407 1639.407 1646.239 + 1646.239 1658.756 1658.756 1672.443 1672.443 1683.466 + 1683.466 1698.435 1698.435 1710.788 1710.788 1715.282 + + 1658.070 1662.111 1662.111 1676.438 1676.438 1690.273 + 1690.273 1699.809 1670.089 1672.442 1672.442 1679.625 + 1679.625 1683.402 1683.402 1680.526 1680.526 1677.693 + 1677.693 1679.012 1679.012 1681.208 1706.161 1715.150 + 1715.150 1715.983 1715.983 1717.677 1717.677 1718.765 + 1718.765 1716.831 1716.831 1724.313 1724.313 1737.064 + 1737.064 1745.940 1745.940 1754.289 1754.289 1758.117 + + 1659.683 1665.269 1665.269 1676.659 1676.659 1688.359 + 1688.359 1697.022 1665.564 1668.171 1668.171 1675.636 + 1675.636 1679.295 1679.295 1679.294 1679.294 1676.901 + 1676.901 1674.851 1674.851 1674.049 1697.724 1705.658 + 1705.658 1708.380 1708.380 1708.294 1708.294 1707.687 + 1707.687 1704.546 1704.546 1710.853 1710.853 1723.167 + 1723.167 1734.329 1734.329 1743.260 1743.260 1747.284 + 1659.683 1665.269 1665.269 1676.659 1676.659 1688.359 + 1688.359 1697.022 1665.564 1668.171 1668.171 1675.636 + 1675.636 1679.295 1679.295 1679.294 1679.294 1676.901 + 1676.901 1674.851 1674.851 1674.049 1674.049 1675.208 + 1705.658 1708.380 1708.380 1708.294 1708.294 1707.687 + 1707.687 1704.546 1704.546 1710.853 1710.853 1723.167 + 1723.167 1734.329 1734.329 1743.260 1743.260 1747.284 + + 1662.604 1664.104 1664.104 1674.454 1674.454 1686.362 + 1686.362 1694.252 1660.071 1663.378 1663.378 1667.809 + 1667.809 1670.568 1670.568 1672.455 1672.455 1667.561 + 1667.561 1665.692 1665.692 1664.376 1664.376 1664.927 + 1696.872 1699.648 1699.648 1700.919 1700.919 1699.453 + 1699.453 1697.391 1697.391 1701.482 1701.482 1714.483 + 1714.483 1727.884 1727.884 1736.489 1736.489 1740.336 + 1662.604 1664.104 1664.104 1674.454 1674.454 1686.362 + 1686.362 1694.252 1660.071 1663.378 1663.378 1667.809 + 1667.809 1670.568 1670.568 1672.455 1672.455 1667.561 + 1667.561 1665.692 1665.692 1664.376 1664.376 1664.927 + 1696.872 1699.648 1699.648 1700.919 1700.919 1699.453 + 1699.453 1697.391 1697.391 1701.482 1701.482 1714.483 + 1714.483 1727.884 1727.884 1736.489 1736.489 1740.336 + + 1664.838 1660.031 1660.031 1670.808 1670.808 1682.441 + 1682.441 1690.568 1652.647 1655.836 1655.836 1656.685 + 1656.685 1656.577 1656.577 1657.054 1657.054 1652.227 + 1652.227 1653.127 1653.127 1650.554 1650.554 1652.768 + 1690.066 1693.038 1693.038 1694.143 1694.143 1694.368 + 1694.368 1694.934 1694.934 1696.795 1696.795 1704.460 + 1704.460 1722.360 1722.360 1732.477 1732.477 1736.130 + 1664.838 1660.031 1660.031 1670.808 1670.808 1682.441 + 1682.441 1690.568 1652.647 1655.836 1655.836 1656.685 + 1656.685 1656.577 1656.577 1657.054 1657.054 1652.227 + 1652.227 1653.127 1653.127 1650.554 1650.554 1652.768 + 1690.066 1693.038 1693.038 1694.143 1694.143 1694.368 + 1694.368 1694.934 1694.934 1696.795 1696.795 1704.460 + 1704.460 1722.360 1722.360 1732.477 1732.477 1736.130 + + 1663.144 1656.465 1656.465 1666.438 1666.438 1677.777 + 1677.777 1685.917 1643.790 1644.820 1644.820 1641.472 + 1641.472 1643.393 1643.393 1643.312 1643.312 1640.646 + 1640.646 1641.115 1641.115 1639.113 1639.113 1642.344 + 1685.510 1688.576 1688.576 1690.791 1690.791 1692.512 + 1692.512 1694.966 1694.966 1693.533 1693.533 1702.930 + 1702.930 1718.519 1718.519 1730.952 1730.952 1734.518 + 1663.144 1656.465 1656.465 1666.438 1666.438 1677.777 + 1677.777 1685.917 1643.790 1644.820 1644.820 1641.472 + 1641.472 1643.393 1643.393 1643.312 1643.312 1640.646 + 1640.646 1641.115 1641.115 1639.113 1639.113 1642.344 + 1685.510 1688.576 1688.576 1690.791 1690.791 1692.512 + 1692.512 1694.966 1694.966 1693.533 1693.533 1702.930 + 1702.930 1718.519 1718.519 1730.952 1730.952 1734.518 + + 1662.869 1656.963 1656.963 1663.786 1663.786 1673.489 + 1673.489 1681.685 1636.249 1635.347 1635.347 1632.618 + 1632.618 1632.584 1632.584 1633.250 1633.250 1634.384 + 1634.384 1634.841 1634.841 1633.803 1633.803 1636.153 + 1683.243 1686.291 1686.291 1689.197 1689.197 1691.533 + 1691.533 1695.259 1695.259 1694.680 1694.680 1706.431 + 1706.431 1720.120 1720.120 1731.783 1731.783 1735.167 + 1662.869 1656.963 1656.963 1663.786 1663.786 1673.489 + 1673.489 1681.685 1636.249 1635.347 1635.347 1632.618 + 1632.618 1632.584 1632.584 1633.250 1633.250 1634.384 + 1634.384 1634.841 1634.841 1633.803 1633.803 1636.153 + 1636.153 1641.082 1686.291 1689.197 1689.197 1691.533 + 1691.533 1695.259 1695.259 1694.680 1694.680 1706.431 + 1706.431 1720.120 1720.120 1731.783 1731.783 1735.167 + + 1664.683 1659.040 1659.040 1662.773 1662.773 1669.776 + 1669.776 1677.634 1631.206 1631.238 1631.238 1626.806 + 1626.806 1624.604 1624.604 1628.951 1628.951 1631.493 + 1631.493 1632.005 1632.005 1630.145 1630.145 1631.613 + 1631.613 1636.052 1685.911 1689.268 1689.268 1693.489 + 1693.489 1699.885 1699.885 1700.886 1700.886 1712.118 + 1712.118 1723.106 1723.106 1733.516 1733.516 1736.991 + 1664.683 1659.040 1659.040 1662.773 1662.773 1669.776 + 1669.776 1677.634 1631.206 1631.238 1631.238 1626.806 + 1626.806 1624.604 1624.604 1628.951 1628.951 1631.493 + 1631.493 1632.005 1632.005 1630.145 1630.145 1631.613 + 1631.613 1636.052 1685.911 1689.268 1689.268 1693.489 + 1693.489 1699.885 1699.885 1700.886 1700.886 1712.118 + 1712.118 1723.106 1723.106 1733.516 1733.516 1736.991 + + 1668.065 1661.149 1661.149 1660.792 1660.792 1666.228 + 1666.228 1673.683 1626.379 1627.009 1627.009 1621.159 + 1621.159 1619.719 1619.719 1624.553 1624.553 1627.828 + 1627.828 1628.512 1628.512 1626.562 1626.562 1628.277 + 1628.277 1633.057 1687.344 1690.551 1690.551 1698.531 + 1698.531 1704.264 1704.264 1707.856 1707.856 1718.282 + 1718.282 1728.117 1728.117 1737.197 1737.197 1740.424 + 1668.065 1661.149 1661.149 1660.792 1660.792 1666.228 + 1666.228 1673.683 1626.379 1627.009 1627.009 1621.159 + 1621.159 1619.719 1619.719 1624.553 1624.553 1627.828 + 1627.828 1628.512 1628.512 1626.562 1626.562 1628.277 + 1628.277 1633.057 1687.344 1690.551 1690.551 1698.531 + 1698.531 1704.264 1704.264 1707.856 1707.856 1718.282 + 1718.282 1728.117 1728.117 1737.197 1737.197 1740.424 + + 1672.288 1666.162 1666.162 1661.060 1661.060 1665.448 + 1665.448 1670.405 1618.943 1619.412 1619.412 1615.868 + 1615.868 1614.824 1614.824 1619.312 1619.312 1623.852 + 1623.852 1624.634 1624.634 1624.008 1624.008 1627.507 + 1627.507 1633.065 1691.670 1695.425 1695.425 1706.839 + 1706.839 1710.471 1710.471 1716.124 1716.124 1726.590 + 1726.590 1734.281 1734.281 1742.245 1742.245 1745.103 + 1672.288 1666.162 1666.162 1661.060 1661.060 1665.448 + 1665.448 1670.405 1667.998 1675.193 1619.412 1615.868 + 1615.868 1614.824 1614.824 1619.312 1619.312 1623.852 + 1623.852 1624.634 1624.634 1624.008 1624.008 1627.507 + 1627.507 1633.065 1691.670 1695.425 1695.425 1706.839 + 1706.839 1710.471 1710.471 1716.124 1716.124 1726.590 + 1726.590 1734.281 1734.281 1742.245 1742.245 1745.103 + + 1677.464 1673.703 1673.703 1666.945 1666.945 1667.406 + 1667.406 1670.250 1659.289 1662.553 1609.141 1608.338 + 1608.338 1609.463 1609.463 1613.364 1613.364 1619.804 + 1619.804 1621.853 1621.853 1625.575 1625.575 1630.611 + 1630.611 1635.960 1698.191 1703.254 1703.254 1716.664 + 1716.664 1720.510 1720.510 1723.726 1723.726 1732.953 + 1732.953 1740.320 1740.320 1747.837 1747.837 1750.960 + 1677.464 1673.703 1673.703 1666.945 1666.945 1667.406 + 1667.406 1670.250 1659.289 1662.553 1609.141 1608.338 + 1608.338 1609.463 1609.463 1613.364 1613.364 1619.804 + 1619.804 1621.853 1621.853 1625.575 1625.575 1630.611 + 1630.611 1635.960 1698.191 1703.254 1703.254 1716.664 + 1716.664 1720.510 1720.510 1723.726 1723.726 1732.953 + 1732.953 1740.320 1740.320 1747.837 1747.837 1750.960 + + 1682.488 1680.760 1680.760 1677.241 1677.241 1674.167 + 1674.167 1673.755 1650.269 1650.055 1599.131 1599.410 + 1599.410 1602.788 1602.788 1608.333 1608.333 1617.411 + 1617.411 1621.202 1621.202 1629.897 1629.897 1633.841 + 1633.841 1639.634 1705.721 1713.190 1713.190 1723.794 + 1723.794 1727.175 1727.175 1729.831 1729.831 1738.918 + 1738.918 1750.414 1750.414 1757.353 1757.353 1759.955 + 1682.488 1680.760 1680.760 1677.241 1677.241 1674.167 + 1674.167 1673.755 1650.269 1650.055 1650.055 1651.859 + 1599.410 1602.788 1602.788 1608.333 1608.333 1617.411 + 1617.411 1621.202 1621.202 1629.897 1629.897 1633.841 + 1633.841 1639.634 1705.721 1713.190 1713.190 1723.794 + 1723.794 1727.175 1727.175 1729.831 1729.831 1738.918 + 1738.918 1750.414 1750.414 1757.353 1757.353 1759.955 + + 1688.425 1687.051 1687.051 1685.620 1685.620 1683.052 + 1683.052 1680.030 1641.196 1639.260 1639.260 1639.092 + 1590.199 1593.195 1593.195 1605.202 1605.202 1616.552 + 1616.552 1625.055 1625.055 1635.897 1635.897 1637.688 + 1637.688 1643.380 1710.062 1718.793 1718.793 1726.931 + 1726.931 1731.120 1731.120 1735.039 1735.039 1744.954 + 1744.954 1767.008 1767.008 1772.341 1772.341 1772.360 + 1688.425 1687.051 1687.051 1685.620 1685.620 1683.052 + 1683.052 1680.030 1641.196 1639.260 1639.260 1639.092 + 1590.199 1593.195 1593.195 1605.202 1605.202 1616.552 + 1616.552 1625.055 1625.055 1635.897 1635.897 1637.688 + 1637.688 1643.380 1710.062 1718.793 1718.793 1726.931 + 1726.931 1731.120 1731.120 1735.039 1735.039 1744.954 + 1744.954 1767.008 1767.008 1772.341 1772.341 1772.360 + + 1691.085 1690.063 1690.063 1691.226 1691.226 1690.002 + 1690.002 1686.264 1633.968 1631.885 1631.885 1630.943 + 1584.418 1586.183 1586.183 1599.057 1599.057 1617.760 + 1617.760 1630.934 1630.934 1638.101 1638.101 1640.892 + 1640.892 1646.208 1709.541 1717.072 1717.072 1725.868 + 1725.868 1731.959 1731.959 1736.731 1736.731 1754.471 + 1754.471 1778.016 1778.016 1779.762 1779.762 1779.327 + 1691.085 1690.063 1690.063 1691.226 1691.226 1690.002 + 1690.002 1686.264 1633.968 1631.885 1631.885 1630.943 + 1630.943 1633.524 1586.183 1599.057 1599.057 1617.760 + 1617.760 1630.934 1630.934 1638.101 1638.101 1640.892 + 1640.892 1646.208 1646.208 1651.725 1717.072 1725.868 + 1725.868 1731.959 1731.959 1736.731 1736.731 1754.471 + 1754.471 1778.016 1778.016 1779.762 1779.762 1779.327 + + 1694.770 1692.902 1692.902 1694.848 1694.848 1693.842 + 1693.842 1690.101 1630.850 1630.415 1630.415 1629.772 + 1629.772 1629.193 1582.299 1593.021 1593.021 1618.287 + 1618.287 1630.642 1630.642 1637.446 1637.446 1642.222 + 1642.222 1648.176 1648.176 1654.344 1711.891 1721.246 + 1721.246 1730.859 1730.859 1736.929 1736.929 1761.438 + 1761.438 1777.435 1777.435 1778.187 1778.187 1777.995 + 1694.770 1692.902 1692.902 1694.848 1694.848 1693.842 + 1693.842 1690.101 1630.850 1630.415 1630.415 1629.772 + 1629.772 1629.193 1582.299 1593.021 1593.021 1618.287 + 1618.287 1630.642 1630.642 1637.446 1637.446 1642.222 + 1642.222 1648.176 1648.176 1654.344 1711.891 1721.246 + 1721.246 1730.859 1730.859 1736.929 1736.929 1761.438 + 1761.438 1777.435 1777.435 1778.187 1778.187 1777.995 + + 1696.992 1692.763 1692.763 1693.536 1693.536 1693.795 + 1693.795 1691.488 1631.116 1632.413 1632.413 1632.890 + 1632.890 1628.585 1579.352 1584.896 1584.896 1602.469 + 1602.469 1620.729 1620.729 1634.321 1634.321 1642.617 + 1642.617 1649.319 1649.319 1656.247 1705.238 1713.735 + 1713.735 1728.018 1728.018 1739.834 1739.834 1756.985 + 1756.985 1767.165 1767.165 1771.069 1771.069 1771.515 + 1696.992 1692.763 1692.763 1693.536 1693.536 1693.795 + 1693.795 1691.488 1631.116 1632.413 1632.413 1632.890 + 1632.890 1628.585 1628.585 1634.087 1584.896 1602.469 + 1602.469 1620.729 1620.729 1634.321 1634.321 1642.617 + 1642.617 1649.319 1649.319 1656.247 1705.238 1713.735 + 1713.735 1728.018 1728.018 1739.834 1739.834 1756.985 + 1756.985 1767.165 1767.165 1771.069 1771.069 1771.515 + + 1696.270 1690.768 1690.768 1692.858 1692.858 1693.403 + 1693.403 1691.553 1632.703 1635.214 1635.214 1638.182 + 1638.182 1633.601 1633.601 1635.223 1582.246 1594.022 + 1594.022 1611.773 1611.773 1628.131 1628.131 1642.597 + 1642.597 1649.956 1649.956 1656.951 1700.911 1709.727 + 1709.727 1726.968 1726.968 1737.357 1737.357 1748.602 + 1748.602 1757.501 1757.501 1762.411 1762.411 1763.313 + 1696.270 1690.768 1690.768 1692.858 1692.858 1693.403 + 1693.403 1691.553 1632.703 1635.214 1635.214 1638.182 + 1638.182 1633.601 1633.601 1635.223 1582.246 1594.022 + 1594.022 1611.773 1611.773 1628.131 1628.131 1642.597 + 1642.597 1649.956 1649.956 1656.951 1700.911 1709.727 + 1709.727 1726.968 1726.968 1737.357 1737.357 1748.602 + 1748.602 1757.501 1757.501 1762.411 1762.411 1763.313 + + 1692.721 1688.625 1688.625 1692.487 1692.487 1691.823 + 1691.823 1690.071 1635.567 1640.238 1640.238 1647.709 + 1647.709 1646.423 1646.423 1637.340 1585.397 1594.198 + 1594.198 1607.386 1607.386 1623.027 1623.027 1641.643 + 1641.643 1650.128 1650.128 1656.313 1699.414 1706.922 + 1706.922 1721.899 1721.899 1730.363 1730.363 1739.954 + 1739.954 1748.335 1748.335 1753.395 1753.395 1754.420 + 1692.721 1688.625 1688.625 1692.487 1692.487 1691.823 + 1691.823 1690.071 1690.071 1689.550 1640.238 1647.709 + 1647.709 1646.423 1646.423 1637.340 1585.397 1594.198 + 1594.198 1607.386 1607.386 1623.027 1623.027 1641.643 + 1641.643 1650.128 1650.128 1656.313 1699.414 1706.922 + 1706.922 1721.899 1721.899 1730.363 1730.363 1739.954 + 1739.954 1748.335 1748.335 1753.395 1753.395 1754.420 + + 1693.325 1688.697 1688.697 1692.457 1692.457 1691.047 + 1691.047 1689.824 1689.824 1690.893 1643.813 1650.267 + 1650.267 1651.644 1651.644 1644.166 1590.064 1597.871 + 1597.871 1606.390 1606.390 1618.125 1618.125 1639.126 + 1639.126 1651.813 1651.813 1654.432 1698.714 1705.512 + 1705.512 1715.087 1715.087 1725.000 1725.000 1732.891 + 1732.891 1739.182 1739.182 1743.465 1743.465 1744.401 + 1693.325 1688.697 1688.697 1692.457 1692.457 1691.047 + 1691.047 1689.824 1689.824 1690.893 1690.893 1690.009 + 1650.267 1651.644 1651.644 1644.166 1644.166 1650.794 + 1597.871 1606.390 1606.390 1618.125 1618.125 1639.126 + 1639.126 1651.813 1651.813 1654.432 1654.432 1660.345 + 1705.512 1715.087 1715.087 1725.000 1725.000 1732.891 + 1732.891 1739.182 1739.182 1743.465 1743.465 1744.401 + + 1695.108 1690.635 1690.635 1691.565 1691.565 1691.046 + 1691.046 1690.777 1690.777 1691.357 1691.357 1690.631 + 1648.486 1649.670 1649.670 1649.654 1649.654 1653.462 + 1598.327 1603.586 1603.586 1612.065 1612.065 1634.069 + 1634.069 1648.548 1648.548 1652.201 1652.201 1656.145 + 1702.603 1710.582 1710.582 1718.655 1718.655 1724.350 + 1724.350 1728.678 1728.678 1733.132 1733.132 1734.695 + 1705.531 1699.496 1690.635 1691.565 1691.565 1691.046 + 1691.046 1690.777 1690.777 1691.357 1691.357 1690.631 + 1690.631 1688.549 1649.670 1649.654 1649.654 1653.462 + 1598.327 1603.586 1603.586 1612.065 1612.065 1634.069 + 1634.069 1648.548 1648.548 1652.201 1652.201 1656.145 + 1656.145 1664.201 1710.582 1718.655 1718.655 1724.350 + 1724.350 1728.678 1728.678 1733.132 1733.132 1734.695 + + 1709.284 1700.927 1691.278 1690.015 1690.015 1689.263 + 1689.263 1689.851 1689.851 1690.537 1690.537 1691.115 + 1691.115 1689.547 1649.200 1651.182 1651.182 1654.926 + 1597.434 1600.739 1600.739 1605.857 1605.857 1624.283 + 1624.283 1639.329 1639.329 1646.784 1646.784 1652.110 + 1652.110 1661.111 1701.361 1707.211 1707.211 1712.089 + 1712.089 1716.322 1716.322 1724.183 1724.183 1727.464 + 1709.284 1700.927 1700.927 1697.234 1690.015 1689.263 + 1689.263 1689.851 1689.851 1690.537 1690.537 1691.115 + 1691.115 1689.547 1689.547 1684.118 1651.182 1654.926 + 1654.926 1661.517 1600.739 1605.857 1605.857 1624.283 + 1624.283 1639.329 1639.329 1646.784 1646.784 1652.110 + 1652.110 1661.111 1661.111 1673.965 1707.211 1712.089 + 1712.089 1716.322 1716.322 1724.183 1724.183 1727.464 + + 1713.649 1703.520 1703.520 1699.381 1689.208 1688.282 + 1688.282 1689.823 1689.823 1690.650 1690.650 1690.685 + 1690.685 1688.854 1688.854 1682.988 1652.090 1655.830 + 1655.830 1661.373 1602.400 1609.804 1609.804 1622.306 + 1622.306 1632.701 1632.701 1638.606 1638.606 1648.267 + 1648.267 1657.640 1657.640 1672.820 1689.605 1697.841 + 1697.841 1708.856 1708.856 1719.370 1719.370 1723.125 + 1713.649 1703.520 1703.520 1699.381 1699.381 1696.168 + 1688.282 1689.823 1689.823 1690.650 1690.650 1690.685 + 1690.685 1688.854 1688.854 1682.988 1682.988 1675.808 + 1675.808 1670.958 1670.958 1670.209 1609.804 1622.306 + 1622.306 1632.701 1632.701 1638.606 1638.606 1648.267 + 1648.267 1657.640 1657.640 1672.820 1689.605 1697.841 + 1697.841 1708.856 1708.856 1719.370 1719.370 1723.125 + + 1718.446 1708.429 1708.429 1702.278 1702.278 1698.234 + 1685.797 1685.376 1685.376 1687.962 1687.962 1689.427 + 1689.427 1686.241 1686.241 1679.350 1679.350 1672.756 + 1672.756 1669.508 1669.508 1667.189 1615.454 1623.704 + 1623.704 1630.400 1630.400 1636.235 1636.235 1643.523 + 1643.523 1653.768 1653.768 1670.326 1670.326 1686.654 + 1686.654 1702.726 1702.726 1715.033 1715.033 1719.371 + 1718.446 1708.429 1708.429 1702.278 1702.278 1698.234 + 1698.234 1696.305 1685.376 1687.962 1687.962 1689.427 + 1689.427 1686.241 1686.241 1679.350 1679.350 1672.756 + 1672.756 1669.508 1669.508 1667.189 1667.189 1669.737 + 1623.704 1630.400 1630.400 1636.235 1636.235 1643.523 + 1643.523 1653.768 1653.768 1670.326 1670.326 1686.654 + 1686.654 1702.726 1702.726 1715.033 1715.033 1719.371 + + 1721.638 1712.005 1712.005 1705.179 1705.179 1700.743 + 1700.743 1698.970 1682.150 1683.432 1683.432 1684.156 + 1684.156 1679.024 1679.024 1670.567 1670.567 1667.973 + 1667.973 1668.138 1668.138 1666.951 1666.951 1666.592 + 1627.194 1632.557 1632.557 1639.133 1639.133 1644.584 + 1644.584 1654.979 1654.979 1669.168 1669.168 1683.086 + 1683.086 1699.882 1699.882 1712.869 1712.869 1717.425 + 1721.638 1712.005 1712.005 1705.179 1705.179 1700.743 + 1700.743 1698.970 1682.150 1683.432 1683.432 1684.156 + 1684.156 1679.024 1679.024 1670.567 1670.567 1667.973 + 1667.973 1668.138 1668.138 1666.951 1666.951 1666.592 + 1666.592 1671.425 1632.557 1639.133 1639.133 1644.584 + 1644.584 1654.979 1654.979 1669.168 1669.168 1683.086 + 1683.086 1699.882 1699.882 1712.869 1712.869 1717.425 + + 1724.732 1716.346 1716.346 1709.081 1709.081 1703.069 + 1703.069 1703.463 1680.287 1678.824 1678.824 1676.003 + 1676.003 1668.350 1668.350 1659.946 1659.946 1662.240 + 1662.240 1665.625 1665.625 1666.394 1666.394 1667.077 + 1667.077 1670.976 1637.824 1642.900 1642.900 1649.708 + 1649.708 1662.192 1662.192 1675.608 1675.608 1686.150 + 1686.150 1701.146 1701.146 1713.617 1713.617 1718.027 + 1658.070 1662.111 1662.111 1676.438 1676.438 1690.273 + 1690.273 1699.809 1670.089 1672.442 1672.442 1679.625 + 1679.625 1683.402 1683.402 1680.526 1680.526 1677.693 + 1677.693 1679.012 1679.012 1681.208 1706.161 1715.150 + 1715.150 1715.983 1715.983 1717.677 1717.677 1718.765 + 1718.765 1716.831 1716.831 1724.313 1724.313 1737.064 + 1737.064 1745.940 1745.940 1754.289 1754.289 1758.117 + + 1659.683 1665.269 1665.269 1676.659 1676.659 1688.359 + 1688.359 1697.022 1665.564 1668.171 1668.171 1675.636 + 1675.636 1679.295 1679.295 1679.294 1679.294 1676.901 + 1676.901 1674.851 1674.851 1674.049 1697.724 1705.658 + 1705.658 1708.380 1708.380 1708.294 1708.294 1707.687 + 1707.687 1704.546 1704.546 1710.853 1710.853 1723.167 + 1723.167 1734.329 1734.329 1743.260 1743.260 1747.284 + + 1659.683 1665.269 1665.269 1676.659 1676.659 1688.359 + 1688.359 1697.022 1665.564 1668.171 1668.171 1675.636 + 1675.636 1679.295 1679.295 1679.294 1679.294 1676.901 + 1676.901 1674.851 1674.851 1674.049 1674.049 1675.208 + 1705.658 1708.380 1708.380 1708.294 1708.294 1707.687 + 1707.687 1704.546 1704.546 1710.853 1710.853 1723.167 + 1723.167 1734.329 1734.329 1743.260 1743.260 1747.284 + + 1662.604 1664.104 1664.104 1674.454 1674.454 1686.362 + 1686.362 1694.252 1660.071 1663.378 1663.378 1667.809 + 1667.809 1670.568 1670.568 1672.455 1672.455 1667.561 + 1667.561 1665.692 1665.692 1664.376 1664.376 1664.927 + 1696.872 1699.648 1699.648 1700.919 1700.919 1699.453 + 1699.453 1697.391 1697.391 1701.482 1701.482 1714.483 + 1714.483 1727.884 1727.884 1736.489 1736.489 1740.336 + + 1662.604 1664.104 1664.104 1674.454 1674.454 1686.362 + 1686.362 1694.252 1660.071 1663.378 1663.378 1667.809 + 1667.809 1670.568 1670.568 1672.455 1672.455 1667.561 + 1667.561 1665.692 1665.692 1664.376 1664.376 1664.927 + 1696.872 1699.648 1699.648 1700.919 1700.919 1699.453 + 1699.453 1697.391 1697.391 1701.482 1701.482 1714.483 + 1714.483 1727.884 1727.884 1736.489 1736.489 1740.336 + + 1664.838 1660.031 1660.031 1670.808 1670.808 1682.441 + 1682.441 1690.568 1652.647 1655.836 1655.836 1656.685 + 1656.685 1656.577 1656.577 1657.054 1657.054 1652.227 + 1652.227 1653.127 1653.127 1650.554 1650.554 1652.768 + 1690.066 1693.038 1693.038 1694.143 1694.143 1694.368 + 1694.368 1694.934 1694.934 1696.795 1696.795 1704.460 + 1704.460 1722.360 1722.360 1732.477 1732.477 1736.130 + + 1664.838 1660.031 1660.031 1670.808 1670.808 1682.441 + 1682.441 1690.568 1652.647 1655.836 1655.836 1656.685 + 1656.685 1656.577 1656.577 1657.054 1657.054 1652.227 + 1652.227 1653.127 1653.127 1650.554 1650.554 1652.768 + 1690.066 1693.038 1693.038 1694.143 1694.143 1694.368 + 1694.368 1694.934 1694.934 1696.795 1696.795 1704.460 + 1704.460 1722.360 1722.360 1732.477 1732.477 1736.130 + + 1663.144 1656.465 1656.465 1666.438 1666.438 1677.777 + 1677.777 1685.917 1643.790 1644.820 1644.820 1641.472 + 1641.472 1643.393 1643.393 1643.312 1643.312 1640.646 + 1640.646 1641.115 1641.115 1639.113 1639.113 1642.344 + 1685.510 1688.576 1688.576 1690.791 1690.791 1692.512 + 1692.512 1694.966 1694.966 1693.533 1693.533 1702.930 + 1702.930 1718.519 1718.519 1730.952 1730.952 1734.518 + + 1663.144 1656.465 1656.465 1666.438 1666.438 1677.777 + 1677.777 1685.917 1643.790 1644.820 1644.820 1641.472 + 1641.472 1643.393 1643.393 1643.312 1643.312 1640.646 + 1640.646 1641.115 1641.115 1639.113 1639.113 1642.344 + 1685.510 1688.576 1688.576 1690.791 1690.791 1692.512 + 1692.512 1694.966 1694.966 1693.533 1693.533 1702.930 + 1702.930 1718.519 1718.519 1730.952 1730.952 1734.518 + + 1662.869 1656.963 1656.963 1663.786 1663.786 1673.489 + 1673.489 1681.685 1636.249 1635.347 1635.347 1632.618 + 1632.618 1632.584 1632.584 1633.250 1633.250 1634.384 + 1634.384 1634.841 1634.841 1633.803 1633.803 1636.153 + 1683.243 1686.291 1686.291 1689.197 1689.197 1691.533 + 1691.533 1695.259 1695.259 1694.680 1694.680 1706.431 + 1706.431 1720.120 1720.120 1731.783 1731.783 1735.167 + + 1662.869 1656.963 1656.963 1663.786 1663.786 1673.489 + 1673.489 1681.685 1636.249 1635.347 1635.347 1632.618 + 1632.618 1632.584 1632.584 1633.250 1633.250 1634.384 + 1634.384 1634.841 1634.841 1633.803 1633.803 1636.153 + 1636.153 1641.082 1686.291 1689.197 1689.197 1691.533 + 1691.533 1695.259 1695.259 1694.680 1694.680 1706.431 + 1706.431 1720.120 1720.120 1731.783 1731.783 1735.167 + + 1664.683 1659.040 1659.040 1662.773 1662.773 1669.776 + 1669.776 1677.634 1631.206 1631.238 1631.238 1626.806 + 1626.806 1624.604 1624.604 1628.951 1628.951 1631.493 + 1631.493 1632.005 1632.005 1630.145 1630.145 1631.613 + 1631.613 1636.052 1685.911 1689.268 1689.268 1693.489 + 1693.489 1699.885 1699.885 1700.886 1700.886 1712.118 + 1712.118 1723.106 1723.106 1733.516 1733.516 1736.991 + + 1664.683 1659.040 1659.040 1662.773 1662.773 1669.776 + 1669.776 1677.634 1631.206 1631.238 1631.238 1626.806 + 1626.806 1624.604 1624.604 1628.951 1628.951 1631.493 + 1631.493 1632.005 1632.005 1630.145 1630.145 1631.613 + 1631.613 1636.052 1685.911 1689.268 1689.268 1693.489 + 1693.489 1699.885 1699.885 1700.886 1700.886 1712.118 + 1712.118 1723.106 1723.106 1733.516 1733.516 1736.991 + + 1668.065 1661.149 1661.149 1660.792 1660.792 1666.228 + 1666.228 1673.683 1626.379 1627.009 1627.009 1621.159 + 1621.159 1619.719 1619.719 1624.553 1624.553 1627.828 + 1627.828 1628.512 1628.512 1626.562 1626.562 1628.277 + 1628.277 1633.057 1687.344 1690.551 1690.551 1698.531 + 1698.531 1704.264 1704.264 1707.856 1707.856 1718.282 + 1718.282 1728.117 1728.117 1737.197 1737.197 1740.424 + + 1668.065 1661.149 1661.149 1660.792 1660.792 1666.228 + 1666.228 1673.683 1626.379 1627.009 1627.009 1621.159 + 1621.159 1619.719 1619.719 1624.553 1624.553 1627.828 + 1627.828 1628.512 1628.512 1626.562 1626.562 1628.277 + 1628.277 1633.057 1687.344 1690.551 1690.551 1698.531 + 1698.531 1704.264 1704.264 1707.856 1707.856 1718.282 + 1718.282 1728.117 1728.117 1737.197 1737.197 1740.424 + + 1672.288 1666.162 1666.162 1661.060 1661.060 1665.448 + 1665.448 1670.405 1618.943 1619.412 1619.412 1615.868 + 1615.868 1614.824 1614.824 1619.312 1619.312 1623.852 + 1623.852 1624.634 1624.634 1624.008 1624.008 1627.507 + 1627.507 1633.065 1691.670 1695.425 1695.425 1706.839 + 1706.839 1710.471 1710.471 1716.124 1716.124 1726.590 + 1726.590 1734.281 1734.281 1742.245 1742.245 1745.103 + + 1672.288 1666.162 1666.162 1661.060 1661.060 1665.448 + 1665.448 1670.405 1667.998 1675.193 1619.412 1615.868 + 1615.868 1614.824 1614.824 1619.312 1619.312 1623.852 + 1623.852 1624.634 1624.634 1624.008 1624.008 1627.507 + 1627.507 1633.065 1691.670 1695.425 1695.425 1706.839 + 1706.839 1710.471 1710.471 1716.124 1716.124 1726.590 + 1726.590 1734.281 1734.281 1742.245 1742.245 1745.103 + + 1677.464 1673.703 1673.703 1666.945 1666.945 1667.406 + 1667.406 1670.250 1659.289 1662.553 1609.141 1608.338 + 1608.338 1609.463 1609.463 1613.364 1613.364 1619.804 + 1619.804 1621.853 1621.853 1625.575 1625.575 1630.611 + 1630.611 1635.960 1698.191 1703.254 1703.254 1716.664 + 1716.664 1720.510 1720.510 1723.726 1723.726 1732.953 + 1732.953 1740.320 1740.320 1747.837 1747.837 1750.960 + + 1677.464 1673.703 1673.703 1666.945 1666.945 1667.406 + 1667.406 1670.250 1659.289 1662.553 1609.141 1608.338 + 1608.338 1609.463 1609.463 1613.364 1613.364 1619.804 + 1619.804 1621.853 1621.853 1625.575 1625.575 1630.611 + 1630.611 1635.960 1698.191 1703.254 1703.254 1716.664 + 1716.664 1720.510 1720.510 1723.726 1723.726 1732.953 + 1732.953 1740.320 1740.320 1747.837 1747.837 1750.960 + + 1682.488 1680.760 1680.760 1677.241 1677.241 1674.167 + 1674.167 1673.755 1650.269 1650.055 1599.131 1599.410 + 1599.410 1602.788 1602.788 1608.333 1608.333 1617.411 + 1617.411 1621.202 1621.202 1629.897 1629.897 1633.841 + 1633.841 1639.634 1705.721 1713.190 1713.190 1723.794 + 1723.794 1727.175 1727.175 1729.831 1729.831 1738.918 + 1738.918 1750.414 1750.414 1757.353 1757.353 1759.955 + + 1682.488 1680.760 1680.760 1677.241 1677.241 1674.167 + 1674.167 1673.755 1650.269 1650.055 1650.055 1651.859 + 1599.410 1602.788 1602.788 1608.333 1608.333 1617.411 + 1617.411 1621.202 1621.202 1629.897 1629.897 1633.841 + 1633.841 1639.634 1705.721 1713.190 1713.190 1723.794 + 1723.794 1727.175 1727.175 1729.831 1729.831 1738.918 + 1738.918 1750.414 1750.414 1757.353 1757.353 1759.955 + + 1688.425 1687.051 1687.051 1685.620 1685.620 1683.052 + 1683.052 1680.030 1641.196 1639.260 1639.260 1639.092 + 1590.199 1593.195 1593.195 1605.202 1605.202 1616.552 + 1616.552 1625.055 1625.055 1635.897 1635.897 1637.688 + 1637.688 1643.380 1710.062 1718.793 1718.793 1726.931 + 1726.931 1731.120 1731.120 1735.039 1735.039 1744.954 + 1744.954 1767.008 1767.008 1772.341 1772.341 1772.360 + + 1688.425 1687.051 1687.051 1685.620 1685.620 1683.052 + 1683.052 1680.030 1641.196 1639.260 1639.260 1639.092 + 1590.199 1593.195 1593.195 1605.202 1605.202 1616.552 + 1616.552 1625.055 1625.055 1635.897 1635.897 1637.688 + 1637.688 1643.380 1710.062 1718.793 1718.793 1726.931 + 1726.931 1731.120 1731.120 1735.039 1735.039 1744.954 + 1744.954 1767.008 1767.008 1772.341 1772.341 1772.360 + + 1691.085 1690.063 1690.063 1691.226 1691.226 1690.002 + 1690.002 1686.264 1633.968 1631.885 1631.885 1630.943 + 1584.418 1586.183 1586.183 1599.057 1599.057 1617.760 + 1617.760 1630.934 1630.934 1638.101 1638.101 1640.892 + 1640.892 1646.208 1709.541 1717.072 1717.072 1725.868 + 1725.868 1731.959 1731.959 1736.731 1736.731 1754.471 + 1754.471 1778.016 1778.016 1779.762 1779.762 1779.327 + + 1691.085 1690.063 1690.063 1691.226 1691.226 1690.002 + 1690.002 1686.264 1633.968 1631.885 1631.885 1630.943 + 1630.943 1633.524 1586.183 1599.057 1599.057 1617.760 + 1617.760 1630.934 1630.934 1638.101 1638.101 1640.892 + 1640.892 1646.208 1646.208 1651.725 1717.072 1725.868 + 1725.868 1731.959 1731.959 1736.731 1736.731 1754.471 + 1754.471 1778.016 1778.016 1779.762 1779.762 1779.327 + + 1694.770 1692.902 1692.902 1694.848 1694.848 1693.842 + 1693.842 1690.101 1630.850 1630.415 1630.415 1629.772 + 1629.772 1629.193 1582.299 1593.021 1593.021 1618.287 + 1618.287 1630.642 1630.642 1637.446 1637.446 1642.222 + 1642.222 1648.176 1648.176 1654.344 1711.891 1721.246 + 1721.246 1730.859 1730.859 1736.929 1736.929 1761.438 + 1761.438 1777.435 1777.435 1778.187 1778.187 1777.995 + + 1694.770 1692.902 1692.902 1694.848 1694.848 1693.842 + 1693.842 1690.101 1630.850 1630.415 1630.415 1629.772 + 1629.772 1629.193 1582.299 1593.021 1593.021 1618.287 + 1618.287 1630.642 1630.642 1637.446 1637.446 1642.222 + 1642.222 1648.176 1648.176 1654.344 1711.891 1721.246 + 1721.246 1730.859 1730.859 1736.929 1736.929 1761.438 + 1761.438 1777.435 1777.435 1778.187 1778.187 1777.995 + + 1696.992 1692.763 1692.763 1693.536 1693.536 1693.795 + 1693.795 1691.488 1631.116 1632.413 1632.413 1632.890 + 1632.890 1628.585 1579.352 1584.896 1584.896 1602.469 + 1602.469 1620.729 1620.729 1634.321 1634.321 1642.617 + 1642.617 1649.319 1649.319 1656.247 1705.238 1713.735 + 1713.735 1728.018 1728.018 1739.834 1739.834 1756.985 + 1756.985 1767.165 1767.165 1771.069 1771.069 1771.515 + + 1696.992 1692.763 1692.763 1693.536 1693.536 1693.795 + 1693.795 1691.488 1631.116 1632.413 1632.413 1632.890 + 1632.890 1628.585 1628.585 1634.087 1584.896 1602.469 + 1602.469 1620.729 1620.729 1634.321 1634.321 1642.617 + 1642.617 1649.319 1649.319 1656.247 1705.238 1713.735 + 1713.735 1728.018 1728.018 1739.834 1739.834 1756.985 + 1756.985 1767.165 1767.165 1771.069 1771.069 1771.515 + + 1696.270 1690.768 1690.768 1692.858 1692.858 1693.403 + 1693.403 1691.553 1632.703 1635.214 1635.214 1638.182 + 1638.182 1633.601 1633.601 1635.223 1582.246 1594.022 + 1594.022 1611.773 1611.773 1628.131 1628.131 1642.597 + 1642.597 1649.956 1649.956 1656.951 1700.911 1709.727 + 1709.727 1726.968 1726.968 1737.357 1737.357 1748.602 + 1748.602 1757.501 1757.501 1762.411 1762.411 1763.313 + + 1696.270 1690.768 1690.768 1692.858 1692.858 1693.403 + 1693.403 1691.553 1632.703 1635.214 1635.214 1638.182 + 1638.182 1633.601 1633.601 1635.223 1582.246 1594.022 + 1594.022 1611.773 1611.773 1628.131 1628.131 1642.597 + 1642.597 1649.956 1649.956 1656.951 1700.911 1709.727 + 1709.727 1726.968 1726.968 1737.357 1737.357 1748.602 + 1748.602 1757.501 1757.501 1762.411 1762.411 1763.313 + + 1692.721 1688.625 1688.625 1692.487 1692.487 1691.823 + 1691.823 1690.071 1635.567 1640.238 1640.238 1647.709 + 1647.709 1646.423 1646.423 1637.340 1585.397 1594.198 + 1594.198 1607.386 1607.386 1623.027 1623.027 1641.643 + 1641.643 1650.128 1650.128 1656.313 1699.414 1706.922 + 1706.922 1721.899 1721.899 1730.363 1730.363 1739.954 + 1739.954 1748.335 1748.335 1753.395 1753.395 1754.420 + + 1692.721 1688.625 1688.625 1692.487 1692.487 1691.823 + 1691.823 1690.071 1690.071 1689.550 1640.238 1647.709 + 1647.709 1646.423 1646.423 1637.340 1585.397 1594.198 + 1594.198 1607.386 1607.386 1623.027 1623.027 1641.643 + 1641.643 1650.128 1650.128 1656.313 1699.414 1706.922 + 1706.922 1721.899 1721.899 1730.363 1730.363 1739.954 + 1739.954 1748.335 1748.335 1753.395 1753.395 1754.420 + + 1693.325 1688.697 1688.697 1692.457 1692.457 1691.047 + 1691.047 1689.824 1689.824 1690.893 1643.813 1650.267 + 1650.267 1651.644 1651.644 1644.166 1590.064 1597.871 + 1597.871 1606.390 1606.390 1618.125 1618.125 1639.126 + 1639.126 1651.813 1651.813 1654.432 1698.714 1705.512 + 1705.512 1715.087 1715.087 1725.000 1725.000 1732.891 + 1732.891 1739.182 1739.182 1743.465 1743.465 1744.401 + + 1693.325 1688.697 1688.697 1692.457 1692.457 1691.047 + 1691.047 1689.824 1689.824 1690.893 1690.893 1690.009 + 1650.267 1651.644 1651.644 1644.166 1644.166 1650.794 + 1597.871 1606.390 1606.390 1618.125 1618.125 1639.126 + 1639.126 1651.813 1651.813 1654.432 1654.432 1660.345 + 1705.512 1715.087 1715.087 1725.000 1725.000 1732.891 + 1732.891 1739.182 1739.182 1743.465 1743.465 1744.401 + + 1695.108 1690.635 1690.635 1691.565 1691.565 1691.046 + 1691.046 1690.777 1690.777 1691.357 1691.357 1690.631 + 1648.486 1649.670 1649.670 1649.654 1649.654 1653.462 + 1598.327 1603.586 1603.586 1612.065 1612.065 1634.069 + 1634.069 1648.548 1648.548 1652.201 1652.201 1656.145 + 1702.603 1710.582 1710.582 1718.655 1718.655 1724.350 + 1724.350 1728.678 1728.678 1733.132 1733.132 1734.695 + + 1705.531 1699.496 1690.635 1691.565 1691.565 1691.046 + 1691.046 1690.777 1690.777 1691.357 1691.357 1690.631 + 1690.631 1688.549 1649.670 1649.654 1649.654 1653.462 + 1598.327 1603.586 1603.586 1612.065 1612.065 1634.069 + 1634.069 1648.548 1648.548 1652.201 1652.201 1656.145 + 1656.145 1664.201 1710.582 1718.655 1718.655 1724.350 + 1724.350 1728.678 1728.678 1733.132 1733.132 1734.695 + + 1709.284 1700.927 1691.278 1690.015 1690.015 1689.263 + 1689.263 1689.851 1689.851 1690.537 1690.537 1691.115 + 1691.115 1689.547 1649.200 1651.182 1651.182 1654.926 + 1597.434 1600.739 1600.739 1605.857 1605.857 1624.283 + 1624.283 1639.329 1639.329 1646.784 1646.784 1652.110 + 1652.110 1661.111 1701.361 1707.211 1707.211 1712.089 + 1712.089 1716.322 1716.322 1724.183 1724.183 1727.464 + + 1709.284 1700.927 1700.927 1697.234 1690.015 1689.263 + 1689.263 1689.851 1689.851 1690.537 1690.537 1691.115 + 1691.115 1689.547 1689.547 1684.118 1651.182 1654.926 + 1654.926 1661.517 1600.739 1605.857 1605.857 1624.283 + 1624.283 1639.329 1639.329 1646.784 1646.784 1652.110 + 1652.110 1661.111 1661.111 1673.965 1707.211 1712.089 + 1712.089 1716.322 1716.322 1724.183 1724.183 1727.464 + + 1713.649 1703.520 1703.520 1699.381 1689.208 1688.282 + 1688.282 1689.823 1689.823 1690.650 1690.650 1690.685 + 1690.685 1688.854 1688.854 1682.988 1652.090 1655.830 + 1655.830 1661.373 1602.400 1609.804 1609.804 1622.306 + 1622.306 1632.701 1632.701 1638.606 1638.606 1648.267 + 1648.267 1657.640 1657.640 1672.820 1689.605 1697.841 + 1697.841 1708.856 1708.856 1719.370 1719.370 1723.125 + + 1713.649 1703.520 1703.520 1699.381 1699.381 1696.168 + 1688.282 1689.823 1689.823 1690.650 1690.650 1690.685 + 1690.685 1688.854 1688.854 1682.988 1682.988 1675.808 + 1675.808 1670.958 1670.958 1670.209 1609.804 1622.306 + 1622.306 1632.701 1632.701 1638.606 1638.606 1648.267 + 1648.267 1657.640 1657.640 1672.820 1689.605 1697.841 + 1697.841 1708.856 1708.856 1719.370 1719.370 1723.125 + + 1718.446 1708.429 1708.429 1702.278 1702.278 1698.234 + 1685.797 1685.376 1685.376 1687.962 1687.962 1689.427 + 1689.427 1686.241 1686.241 1679.350 1679.350 1672.756 + 1672.756 1669.508 1669.508 1667.189 1615.454 1623.704 + 1623.704 1630.400 1630.400 1636.235 1636.235 1643.523 + 1643.523 1653.768 1653.768 1670.326 1670.326 1686.654 + 1686.654 1702.726 1702.726 1715.033 1715.033 1719.371 + + 1718.446 1708.429 1708.429 1702.278 1702.278 1698.234 + 1698.234 1696.305 1685.376 1687.962 1687.962 1689.427 + 1689.427 1686.241 1686.241 1679.350 1679.350 1672.756 + 1672.756 1669.508 1669.508 1667.189 1667.189 1669.737 + 1623.704 1630.400 1630.400 1636.235 1636.235 1643.523 + 1643.523 1653.768 1653.768 1670.326 1670.326 1686.654 + 1686.654 1702.726 1702.726 1715.033 1715.033 1719.371 + + 1721.638 1712.005 1712.005 1705.179 1705.179 1700.743 + 1700.743 1698.970 1682.150 1683.432 1683.432 1684.156 + 1684.156 1679.024 1679.024 1670.567 1670.567 1667.973 + 1667.973 1668.138 1668.138 1666.951 1666.951 1666.592 + 1627.194 1632.557 1632.557 1639.133 1639.133 1644.584 + 1644.584 1654.979 1654.979 1669.168 1669.168 1683.086 + 1683.086 1699.882 1699.882 1712.869 1712.869 1717.425 + + 1721.638 1712.005 1712.005 1705.179 1705.179 1700.743 + 1700.743 1698.970 1682.150 1683.432 1683.432 1684.156 + 1684.156 1679.024 1679.024 1670.567 1670.567 1667.973 + 1667.973 1668.138 1668.138 1666.951 1666.951 1666.592 + 1666.592 1671.425 1632.557 1639.133 1639.133 1644.584 + 1644.584 1654.979 1654.979 1669.168 1669.168 1683.086 + 1683.086 1699.882 1699.882 1712.869 1712.869 1717.425 + + 1724.732 1716.346 1716.346 1709.081 1709.081 1703.069 + 1703.069 1703.463 1680.287 1678.824 1678.824 1676.003 + 1676.003 1668.350 1668.350 1659.946 1659.946 1662.240 + 1662.240 1665.625 1665.625 1666.394 1666.394 1667.077 + 1667.077 1670.976 1637.824 1642.900 1642.900 1649.708 + 1649.708 1662.192 1662.192 1675.608 1675.608 1686.150 + 1686.150 1701.146 1701.146 1713.617 1713.617 1718.027 + + 1660.976 1665.424 1665.424 1679.734 1679.734 1693.384 + 1693.384 1702.887 1673.077 1675.447 1675.447 1682.684 + 1682.684 1686.410 1686.410 1683.473 1683.473 1680.708 + 1680.708 1682.037 1682.037 1684.286 1709.172 1718.203 + 1718.203 1719.000 1719.000 1721.113 1721.113 1721.935 + 1721.935 1720.090 1720.090 1727.635 1727.635 1739.735 + 1739.735 1748.506 1748.506 1756.850 1756.850 1760.443 + + 1662.756 1668.506 1668.506 1679.817 1679.817 1691.448 + 1691.448 1700.097 1668.541 1671.164 1671.164 1678.696 + 1678.696 1682.304 1682.304 1682.147 1682.147 1679.909 + 1679.909 1677.788 1677.788 1677.089 1700.637 1708.444 + 1708.444 1711.415 1711.415 1711.483 1711.483 1710.811 + 1710.811 1707.816 1707.816 1714.333 1714.333 1726.494 + 1726.494 1737.179 1737.179 1745.939 1745.939 1749.673 + 1662.756 1668.506 1668.506 1679.817 1679.817 1691.448 + 1691.448 1700.097 1668.541 1671.164 1671.164 1678.696 + 1678.696 1682.304 1682.304 1682.147 1682.147 1679.909 + 1679.909 1677.788 1677.788 1677.089 1677.089 1678.325 + 1708.444 1711.415 1711.415 1711.483 1711.483 1710.811 + 1710.811 1707.816 1707.816 1714.333 1714.333 1726.494 + 1726.494 1737.179 1737.179 1745.939 1745.939 1749.673 + + 1665.577 1667.160 1667.160 1677.579 1677.579 1689.415 + 1689.415 1697.293 1663.040 1666.386 1666.386 1670.849 + 1670.849 1673.611 1673.611 1675.450 1675.450 1670.512 + 1670.512 1668.777 1668.777 1667.486 1667.486 1668.096 + 1699.788 1702.808 1702.808 1704.138 1704.138 1702.536 + 1702.536 1700.666 1700.666 1704.988 1704.988 1717.928 + 1717.928 1730.877 1730.877 1739.241 1739.241 1742.760 + 1665.577 1667.160 1667.160 1677.579 1677.579 1689.415 + 1689.415 1697.293 1663.040 1666.386 1666.386 1670.849 + 1670.849 1673.611 1673.611 1675.450 1675.450 1670.512 + 1670.512 1668.777 1668.777 1667.486 1667.486 1668.096 + 1699.788 1702.808 1702.808 1704.138 1704.138 1702.536 + 1702.536 1700.666 1700.666 1704.988 1704.988 1717.928 + 1717.928 1730.877 1730.877 1739.241 1739.241 1742.760 + + 1667.630 1662.925 1662.925 1673.894 1673.894 1685.426 + 1685.426 1693.591 1655.610 1658.873 1658.873 1659.677 + 1659.677 1659.660 1659.660 1660.032 1660.032 1655.242 + 1655.242 1656.208 1656.208 1653.642 1653.642 1656.026 + 1693.113 1696.244 1696.244 1697.369 1697.369 1697.548 + 1697.548 1698.188 1698.188 1700.282 1700.282 1708.081 + 1708.081 1725.541 1725.541 1735.117 1735.117 1738.451 + 1667.630 1662.925 1662.925 1673.894 1673.894 1685.426 + 1685.426 1693.591 1655.610 1658.873 1658.873 1659.677 + 1659.677 1659.660 1659.660 1660.032 1660.032 1655.242 + 1655.242 1656.208 1656.208 1653.642 1653.642 1656.026 + 1693.113 1696.244 1696.244 1697.369 1697.369 1697.548 + 1697.548 1698.188 1698.188 1700.282 1700.282 1708.081 + 1708.081 1725.541 1725.541 1735.117 1735.117 1738.451 + + 1665.771 1659.324 1659.324 1669.462 1669.462 1680.721 + 1680.721 1688.925 1646.743 1647.851 1647.851 1644.458 + 1644.458 1646.590 1646.590 1646.332 1646.332 1643.716 + 1643.716 1644.173 1644.173 1642.185 1642.185 1645.605 + 1688.607 1691.834 1691.834 1693.998 1693.998 1695.859 + 1695.859 1698.175 1698.175 1696.989 1696.989 1706.562 + 1706.562 1721.427 1721.427 1733.348 1733.348 1736.687 + 1665.771 1659.324 1659.324 1669.462 1669.462 1680.721 + 1680.721 1688.925 1646.743 1647.851 1647.851 1644.458 + 1644.458 1646.590 1646.590 1646.332 1646.332 1643.716 + 1643.716 1644.173 1644.173 1642.185 1642.185 1645.605 + 1688.607 1691.834 1691.834 1693.998 1693.998 1695.859 + 1695.859 1698.175 1698.175 1696.989 1696.989 1706.562 + 1706.562 1721.427 1721.427 1733.348 1733.348 1736.687 + + 1665.603 1659.871 1659.871 1666.733 1666.733 1676.433 + 1676.433 1684.662 1639.224 1638.370 1638.370 1635.574 + 1635.574 1635.773 1635.773 1636.341 1636.341 1637.513 + 1637.513 1637.897 1637.897 1636.904 1636.904 1639.371 + 1686.336 1689.458 1689.458 1692.401 1692.401 1694.854 + 1694.854 1698.525 1698.525 1698.040 1698.040 1710.088 + 1710.088 1723.104 1723.104 1734.189 1734.189 1737.353 + 1665.603 1659.871 1659.871 1666.733 1666.733 1676.433 + 1676.433 1684.662 1639.224 1638.370 1638.370 1635.574 + 1635.574 1635.773 1635.773 1636.341 1636.341 1637.513 + 1637.513 1637.897 1637.897 1636.904 1636.904 1639.371 + 1639.371 1644.365 1689.458 1692.401 1692.401 1694.854 + 1694.854 1698.525 1698.525 1698.040 1698.040 1710.088 + 1710.088 1723.104 1723.104 1734.189 1734.189 1737.353 + + 1667.614 1661.957 1661.957 1665.624 1665.624 1672.650 + 1672.650 1680.556 1634.244 1634.352 1634.352 1629.729 + 1629.729 1627.870 1627.870 1632.126 1632.126 1634.655 + 1634.655 1635.044 1635.044 1633.236 1633.236 1634.784 + 1634.784 1639.267 1689.085 1692.479 1692.479 1696.879 + 1696.879 1703.173 1703.173 1704.204 1704.204 1715.733 + 1715.733 1726.288 1726.288 1736.174 1736.174 1739.324 + 1667.614 1661.957 1661.957 1665.624 1665.624 1672.650 + 1672.650 1680.556 1634.244 1634.352 1634.352 1629.729 + 1629.729 1627.870 1627.870 1632.126 1632.126 1634.655 + 1634.655 1635.044 1635.044 1633.236 1633.236 1634.784 + 1634.784 1639.267 1689.085 1692.479 1692.479 1696.879 + 1696.879 1703.173 1703.173 1704.204 1704.204 1715.733 + 1715.733 1726.288 1726.288 1736.174 1736.174 1739.324 + + 1671.135 1664.240 1664.240 1663.519 1663.519 1668.923 + 1668.923 1676.525 1629.486 1630.196 1630.196 1624.059 + 1624.059 1623.051 1623.051 1627.836 1627.836 1631.054 + 1631.054 1631.576 1631.576 1629.652 1629.652 1631.407 + 1631.407 1636.187 1690.609 1693.816 1693.816 1701.907 + 1701.907 1707.627 1707.627 1711.250 1711.250 1721.892 + 1721.892 1731.508 1731.508 1739.959 1739.959 1742.805 + 1671.135 1664.240 1664.240 1663.519 1663.519 1668.923 + 1668.923 1676.525 1629.486 1630.196 1630.196 1624.059 + 1624.059 1623.051 1623.051 1627.836 1627.836 1631.054 + 1631.054 1631.576 1631.576 1629.652 1629.652 1631.407 + 1631.407 1636.187 1690.609 1693.816 1693.816 1701.907 + 1701.907 1707.627 1707.627 1711.250 1711.250 1721.892 + 1721.892 1731.508 1731.508 1739.959 1739.959 1742.805 + + 1675.333 1669.738 1669.738 1663.673 1663.673 1667.997 + 1667.997 1673.134 1622.120 1622.702 1622.702 1618.927 + 1618.927 1618.077 1618.077 1622.709 1622.709 1627.147 + 1627.147 1627.731 1627.731 1627.159 1627.159 1630.707 + 1630.707 1636.219 1695.273 1699.167 1699.167 1710.278 + 1710.278 1713.824 1713.824 1719.489 1719.489 1730.190 + 1730.190 1737.519 1737.519 1744.848 1744.848 1747.548 + 1675.333 1669.738 1669.738 1663.673 1663.673 1667.997 + 1667.997 1673.134 1670.881 1678.377 1622.702 1618.927 + 1618.927 1618.077 1618.077 1622.709 1622.709 1627.147 + 1627.147 1627.731 1627.731 1627.159 1627.159 1630.707 + 1630.707 1636.219 1695.273 1699.167 1699.167 1710.278 + 1710.278 1713.824 1713.824 1719.489 1719.489 1730.190 + 1730.190 1737.519 1737.519 1744.848 1744.848 1747.548 + + 1680.385 1677.324 1677.324 1669.988 1669.988 1670.095 + 1670.095 1672.893 1662.348 1665.490 1612.361 1611.426 + 1611.426 1612.790 1612.790 1616.844 1616.844 1623.152 + 1623.152 1625.083 1625.083 1628.842 1628.842 1633.863 + 1633.863 1639.217 1701.857 1706.829 1706.829 1720.030 + 1720.030 1723.823 1723.823 1727.035 1727.035 1736.512 + 1736.512 1743.896 1743.896 1751.033 1751.033 1753.800 + 1680.385 1677.324 1677.324 1669.988 1669.988 1670.095 + 1670.095 1672.893 1662.348 1665.490 1612.361 1611.426 + 1611.426 1612.790 1612.790 1616.844 1616.844 1623.152 + 1623.152 1625.083 1625.083 1628.842 1628.842 1633.863 + 1633.863 1639.217 1701.857 1706.829 1706.829 1720.030 + 1720.030 1723.823 1723.823 1727.035 1727.035 1736.512 + 1736.512 1743.896 1743.896 1751.033 1751.033 1753.800 + + 1685.347 1684.004 1684.004 1680.414 1680.414 1677.032 + 1677.032 1676.417 1653.695 1653.021 1602.303 1602.597 + 1602.597 1606.125 1606.125 1611.622 1611.622 1620.747 + 1620.747 1624.541 1624.541 1633.180 1633.180 1637.290 + 1637.290 1643.133 1709.417 1716.642 1716.642 1727.245 + 1727.245 1730.486 1730.486 1733.209 1733.209 1742.420 + 1742.420 1753.032 1753.032 1760.483 1760.483 1762.779 + 1685.347 1684.004 1684.004 1680.414 1680.414 1677.032 + 1677.032 1676.417 1653.695 1653.021 1653.021 1654.326 + 1602.597 1606.125 1606.125 1611.622 1611.622 1620.747 + 1620.747 1624.541 1624.541 1633.180 1633.180 1637.290 + 1637.290 1643.133 1709.417 1716.642 1716.642 1727.245 + 1727.245 1730.486 1730.486 1733.209 1733.209 1742.420 + 1742.420 1753.032 1753.032 1760.483 1760.483 1762.779 + + 1691.281 1690.209 1690.209 1688.626 1688.626 1686.096 + 1686.096 1682.868 1645.048 1642.509 1642.509 1641.583 + 1593.322 1596.495 1596.495 1608.643 1608.643 1619.959 + 1619.959 1628.610 1628.610 1639.099 1639.099 1641.067 + 1641.067 1646.841 1713.995 1722.494 1722.494 1730.276 + 1730.276 1734.440 1734.440 1738.495 1738.495 1748.755 + 1748.755 1769.072 1769.072 1774.554 1774.554 1774.710 + 1691.281 1690.209 1690.209 1688.626 1688.626 1686.096 + 1686.096 1682.868 1645.048 1642.509 1642.509 1641.583 + 1593.322 1596.495 1596.495 1608.643 1608.643 1619.959 + 1619.959 1628.610 1628.610 1639.099 1639.099 1641.067 + 1641.067 1646.841 1713.995 1722.494 1722.494 1730.276 + 1730.276 1734.440 1734.440 1738.495 1738.495 1748.755 + 1748.755 1769.072 1769.072 1774.554 1774.554 1774.710 + + 1693.977 1693.113 1693.113 1694.047 1694.047 1693.118 + 1693.118 1689.268 1638.147 1635.343 1635.343 1633.463 + 1587.501 1589.316 1589.316 1602.457 1602.457 1621.197 + 1621.197 1634.378 1634.378 1641.345 1641.345 1644.190 + 1644.190 1649.497 1713.594 1720.783 1720.783 1729.363 + 1729.363 1735.386 1735.386 1740.228 1740.228 1758.528 + 1758.528 1781.178 1781.178 1782.172 1782.172 1781.732 + 1693.977 1693.113 1693.113 1694.047 1694.047 1693.118 + 1693.118 1689.268 1638.147 1635.343 1635.343 1633.463 + 1633.463 1635.254 1589.316 1602.457 1602.457 1621.197 + 1621.197 1634.378 1634.378 1641.345 1641.345 1644.190 + 1644.190 1649.497 1649.497 1655.041 1720.783 1729.363 + 1729.363 1735.386 1735.386 1740.228 1740.228 1758.528 + 1758.528 1781.178 1781.178 1782.172 1782.172 1781.732 + + 1697.815 1695.855 1695.855 1697.681 1697.681 1696.981 + 1696.981 1693.169 1635.225 1634.051 1634.051 1632.340 + 1632.340 1630.820 1585.399 1596.383 1596.383 1621.947 + 1621.947 1634.119 1634.119 1640.765 1640.765 1645.556 + 1645.556 1651.427 1651.427 1657.558 1715.560 1724.781 + 1724.781 1734.312 1734.312 1740.455 1740.455 1764.182 + 1764.182 1780.090 1780.090 1780.760 1780.760 1780.581 + 1697.815 1695.855 1695.855 1697.681 1697.681 1696.981 + 1696.981 1693.169 1635.225 1634.051 1634.051 1632.340 + 1632.340 1630.820 1585.399 1596.383 1596.383 1621.947 + 1621.947 1634.119 1634.119 1640.765 1640.765 1645.556 + 1645.556 1651.427 1651.427 1657.558 1715.560 1724.781 + 1724.781 1734.312 1734.312 1740.455 1740.455 1764.182 + 1764.182 1780.090 1780.090 1780.760 1780.760 1780.581 + + 1700.151 1695.872 1695.872 1696.391 1696.391 1696.847 + 1696.847 1694.529 1635.810 1636.448 1636.448 1635.970 + 1635.970 1630.449 1582.453 1588.133 1588.133 1606.011 + 1606.011 1624.411 1624.411 1637.839 1637.839 1646.010 + 1646.010 1652.420 1652.420 1659.281 1709.042 1717.318 + 1717.318 1731.633 1731.633 1743.443 1743.443 1760.030 + 1760.030 1769.696 1769.696 1773.710 1773.710 1774.178 + 1700.151 1695.872 1695.872 1696.391 1696.391 1696.847 + 1696.847 1694.529 1635.810 1636.448 1636.448 1635.970 + 1635.970 1630.449 1630.449 1635.579 1588.133 1606.011 + 1606.011 1624.411 1624.411 1637.839 1637.839 1646.010 + 1646.010 1652.420 1652.420 1659.281 1709.042 1717.318 + 1717.318 1731.633 1731.633 1743.443 1743.443 1760.030 + 1760.030 1769.696 1769.696 1773.710 1773.710 1774.178 + + 1699.568 1693.793 1693.793 1695.667 1695.667 1696.415 + 1696.415 1694.567 1638.061 1640.254 1640.254 1642.788 + 1642.788 1636.696 1636.696 1637.223 1585.416 1597.412 + 1597.412 1615.286 1615.286 1631.814 1631.814 1646.160 + 1646.160 1653.082 1653.082 1659.929 1704.724 1713.343 + 1713.343 1730.611 1730.611 1740.325 1740.325 1751.343 + 1751.343 1760.171 1760.171 1765.182 1765.182 1766.079 + 1699.568 1693.793 1693.793 1695.667 1695.667 1696.415 + 1696.415 1694.567 1638.061 1640.254 1640.254 1642.788 + 1642.788 1636.696 1636.696 1637.223 1585.416 1597.412 + 1597.412 1615.286 1615.286 1631.814 1631.814 1646.160 + 1646.160 1653.082 1653.082 1659.929 1704.724 1713.343 + 1713.343 1730.611 1730.611 1740.325 1740.325 1751.343 + 1751.343 1760.171 1760.171 1765.182 1765.182 1766.079 + + 1696.029 1691.527 1691.527 1695.373 1695.373 1694.882 + 1694.882 1693.078 1641.454 1646.033 1646.033 1653.267 + 1653.267 1650.007 1650.007 1639.346 1588.615 1597.557 + 1597.557 1610.733 1610.733 1626.797 1626.797 1645.259 + 1645.259 1653.469 1653.469 1659.542 1703.477 1710.637 + 1710.637 1725.500 1725.500 1733.003 1733.003 1742.492 + 1742.492 1751.089 1751.089 1756.286 1756.286 1757.287 + 1696.029 1691.527 1691.527 1695.373 1695.373 1694.882 + 1694.882 1693.078 1693.078 1692.476 1646.033 1653.267 + 1653.267 1650.007 1650.007 1639.346 1588.615 1597.557 + 1597.557 1610.733 1610.733 1626.797 1626.797 1645.259 + 1645.259 1653.469 1653.469 1659.542 1703.477 1710.637 + 1710.637 1725.500 1725.500 1733.003 1733.003 1742.492 + 1742.492 1751.089 1751.089 1756.286 1756.286 1757.287 + + 1696.474 1691.679 1691.679 1695.447 1695.447 1694.205 + 1694.205 1692.809 1692.809 1693.965 1649.666 1655.891 + 1655.891 1657.269 1657.269 1647.458 1593.349 1601.255 + 1601.255 1609.628 1609.628 1621.882 1621.882 1642.842 + 1642.842 1655.178 1655.178 1657.539 1703.112 1709.477 + 1709.477 1718.614 1718.614 1727.988 1727.988 1735.628 + 1735.628 1742.008 1742.008 1746.386 1746.386 1747.276 + 1696.474 1691.679 1691.679 1695.447 1695.447 1694.205 + 1694.205 1692.809 1692.809 1693.965 1693.965 1693.022 + 1655.891 1657.269 1657.269 1647.458 1647.458 1652.785 + 1601.255 1609.628 1609.628 1621.882 1621.882 1642.842 + 1642.842 1655.178 1655.178 1657.539 1657.539 1663.396 + 1709.477 1718.614 1718.614 1727.988 1727.988 1735.628 + 1735.628 1742.008 1742.008 1746.386 1746.386 1747.276 + + 1698.018 1693.538 1693.538 1694.588 1694.588 1694.093 + 1694.093 1693.731 1693.731 1694.511 1694.511 1693.730 + 1654.115 1654.859 1654.859 1653.361 1653.361 1656.052 + 1601.583 1606.807 1606.807 1615.707 1615.707 1637.892 + 1637.892 1651.982 1651.982 1655.290 1655.290 1659.253 + 1706.710 1714.249 1714.249 1721.672 1721.672 1727.214 + 1727.214 1731.599 1731.599 1736.081 1736.081 1737.531 + 1708.552 1702.535 1693.538 1694.588 1694.588 1694.093 + 1694.093 1693.731 1693.731 1694.511 1694.511 1693.730 + 1693.730 1691.586 1654.859 1653.361 1653.361 1656.052 + 1601.583 1606.807 1606.807 1615.707 1615.707 1637.892 + 1637.892 1651.982 1651.982 1655.290 1655.290 1659.253 + 1659.253 1667.577 1714.249 1721.672 1721.672 1727.214 + 1727.214 1731.599 1731.599 1736.081 1736.081 1737.531 + + 1712.239 1703.961 1694.064 1693.034 1693.034 1692.322 + 1692.322 1692.868 1692.868 1693.684 1693.684 1694.243 + 1694.243 1692.691 1653.986 1655.091 1655.091 1657.943 + 1600.634 1603.957 1603.957 1609.276 1609.276 1628.089 + 1628.089 1642.763 1642.763 1650.216 1650.216 1655.447 + 1655.447 1664.530 1704.809 1710.017 1710.017 1714.835 + 1714.835 1719.252 1719.252 1727.213 1727.213 1730.316 + 1712.239 1703.961 1703.961 1700.223 1693.034 1692.322 + 1692.322 1692.868 1692.868 1693.684 1693.684 1694.243 + 1694.243 1692.691 1692.691 1687.126 1655.091 1657.943 + 1657.943 1663.780 1603.957 1609.276 1609.276 1628.089 + 1628.089 1642.763 1642.763 1650.216 1650.216 1655.447 + 1655.447 1664.530 1664.530 1677.621 1710.017 1714.835 + 1714.835 1719.252 1719.252 1727.213 1727.213 1730.316 + + 1716.474 1706.466 1706.466 1702.426 1692.135 1691.372 + 1691.372 1692.798 1692.798 1693.713 1693.713 1693.762 + 1693.762 1691.971 1691.971 1686.045 1656.089 1659.162 + 1659.162 1664.234 1605.739 1613.298 1613.298 1625.859 + 1625.859 1636.066 1636.066 1642.018 1642.018 1651.648 + 1651.648 1661.219 1661.219 1676.282 1692.058 1700.416 + 1700.416 1711.712 1711.712 1722.373 1722.373 1725.963 + 1716.474 1706.466 1706.466 1702.426 1702.426 1699.138 + 1691.372 1692.798 1692.798 1693.713 1693.713 1693.762 + 1693.762 1691.971 1691.971 1686.045 1686.045 1678.748 + 1678.748 1673.895 1673.895 1672.678 1613.298 1625.859 + 1625.859 1636.066 1636.066 1642.018 1642.018 1651.648 + 1651.648 1661.219 1661.219 1676.282 1692.058 1700.416 + 1700.416 1711.712 1711.712 1722.373 1722.373 1725.963 + + 1721.253 1711.330 1711.330 1705.289 1705.289 1701.290 + 1688.834 1688.477 1688.477 1690.988 1690.988 1692.507 + 1692.507 1689.330 1689.330 1682.332 1682.332 1675.731 + 1675.731 1672.626 1672.626 1670.346 1618.986 1627.141 + 1627.141 1633.784 1633.784 1639.667 1639.667 1646.904 + 1646.904 1657.240 1657.240 1673.072 1673.072 1689.135 + 1689.135 1705.421 1705.421 1717.968 1717.968 1722.170 + 1721.253 1711.330 1711.330 1705.289 1705.289 1701.290 + 1701.290 1699.223 1688.477 1690.988 1690.988 1692.507 + 1692.507 1689.330 1689.330 1682.332 1682.332 1675.731 + 1675.731 1672.626 1672.626 1670.346 1670.346 1672.388 + 1627.141 1633.784 1633.784 1639.667 1639.667 1646.904 + 1646.904 1657.240 1657.240 1673.072 1673.072 1689.135 + 1689.135 1705.421 1705.421 1717.968 1717.968 1722.170 + + 1724.444 1714.889 1714.889 1708.154 1708.154 1703.829 + 1703.829 1701.995 1685.256 1686.537 1686.537 1687.184 + 1687.184 1682.021 1682.021 1673.444 1673.444 1671.026 + 1671.026 1671.340 1671.340 1670.219 1670.219 1669.738 + 1630.699 1636.023 1636.023 1642.563 1642.563 1647.969 + 1647.969 1658.459 1658.459 1671.983 1671.983 1685.450 + 1685.450 1702.528 1702.528 1715.718 1715.718 1720.171 + 1724.444 1714.889 1714.889 1708.154 1708.154 1703.829 + 1703.829 1701.995 1685.256 1686.537 1686.537 1687.184 + 1687.184 1682.021 1682.021 1673.444 1673.444 1671.026 + 1671.026 1671.340 1671.340 1670.219 1670.219 1669.738 + 1669.738 1674.264 1636.023 1642.563 1642.563 1647.969 + 1647.969 1658.459 1658.459 1671.983 1671.983 1685.450 + 1685.450 1702.528 1702.528 1715.718 1715.718 1720.171 + + 1727.614 1719.251 1719.251 1712.007 1712.007 1706.098 + 1706.098 1706.548 1683.212 1681.872 1681.872 1679.067 + 1679.067 1671.442 1671.442 1663.049 1663.049 1665.384 + 1665.384 1668.831 1668.831 1669.718 1669.718 1670.441 + 1670.441 1674.297 1641.377 1646.394 1646.394 1653.177 + 1653.177 1665.627 1665.627 1678.772 1678.772 1688.834 + 1688.834 1703.857 1703.857 1716.446 1716.446 1720.772 + 1660.976 1665.424 1665.424 1679.734 1679.734 1693.384 + 1693.384 1702.887 1673.077 1675.447 1675.447 1682.684 + 1682.684 1686.410 1686.410 1683.473 1683.473 1680.708 + 1680.708 1682.037 1682.037 1684.286 1709.172 1718.203 + 1718.203 1719.000 1719.000 1721.113 1721.113 1721.935 + 1721.935 1720.090 1720.090 1727.635 1727.635 1739.735 + 1739.735 1748.506 1748.506 1756.850 1756.850 1760.443 + + 1662.756 1668.506 1668.506 1679.817 1679.817 1691.448 + 1691.448 1700.097 1668.541 1671.164 1671.164 1678.696 + 1678.696 1682.304 1682.304 1682.147 1682.147 1679.909 + 1679.909 1677.788 1677.788 1677.089 1700.637 1708.444 + 1708.444 1711.415 1711.415 1711.483 1711.483 1710.811 + 1710.811 1707.816 1707.816 1714.333 1714.333 1726.494 + 1726.494 1737.179 1737.179 1745.939 1745.939 1749.673 + + 1662.756 1668.506 1668.506 1679.817 1679.817 1691.448 + 1691.448 1700.097 1668.541 1671.164 1671.164 1678.696 + 1678.696 1682.304 1682.304 1682.147 1682.147 1679.909 + 1679.909 1677.788 1677.788 1677.089 1677.089 1678.325 + 1708.444 1711.415 1711.415 1711.483 1711.483 1710.811 + 1710.811 1707.816 1707.816 1714.333 1714.333 1726.494 + 1726.494 1737.179 1737.179 1745.939 1745.939 1749.673 + + 1665.577 1667.160 1667.160 1677.579 1677.579 1689.415 + 1689.415 1697.293 1663.040 1666.386 1666.386 1670.849 + 1670.849 1673.611 1673.611 1675.450 1675.450 1670.512 + 1670.512 1668.777 1668.777 1667.486 1667.486 1668.096 + 1699.788 1702.808 1702.808 1704.138 1704.138 1702.536 + 1702.536 1700.666 1700.666 1704.988 1704.988 1717.928 + 1717.928 1730.877 1730.877 1739.241 1739.241 1742.760 + + 1665.577 1667.160 1667.160 1677.579 1677.579 1689.415 + 1689.415 1697.293 1663.040 1666.386 1666.386 1670.849 + 1670.849 1673.611 1673.611 1675.450 1675.450 1670.512 + 1670.512 1668.777 1668.777 1667.486 1667.486 1668.096 + 1699.788 1702.808 1702.808 1704.138 1704.138 1702.536 + 1702.536 1700.666 1700.666 1704.988 1704.988 1717.928 + 1717.928 1730.877 1730.877 1739.241 1739.241 1742.760 + + 1667.630 1662.925 1662.925 1673.894 1673.894 1685.426 + 1685.426 1693.591 1655.610 1658.873 1658.873 1659.677 + 1659.677 1659.660 1659.660 1660.032 1660.032 1655.242 + 1655.242 1656.208 1656.208 1653.642 1653.642 1656.026 + 1693.113 1696.244 1696.244 1697.369 1697.369 1697.548 + 1697.548 1698.188 1698.188 1700.282 1700.282 1708.081 + 1708.081 1725.541 1725.541 1735.117 1735.117 1738.451 + + 1667.630 1662.925 1662.925 1673.894 1673.894 1685.426 + 1685.426 1693.591 1655.610 1658.873 1658.873 1659.677 + 1659.677 1659.660 1659.660 1660.032 1660.032 1655.242 + 1655.242 1656.208 1656.208 1653.642 1653.642 1656.026 + 1693.113 1696.244 1696.244 1697.369 1697.369 1697.548 + 1697.548 1698.188 1698.188 1700.282 1700.282 1708.081 + 1708.081 1725.541 1725.541 1735.117 1735.117 1738.451 + + 1665.771 1659.324 1659.324 1669.462 1669.462 1680.721 + 1680.721 1688.925 1646.743 1647.851 1647.851 1644.458 + 1644.458 1646.590 1646.590 1646.332 1646.332 1643.716 + 1643.716 1644.173 1644.173 1642.185 1642.185 1645.605 + 1688.607 1691.834 1691.834 1693.998 1693.998 1695.859 + 1695.859 1698.175 1698.175 1696.989 1696.989 1706.562 + 1706.562 1721.427 1721.427 1733.348 1733.348 1736.687 + + 1665.771 1659.324 1659.324 1669.462 1669.462 1680.721 + 1680.721 1688.925 1646.743 1647.851 1647.851 1644.458 + 1644.458 1646.590 1646.590 1646.332 1646.332 1643.716 + 1643.716 1644.173 1644.173 1642.185 1642.185 1645.605 + 1688.607 1691.834 1691.834 1693.998 1693.998 1695.859 + 1695.859 1698.175 1698.175 1696.989 1696.989 1706.562 + 1706.562 1721.427 1721.427 1733.348 1733.348 1736.687 + + 1665.603 1659.871 1659.871 1666.733 1666.733 1676.433 + 1676.433 1684.662 1639.224 1638.370 1638.370 1635.574 + 1635.574 1635.773 1635.773 1636.341 1636.341 1637.513 + 1637.513 1637.897 1637.897 1636.904 1636.904 1639.371 + 1686.336 1689.458 1689.458 1692.401 1692.401 1694.854 + 1694.854 1698.525 1698.525 1698.040 1698.040 1710.088 + 1710.088 1723.104 1723.104 1734.189 1734.189 1737.353 + + 1665.603 1659.871 1659.871 1666.733 1666.733 1676.433 + 1676.433 1684.662 1639.224 1638.370 1638.370 1635.574 + 1635.574 1635.773 1635.773 1636.341 1636.341 1637.513 + 1637.513 1637.897 1637.897 1636.904 1636.904 1639.371 + 1639.371 1644.365 1689.458 1692.401 1692.401 1694.854 + 1694.854 1698.525 1698.525 1698.040 1698.040 1710.088 + 1710.088 1723.104 1723.104 1734.189 1734.189 1737.353 + + 1667.614 1661.957 1661.957 1665.624 1665.624 1672.650 + 1672.650 1680.556 1634.244 1634.352 1634.352 1629.729 + 1629.729 1627.870 1627.870 1632.126 1632.126 1634.655 + 1634.655 1635.044 1635.044 1633.236 1633.236 1634.784 + 1634.784 1639.267 1689.085 1692.479 1692.479 1696.879 + 1696.879 1703.173 1703.173 1704.204 1704.204 1715.733 + 1715.733 1726.288 1726.288 1736.174 1736.174 1739.324 + + 1667.614 1661.957 1661.957 1665.624 1665.624 1672.650 + 1672.650 1680.556 1634.244 1634.352 1634.352 1629.729 + 1629.729 1627.870 1627.870 1632.126 1632.126 1634.655 + 1634.655 1635.044 1635.044 1633.236 1633.236 1634.784 + 1634.784 1639.267 1689.085 1692.479 1692.479 1696.879 + 1696.879 1703.173 1703.173 1704.204 1704.204 1715.733 + 1715.733 1726.288 1726.288 1736.174 1736.174 1739.324 + + 1671.135 1664.240 1664.240 1663.519 1663.519 1668.923 + 1668.923 1676.525 1629.486 1630.196 1630.196 1624.059 + 1624.059 1623.051 1623.051 1627.836 1627.836 1631.054 + 1631.054 1631.576 1631.576 1629.652 1629.652 1631.407 + 1631.407 1636.187 1690.609 1693.816 1693.816 1701.907 + 1701.907 1707.627 1707.627 1711.250 1711.250 1721.892 + 1721.892 1731.508 1731.508 1739.959 1739.959 1742.805 + + 1671.135 1664.240 1664.240 1663.519 1663.519 1668.923 + 1668.923 1676.525 1629.486 1630.196 1630.196 1624.059 + 1624.059 1623.051 1623.051 1627.836 1627.836 1631.054 + 1631.054 1631.576 1631.576 1629.652 1629.652 1631.407 + 1631.407 1636.187 1690.609 1693.816 1693.816 1701.907 + 1701.907 1707.627 1707.627 1711.250 1711.250 1721.892 + 1721.892 1731.508 1731.508 1739.959 1739.959 1742.805 + + 1675.333 1669.738 1669.738 1663.673 1663.673 1667.997 + 1667.997 1673.134 1622.120 1622.702 1622.702 1618.927 + 1618.927 1618.077 1618.077 1622.709 1622.709 1627.147 + 1627.147 1627.731 1627.731 1627.159 1627.159 1630.707 + 1630.707 1636.219 1695.273 1699.167 1699.167 1710.278 + 1710.278 1713.824 1713.824 1719.489 1719.489 1730.190 + 1730.190 1737.519 1737.519 1744.848 1744.848 1747.548 + + 1675.333 1669.738 1669.738 1663.673 1663.673 1667.997 + 1667.997 1673.134 1670.881 1678.377 1622.702 1618.927 + 1618.927 1618.077 1618.077 1622.709 1622.709 1627.147 + 1627.147 1627.731 1627.731 1627.159 1627.159 1630.707 + 1630.707 1636.219 1695.273 1699.167 1699.167 1710.278 + 1710.278 1713.824 1713.824 1719.489 1719.489 1730.190 + 1730.190 1737.519 1737.519 1744.848 1744.848 1747.548 + + 1680.385 1677.324 1677.324 1669.988 1669.988 1670.095 + 1670.095 1672.893 1662.348 1665.490 1612.361 1611.426 + 1611.426 1612.790 1612.790 1616.844 1616.844 1623.152 + 1623.152 1625.083 1625.083 1628.842 1628.842 1633.863 + 1633.863 1639.217 1701.857 1706.829 1706.829 1720.030 + 1720.030 1723.823 1723.823 1727.035 1727.035 1736.512 + 1736.512 1743.896 1743.896 1751.033 1751.033 1753.800 + + 1680.385 1677.324 1677.324 1669.988 1669.988 1670.095 + 1670.095 1672.893 1662.348 1665.490 1612.361 1611.426 + 1611.426 1612.790 1612.790 1616.844 1616.844 1623.152 + 1623.152 1625.083 1625.083 1628.842 1628.842 1633.863 + 1633.863 1639.217 1701.857 1706.829 1706.829 1720.030 + 1720.030 1723.823 1723.823 1727.035 1727.035 1736.512 + 1736.512 1743.896 1743.896 1751.033 1751.033 1753.800 + + 1685.347 1684.004 1684.004 1680.414 1680.414 1677.032 + 1677.032 1676.417 1653.695 1653.021 1602.303 1602.597 + 1602.597 1606.125 1606.125 1611.622 1611.622 1620.747 + 1620.747 1624.541 1624.541 1633.180 1633.180 1637.290 + 1637.290 1643.133 1709.417 1716.642 1716.642 1727.245 + 1727.245 1730.486 1730.486 1733.209 1733.209 1742.420 + 1742.420 1753.032 1753.032 1760.483 1760.483 1762.779 + + 1685.347 1684.004 1684.004 1680.414 1680.414 1677.032 + 1677.032 1676.417 1653.695 1653.021 1653.021 1654.326 + 1602.597 1606.125 1606.125 1611.622 1611.622 1620.747 + 1620.747 1624.541 1624.541 1633.180 1633.180 1637.290 + 1637.290 1643.133 1709.417 1716.642 1716.642 1727.245 + 1727.245 1730.486 1730.486 1733.209 1733.209 1742.420 + 1742.420 1753.032 1753.032 1760.483 1760.483 1762.779 + + 1691.281 1690.209 1690.209 1688.626 1688.626 1686.096 + 1686.096 1682.868 1645.048 1642.509 1642.509 1641.583 + 1593.322 1596.495 1596.495 1608.643 1608.643 1619.959 + 1619.959 1628.610 1628.610 1639.099 1639.099 1641.067 + 1641.067 1646.841 1713.995 1722.494 1722.494 1730.276 + 1730.276 1734.440 1734.440 1738.495 1738.495 1748.755 + 1748.755 1769.072 1769.072 1774.554 1774.554 1774.710 + + 1691.281 1690.209 1690.209 1688.626 1688.626 1686.096 + 1686.096 1682.868 1645.048 1642.509 1642.509 1641.583 + 1593.322 1596.495 1596.495 1608.643 1608.643 1619.959 + 1619.959 1628.610 1628.610 1639.099 1639.099 1641.067 + 1641.067 1646.841 1713.995 1722.494 1722.494 1730.276 + 1730.276 1734.440 1734.440 1738.495 1738.495 1748.755 + 1748.755 1769.072 1769.072 1774.554 1774.554 1774.710 + + 1693.977 1693.113 1693.113 1694.047 1694.047 1693.118 + 1693.118 1689.268 1638.147 1635.343 1635.343 1633.463 + 1587.501 1589.316 1589.316 1602.457 1602.457 1621.197 + 1621.197 1634.378 1634.378 1641.345 1641.345 1644.190 + 1644.190 1649.497 1713.594 1720.783 1720.783 1729.363 + 1729.363 1735.386 1735.386 1740.228 1740.228 1758.528 + 1758.528 1781.178 1781.178 1782.172 1782.172 1781.732 + + 1693.977 1693.113 1693.113 1694.047 1694.047 1693.118 + 1693.118 1689.268 1638.147 1635.343 1635.343 1633.463 + 1633.463 1635.254 1589.316 1602.457 1602.457 1621.197 + 1621.197 1634.378 1634.378 1641.345 1641.345 1644.190 + 1644.190 1649.497 1649.497 1655.041 1720.783 1729.363 + 1729.363 1735.386 1735.386 1740.228 1740.228 1758.528 + 1758.528 1781.178 1781.178 1782.172 1782.172 1781.732 + + 1697.815 1695.855 1695.855 1697.681 1697.681 1696.981 + 1696.981 1693.169 1635.225 1634.051 1634.051 1632.340 + 1632.340 1630.820 1585.399 1596.383 1596.383 1621.947 + 1621.947 1634.119 1634.119 1640.765 1640.765 1645.556 + 1645.556 1651.427 1651.427 1657.558 1715.560 1724.781 + 1724.781 1734.312 1734.312 1740.455 1740.455 1764.182 + 1764.182 1780.090 1780.090 1780.760 1780.760 1780.581 + + 1697.815 1695.855 1695.855 1697.681 1697.681 1696.981 + 1696.981 1693.169 1635.225 1634.051 1634.051 1632.340 + 1632.340 1630.820 1585.399 1596.383 1596.383 1621.947 + 1621.947 1634.119 1634.119 1640.765 1640.765 1645.556 + 1645.556 1651.427 1651.427 1657.558 1715.560 1724.781 + 1724.781 1734.312 1734.312 1740.455 1740.455 1764.182 + 1764.182 1780.090 1780.090 1780.760 1780.760 1780.581 + + 1700.151 1695.872 1695.872 1696.391 1696.391 1696.847 + 1696.847 1694.529 1635.810 1636.448 1636.448 1635.970 + 1635.970 1630.449 1582.453 1588.133 1588.133 1606.011 + 1606.011 1624.411 1624.411 1637.839 1637.839 1646.010 + 1646.010 1652.420 1652.420 1659.281 1709.042 1717.318 + 1717.318 1731.633 1731.633 1743.443 1743.443 1760.030 + 1760.030 1769.696 1769.696 1773.710 1773.710 1774.178 + + 1700.151 1695.872 1695.872 1696.391 1696.391 1696.847 + 1696.847 1694.529 1635.810 1636.448 1636.448 1635.970 + 1635.970 1630.449 1630.449 1635.579 1588.133 1606.011 + 1606.011 1624.411 1624.411 1637.839 1637.839 1646.010 + 1646.010 1652.420 1652.420 1659.281 1709.042 1717.318 + 1717.318 1731.633 1731.633 1743.443 1743.443 1760.030 + 1760.030 1769.696 1769.696 1773.710 1773.710 1774.178 + + 1699.568 1693.793 1693.793 1695.667 1695.667 1696.415 + 1696.415 1694.567 1638.061 1640.254 1640.254 1642.788 + 1642.788 1636.696 1636.696 1637.223 1585.416 1597.412 + 1597.412 1615.286 1615.286 1631.814 1631.814 1646.160 + 1646.160 1653.082 1653.082 1659.929 1704.724 1713.343 + 1713.343 1730.611 1730.611 1740.325 1740.325 1751.343 + 1751.343 1760.171 1760.171 1765.182 1765.182 1766.079 + + 1699.568 1693.793 1693.793 1695.667 1695.667 1696.415 + 1696.415 1694.567 1638.061 1640.254 1640.254 1642.788 + 1642.788 1636.696 1636.696 1637.223 1585.416 1597.412 + 1597.412 1615.286 1615.286 1631.814 1631.814 1646.160 + 1646.160 1653.082 1653.082 1659.929 1704.724 1713.343 + 1713.343 1730.611 1730.611 1740.325 1740.325 1751.343 + 1751.343 1760.171 1760.171 1765.182 1765.182 1766.079 + + 1696.029 1691.527 1691.527 1695.373 1695.373 1694.882 + 1694.882 1693.078 1641.454 1646.033 1646.033 1653.267 + 1653.267 1650.007 1650.007 1639.346 1588.615 1597.557 + 1597.557 1610.733 1610.733 1626.797 1626.797 1645.259 + 1645.259 1653.469 1653.469 1659.542 1703.477 1710.637 + 1710.637 1725.500 1725.500 1733.003 1733.003 1742.492 + 1742.492 1751.089 1751.089 1756.286 1756.286 1757.287 + + 1696.029 1691.527 1691.527 1695.373 1695.373 1694.882 + 1694.882 1693.078 1693.078 1692.476 1646.033 1653.267 + 1653.267 1650.007 1650.007 1639.346 1588.615 1597.557 + 1597.557 1610.733 1610.733 1626.797 1626.797 1645.259 + 1645.259 1653.469 1653.469 1659.542 1703.477 1710.637 + 1710.637 1725.500 1725.500 1733.003 1733.003 1742.492 + 1742.492 1751.089 1751.089 1756.286 1756.286 1757.287 + + 1696.474 1691.679 1691.679 1695.447 1695.447 1694.205 + 1694.205 1692.809 1692.809 1693.965 1649.666 1655.891 + 1655.891 1657.269 1657.269 1647.458 1593.349 1601.255 + 1601.255 1609.628 1609.628 1621.882 1621.882 1642.842 + 1642.842 1655.178 1655.178 1657.539 1703.112 1709.477 + 1709.477 1718.614 1718.614 1727.988 1727.988 1735.628 + 1735.628 1742.008 1742.008 1746.386 1746.386 1747.276 + + 1696.474 1691.679 1691.679 1695.447 1695.447 1694.205 + 1694.205 1692.809 1692.809 1693.965 1693.965 1693.022 + 1655.891 1657.269 1657.269 1647.458 1647.458 1652.785 + 1601.255 1609.628 1609.628 1621.882 1621.882 1642.842 + 1642.842 1655.178 1655.178 1657.539 1657.539 1663.396 + 1709.477 1718.614 1718.614 1727.988 1727.988 1735.628 + 1735.628 1742.008 1742.008 1746.386 1746.386 1747.276 + + 1698.018 1693.538 1693.538 1694.588 1694.588 1694.093 + 1694.093 1693.731 1693.731 1694.511 1694.511 1693.730 + 1654.115 1654.859 1654.859 1653.361 1653.361 1656.052 + 1601.583 1606.807 1606.807 1615.707 1615.707 1637.892 + 1637.892 1651.982 1651.982 1655.290 1655.290 1659.253 + 1706.710 1714.249 1714.249 1721.672 1721.672 1727.214 + 1727.214 1731.599 1731.599 1736.081 1736.081 1737.531 + + 1708.552 1702.535 1693.538 1694.588 1694.588 1694.093 + 1694.093 1693.731 1693.731 1694.511 1694.511 1693.730 + 1693.730 1691.586 1654.859 1653.361 1653.361 1656.052 + 1601.583 1606.807 1606.807 1615.707 1615.707 1637.892 + 1637.892 1651.982 1651.982 1655.290 1655.290 1659.253 + 1659.253 1667.577 1714.249 1721.672 1721.672 1727.214 + 1727.214 1731.599 1731.599 1736.081 1736.081 1737.531 + + 1712.239 1703.961 1694.064 1693.034 1693.034 1692.322 + 1692.322 1692.868 1692.868 1693.684 1693.684 1694.243 + 1694.243 1692.691 1653.986 1655.091 1655.091 1657.943 + 1600.634 1603.957 1603.957 1609.276 1609.276 1628.089 + 1628.089 1642.763 1642.763 1650.216 1650.216 1655.447 + 1655.447 1664.530 1704.809 1710.017 1710.017 1714.835 + 1714.835 1719.252 1719.252 1727.213 1727.213 1730.316 + + 1712.239 1703.961 1703.961 1700.223 1693.034 1692.322 + 1692.322 1692.868 1692.868 1693.684 1693.684 1694.243 + 1694.243 1692.691 1692.691 1687.126 1655.091 1657.943 + 1657.943 1663.780 1603.957 1609.276 1609.276 1628.089 + 1628.089 1642.763 1642.763 1650.216 1650.216 1655.447 + 1655.447 1664.530 1664.530 1677.621 1710.017 1714.835 + 1714.835 1719.252 1719.252 1727.213 1727.213 1730.316 + + 1716.474 1706.466 1706.466 1702.426 1692.135 1691.372 + 1691.372 1692.798 1692.798 1693.713 1693.713 1693.762 + 1693.762 1691.971 1691.971 1686.045 1656.089 1659.162 + 1659.162 1664.234 1605.739 1613.298 1613.298 1625.859 + 1625.859 1636.066 1636.066 1642.018 1642.018 1651.648 + 1651.648 1661.219 1661.219 1676.282 1692.058 1700.416 + 1700.416 1711.712 1711.712 1722.373 1722.373 1725.963 + + 1716.474 1706.466 1706.466 1702.426 1702.426 1699.138 + 1691.372 1692.798 1692.798 1693.713 1693.713 1693.762 + 1693.762 1691.971 1691.971 1686.045 1686.045 1678.748 + 1678.748 1673.895 1673.895 1672.678 1613.298 1625.859 + 1625.859 1636.066 1636.066 1642.018 1642.018 1651.648 + 1651.648 1661.219 1661.219 1676.282 1692.058 1700.416 + 1700.416 1711.712 1711.712 1722.373 1722.373 1725.963 + + 1721.253 1711.330 1711.330 1705.289 1705.289 1701.290 + 1688.834 1688.477 1688.477 1690.988 1690.988 1692.507 + 1692.507 1689.330 1689.330 1682.332 1682.332 1675.731 + 1675.731 1672.626 1672.626 1670.346 1618.986 1627.141 + 1627.141 1633.784 1633.784 1639.667 1639.667 1646.904 + 1646.904 1657.240 1657.240 1673.072 1673.072 1689.135 + 1689.135 1705.421 1705.421 1717.968 1717.968 1722.170 + + 1721.253 1711.330 1711.330 1705.289 1705.289 1701.290 + 1701.290 1699.223 1688.477 1690.988 1690.988 1692.507 + 1692.507 1689.330 1689.330 1682.332 1682.332 1675.731 + 1675.731 1672.626 1672.626 1670.346 1670.346 1672.388 + 1627.141 1633.784 1633.784 1639.667 1639.667 1646.904 + 1646.904 1657.240 1657.240 1673.072 1673.072 1689.135 + 1689.135 1705.421 1705.421 1717.968 1717.968 1722.170 + + 1724.444 1714.889 1714.889 1708.154 1708.154 1703.829 + 1703.829 1701.995 1685.256 1686.537 1686.537 1687.184 + 1687.184 1682.021 1682.021 1673.444 1673.444 1671.026 + 1671.026 1671.340 1671.340 1670.219 1670.219 1669.738 + 1630.699 1636.023 1636.023 1642.563 1642.563 1647.969 + 1647.969 1658.459 1658.459 1671.983 1671.983 1685.450 + 1685.450 1702.528 1702.528 1715.718 1715.718 1720.171 + + 1724.444 1714.889 1714.889 1708.154 1708.154 1703.829 + 1703.829 1701.995 1685.256 1686.537 1686.537 1687.184 + 1687.184 1682.021 1682.021 1673.444 1673.444 1671.026 + 1671.026 1671.340 1671.340 1670.219 1670.219 1669.738 + 1669.738 1674.264 1636.023 1642.563 1642.563 1647.969 + 1647.969 1658.459 1658.459 1671.983 1671.983 1685.450 + 1685.450 1702.528 1702.528 1715.718 1715.718 1720.171 + + 1727.614 1719.251 1719.251 1712.007 1712.007 1706.098 + 1706.098 1706.548 1683.212 1681.872 1681.872 1679.067 + 1679.067 1671.442 1671.442 1663.049 1663.049 1665.384 + 1665.384 1668.831 1668.831 1669.718 1669.718 1670.441 + 1670.441 1674.297 1641.377 1646.394 1646.394 1653.177 + 1653.177 1665.627 1665.627 1678.772 1678.772 1688.834 + 1688.834 1703.857 1703.857 1716.446 1716.446 1720.772 + + 1663.883 1668.737 1668.737 1683.031 1683.031 1696.495 + 1696.495 1705.966 1676.065 1678.452 1678.452 1685.744 + 1685.744 1689.419 1689.419 1686.420 1686.420 1683.723 + 1683.723 1685.062 1685.062 1687.364 1712.183 1721.256 + 1721.256 1722.017 1722.017 1724.550 1724.550 1725.106 + 1725.106 1723.349 1723.349 1730.958 1730.958 1742.406 + 1742.406 1751.073 1751.073 1759.410 1759.410 1762.768 + + 1665.829 1671.743 1671.743 1682.975 1682.975 1694.537 + 1694.537 1703.172 1671.519 1674.156 1674.156 1681.756 + 1681.756 1685.312 1685.312 1685.000 1685.000 1682.917 + 1682.917 1680.726 1680.726 1680.129 1703.550 1711.231 + 1711.231 1714.450 1714.450 1714.671 1714.671 1713.935 + 1713.935 1711.086 1711.086 1717.812 1717.812 1729.821 + 1729.821 1740.029 1740.029 1748.618 1748.618 1752.062 + 1665.829 1671.743 1671.743 1682.975 1682.975 1694.537 + 1694.537 1703.172 1671.519 1674.156 1674.156 1681.756 + 1681.756 1685.312 1685.312 1685.000 1685.000 1682.917 + 1682.917 1680.726 1680.726 1680.129 1680.129 1681.442 + 1711.231 1714.450 1714.450 1714.671 1714.671 1713.935 + 1713.935 1711.086 1711.086 1717.812 1717.812 1729.821 + 1729.821 1740.029 1740.029 1748.618 1748.618 1752.062 + + 1668.550 1670.216 1670.216 1680.705 1680.705 1692.467 + 1692.467 1700.335 1666.009 1669.393 1669.393 1673.890 + 1673.890 1676.654 1676.654 1678.445 1678.445 1673.463 + 1673.463 1671.863 1671.863 1670.596 1670.596 1671.266 + 1702.704 1705.967 1705.967 1707.357 1707.357 1705.619 + 1705.619 1703.942 1703.942 1708.494 1708.494 1721.373 + 1721.373 1733.869 1733.869 1741.993 1741.993 1745.184 + 1668.550 1670.216 1670.216 1680.705 1680.705 1692.467 + 1692.467 1700.335 1666.009 1669.393 1669.393 1673.890 + 1673.890 1676.654 1676.654 1678.445 1678.445 1673.463 + 1673.463 1671.863 1671.863 1670.596 1670.596 1671.266 + 1702.704 1705.967 1705.967 1707.357 1707.357 1705.619 + 1705.619 1703.942 1703.942 1708.494 1708.494 1721.373 + 1721.373 1733.869 1733.869 1741.993 1741.993 1745.184 + + 1670.424 1665.819 1665.819 1676.980 1676.980 1688.412 + 1688.412 1696.615 1658.574 1661.910 1661.910 1662.670 + 1662.670 1662.744 1662.744 1663.009 1663.009 1658.257 + 1658.257 1659.289 1659.289 1656.730 1656.730 1659.284 + 1696.159 1699.449 1699.449 1700.595 1700.595 1700.729 + 1700.729 1701.443 1701.443 1703.768 1703.768 1711.701 + 1711.701 1728.721 1728.721 1737.756 1737.756 1740.771 + 1670.424 1665.819 1665.819 1676.980 1676.980 1688.412 + 1688.412 1696.615 1658.574 1661.910 1661.910 1662.670 + 1662.670 1662.744 1662.744 1663.009 1663.009 1658.257 + 1658.257 1659.289 1659.289 1656.730 1656.730 1659.284 + 1696.159 1699.449 1699.449 1700.595 1700.595 1700.729 + 1700.729 1701.443 1701.443 1703.768 1703.768 1711.701 + 1711.701 1728.721 1728.721 1737.756 1737.756 1740.771 + + 1668.397 1662.183 1662.183 1672.486 1672.486 1683.664 + 1683.664 1691.933 1649.696 1650.882 1650.882 1647.445 + 1647.445 1649.787 1649.787 1649.352 1649.352 1646.786 + 1646.786 1647.231 1647.231 1645.258 1645.258 1648.866 + 1691.703 1695.093 1695.093 1697.205 1697.205 1699.205 + 1699.205 1701.385 1701.385 1700.444 1700.444 1710.195 + 1710.195 1724.336 1724.336 1735.744 1735.744 1738.855 + 1668.397 1662.183 1662.183 1672.486 1672.486 1683.664 + 1683.664 1691.933 1649.696 1650.882 1650.882 1647.445 + 1647.445 1649.787 1649.787 1649.352 1649.352 1646.786 + 1646.786 1647.231 1647.231 1645.258 1645.258 1648.866 + 1691.703 1695.093 1695.093 1697.205 1697.205 1699.205 + 1699.205 1701.385 1701.385 1700.444 1700.444 1710.195 + 1710.195 1724.336 1724.336 1735.744 1735.744 1738.855 + + 1668.337 1662.779 1662.779 1669.680 1669.680 1679.376 + 1679.376 1687.639 1642.198 1641.393 1641.393 1638.530 + 1638.530 1638.961 1638.961 1639.431 1639.431 1640.643 + 1640.643 1640.954 1640.954 1640.005 1640.005 1642.588 + 1689.429 1692.624 1692.624 1695.604 1695.604 1698.176 + 1698.176 1701.790 1701.790 1701.400 1701.400 1713.745 + 1713.745 1726.089 1726.089 1736.595 1736.595 1739.540 + 1668.337 1662.779 1662.779 1669.680 1669.680 1679.376 + 1679.376 1687.639 1642.198 1641.393 1641.393 1638.530 + 1638.530 1638.961 1638.961 1639.431 1639.431 1640.643 + 1640.643 1640.954 1640.954 1640.005 1640.005 1642.588 + 1642.588 1647.649 1692.624 1695.604 1695.604 1698.176 + 1698.176 1701.790 1701.790 1701.400 1701.400 1713.745 + 1713.745 1726.089 1726.089 1736.595 1736.595 1739.540 + + 1670.545 1664.873 1664.873 1668.474 1668.474 1675.524 + 1675.524 1683.478 1637.283 1637.466 1637.466 1632.653 + 1632.653 1631.137 1631.137 1635.301 1635.301 1637.816 + 1637.816 1638.083 1638.083 1636.328 1636.328 1637.954 + 1637.954 1642.482 1692.259 1695.691 1695.691 1700.270 + 1700.270 1706.462 1706.462 1707.523 1707.523 1719.348 + 1719.348 1729.470 1729.470 1738.832 1738.832 1741.657 + 1670.545 1664.873 1664.873 1668.474 1668.474 1675.524 + 1675.524 1683.478 1637.283 1637.466 1637.466 1632.653 + 1632.653 1631.137 1631.137 1635.301 1635.301 1637.816 + 1637.816 1638.083 1638.083 1636.328 1636.328 1637.954 + 1637.954 1642.482 1692.259 1695.691 1695.691 1700.270 + 1700.270 1706.462 1706.462 1707.523 1707.523 1719.348 + 1719.348 1729.470 1729.470 1738.832 1738.832 1741.657 + + 1674.204 1667.331 1667.331 1666.246 1666.246 1671.618 + 1671.618 1679.367 1632.594 1633.384 1633.384 1626.959 + 1626.959 1626.383 1626.383 1631.119 1631.119 1634.280 + 1634.280 1634.640 1634.640 1632.742 1632.742 1634.538 + 1634.538 1639.316 1693.874 1697.081 1697.081 1705.283 + 1705.283 1710.991 1710.991 1714.644 1714.644 1725.502 + 1725.502 1734.899 1734.899 1742.720 1742.720 1745.185 + 1674.204 1667.331 1667.331 1666.246 1666.246 1671.618 + 1671.618 1679.367 1632.594 1633.384 1633.384 1626.959 + 1626.959 1626.383 1626.383 1631.119 1631.119 1634.280 + 1634.280 1634.640 1634.640 1632.742 1632.742 1634.538 + 1634.538 1639.316 1693.874 1697.081 1697.081 1705.283 + 1705.283 1710.991 1710.991 1714.644 1714.644 1725.502 + 1725.502 1734.899 1734.899 1742.720 1742.720 1745.185 + + 1678.378 1673.314 1673.314 1666.286 1666.286 1670.546 + 1670.546 1675.862 1625.297 1625.991 1625.991 1621.986 + 1621.986 1621.329 1621.329 1626.105 1626.105 1630.443 + 1630.443 1630.829 1630.829 1630.311 1630.311 1633.907 + 1633.907 1639.372 1698.876 1702.909 1702.909 1713.717 + 1713.717 1717.177 1717.177 1722.853 1722.853 1733.789 + 1733.789 1740.757 1740.757 1747.450 1747.450 1749.993 + 1678.378 1673.314 1673.314 1666.286 1666.286 1670.546 + 1670.546 1675.862 1673.763 1681.561 1625.991 1621.986 + 1621.986 1621.329 1621.329 1626.105 1626.105 1630.443 + 1630.443 1630.829 1630.829 1630.311 1630.311 1633.907 + 1633.907 1639.372 1698.876 1702.909 1702.909 1713.717 + 1713.717 1717.177 1717.177 1722.853 1722.853 1733.789 + 1733.789 1740.757 1740.757 1747.450 1747.450 1749.993 + + 1683.306 1680.946 1680.946 1673.030 1673.030 1672.785 + 1672.785 1675.535 1665.407 1668.426 1615.581 1614.515 + 1614.515 1616.117 1616.117 1620.325 1620.325 1626.499 + 1626.499 1628.312 1628.312 1632.108 1632.108 1637.116 + 1637.116 1642.474 1705.523 1710.403 1710.403 1723.396 + 1723.396 1727.136 1727.136 1730.344 1730.344 1740.072 + 1740.072 1747.473 1747.473 1754.229 1754.229 1756.640 + 1683.306 1680.946 1680.946 1673.030 1673.030 1672.785 + 1672.785 1675.535 1665.407 1668.426 1615.581 1614.515 + 1614.515 1616.117 1616.117 1620.325 1620.325 1626.499 + 1626.499 1628.312 1628.312 1632.108 1632.108 1637.116 + 1637.116 1642.474 1705.523 1710.403 1710.403 1723.396 + 1723.396 1727.136 1727.136 1730.344 1730.344 1740.072 + 1740.072 1747.473 1747.473 1754.229 1754.229 1756.640 + + 1688.205 1687.248 1687.248 1683.587 1683.587 1679.898 + 1679.898 1679.080 1657.121 1655.987 1605.475 1605.783 + 1605.783 1609.463 1609.463 1614.911 1614.911 1624.083 + 1624.083 1627.879 1627.879 1636.463 1636.463 1640.738 + 1640.738 1646.632 1713.113 1720.094 1720.094 1730.695 + 1730.695 1733.797 1733.797 1736.587 1736.587 1745.922 + 1745.922 1755.651 1755.651 1763.613 1763.613 1765.603 + 1688.205 1687.248 1687.248 1683.587 1683.587 1679.898 + 1679.898 1679.080 1657.121 1655.987 1655.987 1656.793 + 1605.783 1609.463 1609.463 1614.911 1614.911 1624.083 + 1624.083 1627.879 1627.879 1636.463 1636.463 1640.738 + 1640.738 1646.632 1713.113 1720.094 1720.094 1730.695 + 1730.695 1733.797 1733.797 1736.587 1736.587 1745.922 + 1745.922 1755.651 1755.651 1763.613 1763.613 1765.603 + + 1694.136 1693.367 1693.367 1691.632 1691.632 1689.141 + 1689.141 1685.707 1648.900 1645.758 1645.758 1644.073 + 1596.445 1599.794 1599.794 1612.084 1612.084 1623.367 + 1623.367 1632.165 1632.165 1642.301 1642.301 1644.446 + 1644.446 1650.303 1717.929 1726.194 1726.194 1733.622 + 1733.622 1737.760 1737.760 1741.951 1741.951 1752.557 + 1752.557 1771.136 1771.136 1776.766 1776.766 1777.059 + 1694.136 1693.367 1693.367 1691.632 1691.632 1689.141 + 1689.141 1685.707 1648.900 1645.758 1645.758 1644.073 + 1596.445 1599.794 1599.794 1612.084 1612.084 1623.367 + 1623.367 1632.165 1632.165 1642.301 1642.301 1644.446 + 1644.446 1650.303 1717.929 1726.194 1726.194 1733.622 + 1733.622 1737.760 1737.760 1741.951 1741.951 1752.557 + 1752.557 1771.136 1771.136 1776.766 1776.766 1777.059 + + 1696.868 1696.162 1696.162 1696.867 1696.867 1696.234 + 1696.234 1692.271 1642.327 1638.801 1638.801 1635.983 + 1590.584 1592.449 1592.449 1605.857 1605.857 1624.633 + 1624.633 1637.821 1637.821 1644.589 1644.589 1647.487 + 1647.487 1652.786 1717.648 1724.494 1724.494 1732.859 + 1732.859 1738.813 1738.813 1743.724 1743.724 1762.585 + 1762.585 1784.340 1784.340 1784.582 1784.582 1784.137 + 1696.868 1696.162 1696.162 1696.867 1696.867 1696.234 + 1696.234 1692.271 1642.327 1638.801 1638.801 1635.983 + 1635.983 1636.984 1592.449 1605.857 1605.857 1624.633 + 1624.633 1637.821 1637.821 1644.589 1644.589 1647.487 + 1647.487 1652.786 1652.786 1658.357 1724.494 1732.859 + 1732.859 1738.813 1738.813 1743.724 1743.724 1762.585 + 1762.585 1784.340 1784.340 1784.582 1784.582 1784.137 + + 1700.860 1698.807 1698.807 1700.514 1700.514 1700.121 + 1700.121 1696.237 1639.601 1637.687 1637.687 1634.907 + 1634.907 1632.448 1588.499 1599.746 1599.746 1625.608 + 1625.608 1637.595 1637.595 1644.084 1644.084 1648.891 + 1648.891 1654.678 1654.678 1660.771 1719.229 1728.316 + 1728.316 1737.766 1737.766 1743.981 1743.981 1766.925 + 1766.925 1782.745 1782.745 1783.334 1783.334 1783.168 + 1700.860 1698.807 1698.807 1700.514 1700.514 1700.121 + 1700.121 1696.237 1639.601 1637.687 1637.687 1634.907 + 1634.907 1632.448 1588.499 1599.746 1599.746 1625.608 + 1625.608 1637.595 1637.595 1644.084 1644.084 1648.891 + 1648.891 1654.678 1654.678 1660.771 1719.229 1728.316 + 1728.316 1737.766 1737.766 1743.981 1743.981 1766.925 + 1766.925 1782.745 1782.745 1783.334 1783.334 1783.168 + + 1703.312 1698.980 1698.980 1699.246 1699.246 1699.899 + 1699.899 1697.571 1640.503 1640.484 1640.484 1639.050 + 1639.050 1632.314 1585.554 1591.370 1591.370 1609.552 + 1609.552 1628.093 1628.093 1641.359 1641.359 1649.403 + 1649.403 1655.522 1655.522 1662.316 1712.846 1720.900 + 1720.900 1735.247 1735.247 1747.051 1747.051 1763.075 + 1763.075 1772.228 1772.228 1776.352 1776.352 1776.841 + 1703.312 1698.980 1698.980 1699.246 1699.246 1699.899 + 1699.899 1697.571 1640.503 1640.484 1640.484 1639.050 + 1639.050 1632.314 1632.314 1637.071 1591.370 1609.552 + 1609.552 1628.093 1628.093 1641.359 1641.359 1649.403 + 1649.403 1655.522 1655.522 1662.316 1712.846 1720.900 + 1720.900 1735.247 1735.247 1747.051 1747.051 1763.075 + 1763.075 1772.228 1772.228 1776.352 1776.352 1776.841 + + 1702.867 1696.818 1696.818 1698.475 1698.475 1699.427 + 1699.427 1697.581 1643.419 1645.294 1645.294 1647.394 + 1647.394 1639.791 1639.791 1639.224 1588.586 1600.802 + 1600.802 1618.800 1618.800 1635.498 1635.498 1649.723 + 1649.723 1656.208 1656.208 1662.906 1708.536 1716.958 + 1716.958 1734.253 1734.253 1743.292 1743.292 1754.084 + 1754.084 1762.840 1762.840 1767.953 1767.953 1768.845 + 1702.867 1696.818 1696.818 1698.475 1698.475 1699.427 + 1699.427 1697.581 1643.419 1645.294 1645.294 1647.394 + 1647.394 1639.791 1639.791 1639.224 1588.586 1600.802 + 1600.802 1618.800 1618.800 1635.498 1635.498 1649.723 + 1649.723 1656.208 1656.208 1662.906 1708.536 1716.958 + 1716.958 1734.253 1734.253 1743.292 1743.292 1754.084 + 1754.084 1762.840 1762.840 1767.953 1767.953 1768.845 + + 1699.336 1694.430 1694.430 1698.260 1698.260 1697.942 + 1697.942 1696.084 1647.341 1651.828 1651.828 1658.825 + 1658.825 1653.591 1653.591 1641.351 1591.834 1600.917 + 1600.917 1614.079 1614.079 1630.568 1630.568 1648.875 + 1648.875 1656.810 1656.810 1662.771 1707.540 1714.352 + 1714.352 1729.100 1729.100 1735.644 1735.644 1745.031 + 1745.031 1753.842 1753.842 1759.178 1759.178 1760.155 + 1699.336 1694.430 1694.430 1698.260 1698.260 1697.942 + 1697.942 1696.084 1696.084 1695.402 1651.828 1658.825 + 1658.825 1653.591 1653.591 1641.351 1591.834 1600.917 + 1600.917 1614.079 1614.079 1630.568 1630.568 1648.875 + 1648.875 1656.810 1656.810 1662.771 1707.540 1714.352 + 1714.352 1729.100 1729.100 1735.644 1735.644 1745.031 + 1745.031 1753.842 1753.842 1759.178 1759.178 1760.155 + + 1699.622 1694.661 1694.661 1698.437 1698.437 1697.363 + 1697.363 1695.793 1695.793 1697.036 1655.520 1661.515 + 1661.515 1662.893 1662.893 1650.749 1596.635 1604.640 + 1604.640 1612.866 1612.866 1625.639 1625.639 1646.557 + 1646.557 1658.544 1658.544 1660.647 1707.511 1713.443 + 1713.443 1722.141 1722.141 1730.975 1730.975 1738.365 + 1738.365 1744.835 1744.835 1749.307 1749.307 1750.151 + 1699.622 1694.661 1694.661 1698.437 1698.437 1697.363 + 1697.363 1695.793 1695.793 1697.036 1697.036 1696.035 + 1661.515 1662.893 1662.893 1650.749 1650.749 1654.775 + 1604.640 1612.866 1612.866 1625.639 1625.639 1646.557 + 1646.557 1658.544 1658.544 1660.647 1660.647 1666.448 + 1713.443 1722.141 1722.141 1730.975 1730.975 1738.365 + 1738.365 1744.835 1744.835 1749.307 1749.307 1750.151 + + 1700.928 1696.441 1696.441 1697.610 1697.610 1697.140 + 1697.140 1696.685 1696.685 1697.665 1697.665 1696.830 + 1659.744 1660.048 1660.048 1657.069 1657.069 1658.643 + 1604.840 1610.029 1610.029 1619.349 1619.349 1641.715 + 1641.715 1655.415 1655.415 1658.379 1658.379 1662.361 + 1710.818 1717.916 1717.916 1724.688 1724.688 1730.078 + 1730.078 1734.519 1734.519 1739.030 1739.030 1740.367 + 1711.572 1705.574 1696.441 1697.610 1697.610 1697.140 + 1697.140 1696.685 1696.685 1697.665 1697.665 1696.830 + 1696.830 1694.624 1660.048 1657.069 1657.069 1658.643 + 1604.840 1610.029 1610.029 1619.349 1619.349 1641.715 + 1641.715 1655.415 1655.415 1658.379 1658.379 1662.361 + 1662.361 1670.954 1717.916 1724.688 1724.688 1730.078 + 1730.078 1734.519 1734.519 1739.030 1739.030 1740.367 + + 1715.193 1706.995 1696.849 1696.052 1696.052 1695.382 + 1695.382 1695.886 1695.886 1696.831 1696.831 1697.370 + 1697.370 1695.834 1658.773 1659.000 1659.000 1660.960 + 1603.833 1607.174 1607.174 1612.695 1612.695 1631.895 + 1631.895 1646.197 1646.197 1653.648 1653.648 1658.785 + 1658.785 1667.948 1708.258 1712.824 1712.824 1717.579 + 1717.579 1722.182 1722.182 1730.242 1730.242 1733.167 + 1715.193 1706.995 1706.995 1703.212 1696.052 1695.382 + 1695.382 1695.886 1695.886 1696.831 1696.831 1697.370 + 1697.370 1695.834 1695.834 1690.134 1659.000 1660.960 + 1660.960 1666.044 1607.174 1612.695 1612.695 1631.895 + 1631.895 1646.197 1646.197 1653.648 1653.648 1658.785 + 1658.785 1667.948 1667.948 1681.278 1712.824 1717.579 + 1717.579 1722.182 1722.182 1730.242 1730.242 1733.167 + + 1719.298 1709.412 1709.412 1705.470 1695.062 1694.462 + 1694.462 1695.773 1695.773 1696.776 1696.776 1696.839 + 1696.839 1695.088 1695.088 1689.102 1660.089 1662.493 + 1662.493 1667.095 1609.077 1616.793 1616.793 1629.412 + 1629.412 1639.430 1639.430 1645.429 1645.429 1655.028 + 1655.028 1664.798 1664.798 1679.744 1694.512 1702.990 + 1702.990 1714.568 1714.568 1725.376 1725.376 1728.800 + 1719.298 1709.412 1709.412 1705.470 1705.470 1702.108 + 1694.462 1695.773 1695.773 1696.776 1696.776 1696.839 + 1696.839 1695.088 1695.088 1689.102 1689.102 1681.688 + 1681.688 1676.832 1676.832 1675.147 1616.793 1629.412 + 1629.412 1639.430 1639.430 1645.429 1645.429 1655.028 + 1655.028 1664.798 1664.798 1679.744 1694.512 1702.990 + 1702.990 1714.568 1714.568 1725.376 1725.376 1728.800 + + 1724.060 1714.231 1714.231 1708.300 1708.300 1704.346 + 1691.872 1691.579 1691.579 1694.015 1694.015 1695.587 + 1695.587 1692.418 1692.418 1685.315 1685.315 1678.706 + 1678.706 1675.745 1675.745 1673.504 1622.519 1630.578 + 1630.578 1637.168 1637.168 1643.098 1643.098 1650.285 + 1650.285 1660.712 1660.712 1675.818 1675.818 1691.616 + 1691.616 1708.117 1708.117 1720.902 1720.902 1724.969 + 1724.060 1714.231 1714.231 1708.300 1708.300 1704.346 + 1704.346 1702.141 1691.579 1694.015 1694.015 1695.587 + 1695.587 1692.418 1692.418 1685.315 1685.315 1678.706 + 1678.706 1675.745 1675.745 1673.504 1673.504 1675.040 + 1630.578 1637.168 1637.168 1643.098 1643.098 1650.285 + 1650.285 1660.712 1660.712 1675.818 1675.818 1691.616 + 1691.616 1708.117 1708.117 1720.902 1720.902 1724.969 + + 1727.250 1717.774 1717.774 1711.129 1711.129 1706.916 + 1706.916 1705.021 1688.361 1689.642 1689.642 1690.211 + 1690.211 1685.018 1685.018 1676.321 1676.321 1674.078 + 1674.078 1674.542 1674.542 1673.486 1673.486 1672.884 + 1634.203 1639.489 1639.489 1645.993 1645.993 1651.354 + 1651.354 1661.940 1661.940 1674.799 1674.799 1687.814 + 1687.814 1705.173 1705.173 1718.566 1718.566 1722.917 + 1727.250 1717.774 1717.774 1711.129 1711.129 1706.916 + 1706.916 1705.021 1688.361 1689.642 1689.642 1690.211 + 1690.211 1685.018 1685.018 1676.321 1676.321 1674.078 + 1674.078 1674.542 1674.542 1673.486 1673.486 1672.884 + 1672.884 1677.103 1639.489 1645.993 1645.993 1651.354 + 1651.354 1661.940 1661.940 1674.799 1674.799 1687.814 + 1687.814 1705.173 1705.173 1718.566 1718.566 1722.917 + + 1730.496 1722.156 1722.156 1714.933 1714.933 1709.127 + 1709.127 1709.633 1686.138 1684.920 1684.920 1682.130 + 1682.130 1674.535 1674.535 1666.151 1666.151 1668.529 + 1668.529 1672.037 1672.037 1673.041 1673.041 1673.806 + 1673.806 1677.618 1644.931 1649.887 1649.887 1656.647 + 1656.647 1669.062 1669.062 1681.937 1681.937 1691.519 + 1691.519 1706.568 1706.568 1719.275 1719.275 1723.517 + 1663.883 1668.737 1668.737 1683.031 1683.031 1696.495 + 1696.495 1705.966 1676.065 1678.452 1678.452 1685.744 + 1685.744 1689.419 1689.419 1686.420 1686.420 1683.723 + 1683.723 1685.062 1685.062 1687.364 1712.183 1721.256 + 1721.256 1722.017 1722.017 1724.550 1724.550 1725.106 + 1725.106 1723.349 1723.349 1730.958 1730.958 1742.406 + 1742.406 1751.073 1751.073 1759.410 1759.410 1762.768 + + 1665.829 1671.743 1671.743 1682.975 1682.975 1694.537 + 1694.537 1703.172 1671.519 1674.156 1674.156 1681.756 + 1681.756 1685.312 1685.312 1685.000 1685.000 1682.917 + 1682.917 1680.726 1680.726 1680.129 1703.550 1711.231 + 1711.231 1714.450 1714.450 1714.671 1714.671 1713.935 + 1713.935 1711.086 1711.086 1717.812 1717.812 1729.821 + 1729.821 1740.029 1740.029 1748.618 1748.618 1752.062 + + 1665.829 1671.743 1671.743 1682.975 1682.975 1694.537 + 1694.537 1703.172 1671.519 1674.156 1674.156 1681.756 + 1681.756 1685.312 1685.312 1685.000 1685.000 1682.917 + 1682.917 1680.726 1680.726 1680.129 1680.129 1681.442 + 1711.231 1714.450 1714.450 1714.671 1714.671 1713.935 + 1713.935 1711.086 1711.086 1717.812 1717.812 1729.821 + 1729.821 1740.029 1740.029 1748.618 1748.618 1752.062 + + 1668.550 1670.216 1670.216 1680.705 1680.705 1692.467 + 1692.467 1700.335 1666.009 1669.393 1669.393 1673.890 + 1673.890 1676.654 1676.654 1678.445 1678.445 1673.463 + 1673.463 1671.863 1671.863 1670.596 1670.596 1671.266 + 1702.704 1705.967 1705.967 1707.357 1707.357 1705.619 + 1705.619 1703.942 1703.942 1708.494 1708.494 1721.373 + 1721.373 1733.869 1733.869 1741.993 1741.993 1745.184 + + 1668.550 1670.216 1670.216 1680.705 1680.705 1692.467 + 1692.467 1700.335 1666.009 1669.393 1669.393 1673.890 + 1673.890 1676.654 1676.654 1678.445 1678.445 1673.463 + 1673.463 1671.863 1671.863 1670.596 1670.596 1671.266 + 1702.704 1705.967 1705.967 1707.357 1707.357 1705.619 + 1705.619 1703.942 1703.942 1708.494 1708.494 1721.373 + 1721.373 1733.869 1733.869 1741.993 1741.993 1745.184 + + 1670.424 1665.819 1665.819 1676.980 1676.980 1688.412 + 1688.412 1696.615 1658.574 1661.910 1661.910 1662.670 + 1662.670 1662.744 1662.744 1663.009 1663.009 1658.257 + 1658.257 1659.289 1659.289 1656.730 1656.730 1659.284 + 1696.159 1699.449 1699.449 1700.595 1700.595 1700.729 + 1700.729 1701.443 1701.443 1703.768 1703.768 1711.701 + 1711.701 1728.721 1728.721 1737.756 1737.756 1740.771 + + 1670.424 1665.819 1665.819 1676.980 1676.980 1688.412 + 1688.412 1696.615 1658.574 1661.910 1661.910 1662.670 + 1662.670 1662.744 1662.744 1663.009 1663.009 1658.257 + 1658.257 1659.289 1659.289 1656.730 1656.730 1659.284 + 1696.159 1699.449 1699.449 1700.595 1700.595 1700.729 + 1700.729 1701.443 1701.443 1703.768 1703.768 1711.701 + 1711.701 1728.721 1728.721 1737.756 1737.756 1740.771 + + 1668.397 1662.183 1662.183 1672.486 1672.486 1683.664 + 1683.664 1691.933 1649.696 1650.882 1650.882 1647.445 + 1647.445 1649.787 1649.787 1649.352 1649.352 1646.786 + 1646.786 1647.231 1647.231 1645.258 1645.258 1648.866 + 1691.703 1695.093 1695.093 1697.205 1697.205 1699.205 + 1699.205 1701.385 1701.385 1700.444 1700.444 1710.195 + 1710.195 1724.336 1724.336 1735.744 1735.744 1738.855 + + 1668.397 1662.183 1662.183 1672.486 1672.486 1683.664 + 1683.664 1691.933 1649.696 1650.882 1650.882 1647.445 + 1647.445 1649.787 1649.787 1649.352 1649.352 1646.786 + 1646.786 1647.231 1647.231 1645.258 1645.258 1648.866 + 1691.703 1695.093 1695.093 1697.205 1697.205 1699.205 + 1699.205 1701.385 1701.385 1700.444 1700.444 1710.195 + 1710.195 1724.336 1724.336 1735.744 1735.744 1738.855 + + 1668.337 1662.779 1662.779 1669.680 1669.680 1679.376 + 1679.376 1687.639 1642.198 1641.393 1641.393 1638.530 + 1638.530 1638.961 1638.961 1639.431 1639.431 1640.643 + 1640.643 1640.954 1640.954 1640.005 1640.005 1642.588 + 1689.429 1692.624 1692.624 1695.604 1695.604 1698.176 + 1698.176 1701.790 1701.790 1701.400 1701.400 1713.745 + 1713.745 1726.089 1726.089 1736.595 1736.595 1739.540 + + 1668.337 1662.779 1662.779 1669.680 1669.680 1679.376 + 1679.376 1687.639 1642.198 1641.393 1641.393 1638.530 + 1638.530 1638.961 1638.961 1639.431 1639.431 1640.643 + 1640.643 1640.954 1640.954 1640.005 1640.005 1642.588 + 1642.588 1647.649 1692.624 1695.604 1695.604 1698.176 + 1698.176 1701.790 1701.790 1701.400 1701.400 1713.745 + 1713.745 1726.089 1726.089 1736.595 1736.595 1739.540 + + 1670.545 1664.873 1664.873 1668.474 1668.474 1675.524 + 1675.524 1683.478 1637.283 1637.466 1637.466 1632.653 + 1632.653 1631.137 1631.137 1635.301 1635.301 1637.816 + 1637.816 1638.083 1638.083 1636.328 1636.328 1637.954 + 1637.954 1642.482 1692.259 1695.691 1695.691 1700.270 + 1700.270 1706.462 1706.462 1707.523 1707.523 1719.348 + 1719.348 1729.470 1729.470 1738.832 1738.832 1741.657 + + 1670.545 1664.873 1664.873 1668.474 1668.474 1675.524 + 1675.524 1683.478 1637.283 1637.466 1637.466 1632.653 + 1632.653 1631.137 1631.137 1635.301 1635.301 1637.816 + 1637.816 1638.083 1638.083 1636.328 1636.328 1637.954 + 1637.954 1642.482 1692.259 1695.691 1695.691 1700.270 + 1700.270 1706.462 1706.462 1707.523 1707.523 1719.348 + 1719.348 1729.470 1729.470 1738.832 1738.832 1741.657 + + 1674.204 1667.331 1667.331 1666.246 1666.246 1671.618 + 1671.618 1679.367 1632.594 1633.384 1633.384 1626.959 + 1626.959 1626.383 1626.383 1631.119 1631.119 1634.280 + 1634.280 1634.640 1634.640 1632.742 1632.742 1634.538 + 1634.538 1639.316 1693.874 1697.081 1697.081 1705.283 + 1705.283 1710.991 1710.991 1714.644 1714.644 1725.502 + 1725.502 1734.899 1734.899 1742.720 1742.720 1745.185 + + 1674.204 1667.331 1667.331 1666.246 1666.246 1671.618 + 1671.618 1679.367 1632.594 1633.384 1633.384 1626.959 + 1626.959 1626.383 1626.383 1631.119 1631.119 1634.280 + 1634.280 1634.640 1634.640 1632.742 1632.742 1634.538 + 1634.538 1639.316 1693.874 1697.081 1697.081 1705.283 + 1705.283 1710.991 1710.991 1714.644 1714.644 1725.502 + 1725.502 1734.899 1734.899 1742.720 1742.720 1745.185 + + 1678.378 1673.314 1673.314 1666.286 1666.286 1670.546 + 1670.546 1675.862 1625.297 1625.991 1625.991 1621.986 + 1621.986 1621.329 1621.329 1626.105 1626.105 1630.443 + 1630.443 1630.829 1630.829 1630.311 1630.311 1633.907 + 1633.907 1639.372 1698.876 1702.909 1702.909 1713.717 + 1713.717 1717.177 1717.177 1722.853 1722.853 1733.789 + 1733.789 1740.757 1740.757 1747.450 1747.450 1749.993 + + 1678.378 1673.314 1673.314 1666.286 1666.286 1670.546 + 1670.546 1675.862 1673.763 1681.561 1625.991 1621.986 + 1621.986 1621.329 1621.329 1626.105 1626.105 1630.443 + 1630.443 1630.829 1630.829 1630.311 1630.311 1633.907 + 1633.907 1639.372 1698.876 1702.909 1702.909 1713.717 + 1713.717 1717.177 1717.177 1722.853 1722.853 1733.789 + 1733.789 1740.757 1740.757 1747.450 1747.450 1749.993 + + 1683.306 1680.946 1680.946 1673.030 1673.030 1672.785 + 1672.785 1675.535 1665.407 1668.426 1615.581 1614.515 + 1614.515 1616.117 1616.117 1620.325 1620.325 1626.499 + 1626.499 1628.312 1628.312 1632.108 1632.108 1637.116 + 1637.116 1642.474 1705.523 1710.403 1710.403 1723.396 + 1723.396 1727.136 1727.136 1730.344 1730.344 1740.072 + 1740.072 1747.473 1747.473 1754.229 1754.229 1756.640 + + 1683.306 1680.946 1680.946 1673.030 1673.030 1672.785 + 1672.785 1675.535 1665.407 1668.426 1615.581 1614.515 + 1614.515 1616.117 1616.117 1620.325 1620.325 1626.499 + 1626.499 1628.312 1628.312 1632.108 1632.108 1637.116 + 1637.116 1642.474 1705.523 1710.403 1710.403 1723.396 + 1723.396 1727.136 1727.136 1730.344 1730.344 1740.072 + 1740.072 1747.473 1747.473 1754.229 1754.229 1756.640 + + 1688.205 1687.248 1687.248 1683.587 1683.587 1679.898 + 1679.898 1679.080 1657.121 1655.987 1605.475 1605.783 + 1605.783 1609.463 1609.463 1614.911 1614.911 1624.083 + 1624.083 1627.879 1627.879 1636.463 1636.463 1640.738 + 1640.738 1646.632 1713.113 1720.094 1720.094 1730.695 + 1730.695 1733.797 1733.797 1736.587 1736.587 1745.922 + 1745.922 1755.651 1755.651 1763.613 1763.613 1765.603 + + 1688.205 1687.248 1687.248 1683.587 1683.587 1679.898 + 1679.898 1679.080 1657.121 1655.987 1655.987 1656.793 + 1605.783 1609.463 1609.463 1614.911 1614.911 1624.083 + 1624.083 1627.879 1627.879 1636.463 1636.463 1640.738 + 1640.738 1646.632 1713.113 1720.094 1720.094 1730.695 + 1730.695 1733.797 1733.797 1736.587 1736.587 1745.922 + 1745.922 1755.651 1755.651 1763.613 1763.613 1765.603 + + 1694.136 1693.367 1693.367 1691.632 1691.632 1689.141 + 1689.141 1685.707 1648.900 1645.758 1645.758 1644.073 + 1596.445 1599.794 1599.794 1612.084 1612.084 1623.367 + 1623.367 1632.165 1632.165 1642.301 1642.301 1644.446 + 1644.446 1650.303 1717.929 1726.194 1726.194 1733.622 + 1733.622 1737.760 1737.760 1741.951 1741.951 1752.557 + 1752.557 1771.136 1771.136 1776.766 1776.766 1777.059 + + 1694.136 1693.367 1693.367 1691.632 1691.632 1689.141 + 1689.141 1685.707 1648.900 1645.758 1645.758 1644.073 + 1596.445 1599.794 1599.794 1612.084 1612.084 1623.367 + 1623.367 1632.165 1632.165 1642.301 1642.301 1644.446 + 1644.446 1650.303 1717.929 1726.194 1726.194 1733.622 + 1733.622 1737.760 1737.760 1741.951 1741.951 1752.557 + 1752.557 1771.136 1771.136 1776.766 1776.766 1777.059 + + 1696.868 1696.162 1696.162 1696.867 1696.867 1696.234 + 1696.234 1692.271 1642.327 1638.801 1638.801 1635.983 + 1590.584 1592.449 1592.449 1605.857 1605.857 1624.633 + 1624.633 1637.821 1637.821 1644.589 1644.589 1647.487 + 1647.487 1652.786 1717.648 1724.494 1724.494 1732.859 + 1732.859 1738.813 1738.813 1743.724 1743.724 1762.585 + 1762.585 1784.340 1784.340 1784.582 1784.582 1784.137 + + 1696.868 1696.162 1696.162 1696.867 1696.867 1696.234 + 1696.234 1692.271 1642.327 1638.801 1638.801 1635.983 + 1635.983 1636.984 1592.449 1605.857 1605.857 1624.633 + 1624.633 1637.821 1637.821 1644.589 1644.589 1647.487 + 1647.487 1652.786 1652.786 1658.357 1724.494 1732.859 + 1732.859 1738.813 1738.813 1743.724 1743.724 1762.585 + 1762.585 1784.340 1784.340 1784.582 1784.582 1784.137 + + 1700.860 1698.807 1698.807 1700.514 1700.514 1700.121 + 1700.121 1696.237 1639.601 1637.687 1637.687 1634.907 + 1634.907 1632.448 1588.499 1599.746 1599.746 1625.608 + 1625.608 1637.595 1637.595 1644.084 1644.084 1648.891 + 1648.891 1654.678 1654.678 1660.771 1719.229 1728.316 + 1728.316 1737.766 1737.766 1743.981 1743.981 1766.925 + 1766.925 1782.745 1782.745 1783.334 1783.334 1783.168 + + 1700.860 1698.807 1698.807 1700.514 1700.514 1700.121 + 1700.121 1696.237 1639.601 1637.687 1637.687 1634.907 + 1634.907 1632.448 1588.499 1599.746 1599.746 1625.608 + 1625.608 1637.595 1637.595 1644.084 1644.084 1648.891 + 1648.891 1654.678 1654.678 1660.771 1719.229 1728.316 + 1728.316 1737.766 1737.766 1743.981 1743.981 1766.925 + 1766.925 1782.745 1782.745 1783.334 1783.334 1783.168 + + 1703.312 1698.980 1698.980 1699.246 1699.246 1699.899 + 1699.899 1697.571 1640.503 1640.484 1640.484 1639.050 + 1639.050 1632.314 1585.554 1591.370 1591.370 1609.552 + 1609.552 1628.093 1628.093 1641.359 1641.359 1649.403 + 1649.403 1655.522 1655.522 1662.316 1712.846 1720.900 + 1720.900 1735.247 1735.247 1747.051 1747.051 1763.075 + 1763.075 1772.228 1772.228 1776.352 1776.352 1776.841 + + 1703.312 1698.980 1698.980 1699.246 1699.246 1699.899 + 1699.899 1697.571 1640.503 1640.484 1640.484 1639.050 + 1639.050 1632.314 1632.314 1637.071 1591.370 1609.552 + 1609.552 1628.093 1628.093 1641.359 1641.359 1649.403 + 1649.403 1655.522 1655.522 1662.316 1712.846 1720.900 + 1720.900 1735.247 1735.247 1747.051 1747.051 1763.075 + 1763.075 1772.228 1772.228 1776.352 1776.352 1776.841 + + 1702.867 1696.818 1696.818 1698.475 1698.475 1699.427 + 1699.427 1697.581 1643.419 1645.294 1645.294 1647.394 + 1647.394 1639.791 1639.791 1639.224 1588.586 1600.802 + 1600.802 1618.800 1618.800 1635.498 1635.498 1649.723 + 1649.723 1656.208 1656.208 1662.906 1708.536 1716.958 + 1716.958 1734.253 1734.253 1743.292 1743.292 1754.084 + 1754.084 1762.840 1762.840 1767.953 1767.953 1768.845 + + 1702.867 1696.818 1696.818 1698.475 1698.475 1699.427 + 1699.427 1697.581 1643.419 1645.294 1645.294 1647.394 + 1647.394 1639.791 1639.791 1639.224 1588.586 1600.802 + 1600.802 1618.800 1618.800 1635.498 1635.498 1649.723 + 1649.723 1656.208 1656.208 1662.906 1708.536 1716.958 + 1716.958 1734.253 1734.253 1743.292 1743.292 1754.084 + 1754.084 1762.840 1762.840 1767.953 1767.953 1768.845 + + 1699.336 1694.430 1694.430 1698.260 1698.260 1697.942 + 1697.942 1696.084 1647.341 1651.828 1651.828 1658.825 + 1658.825 1653.591 1653.591 1641.351 1591.834 1600.917 + 1600.917 1614.079 1614.079 1630.568 1630.568 1648.875 + 1648.875 1656.810 1656.810 1662.771 1707.540 1714.352 + 1714.352 1729.100 1729.100 1735.644 1735.644 1745.031 + 1745.031 1753.842 1753.842 1759.178 1759.178 1760.155 + + 1699.336 1694.430 1694.430 1698.260 1698.260 1697.942 + 1697.942 1696.084 1696.084 1695.402 1651.828 1658.825 + 1658.825 1653.591 1653.591 1641.351 1591.834 1600.917 + 1600.917 1614.079 1614.079 1630.568 1630.568 1648.875 + 1648.875 1656.810 1656.810 1662.771 1707.540 1714.352 + 1714.352 1729.100 1729.100 1735.644 1735.644 1745.031 + 1745.031 1753.842 1753.842 1759.178 1759.178 1760.155 + + 1699.622 1694.661 1694.661 1698.437 1698.437 1697.363 + 1697.363 1695.793 1695.793 1697.036 1655.520 1661.515 + 1661.515 1662.893 1662.893 1650.749 1596.635 1604.640 + 1604.640 1612.866 1612.866 1625.639 1625.639 1646.557 + 1646.557 1658.544 1658.544 1660.647 1707.511 1713.443 + 1713.443 1722.141 1722.141 1730.975 1730.975 1738.365 + 1738.365 1744.835 1744.835 1749.307 1749.307 1750.151 + + 1699.622 1694.661 1694.661 1698.437 1698.437 1697.363 + 1697.363 1695.793 1695.793 1697.036 1697.036 1696.035 + 1661.515 1662.893 1662.893 1650.749 1650.749 1654.775 + 1604.640 1612.866 1612.866 1625.639 1625.639 1646.557 + 1646.557 1658.544 1658.544 1660.647 1660.647 1666.448 + 1713.443 1722.141 1722.141 1730.975 1730.975 1738.365 + 1738.365 1744.835 1744.835 1749.307 1749.307 1750.151 + + 1700.928 1696.441 1696.441 1697.610 1697.610 1697.140 + 1697.140 1696.685 1696.685 1697.665 1697.665 1696.830 + 1659.744 1660.048 1660.048 1657.069 1657.069 1658.643 + 1604.840 1610.029 1610.029 1619.349 1619.349 1641.715 + 1641.715 1655.415 1655.415 1658.379 1658.379 1662.361 + 1710.818 1717.916 1717.916 1724.688 1724.688 1730.078 + 1730.078 1734.519 1734.519 1739.030 1739.030 1740.367 + + 1711.572 1705.574 1696.441 1697.610 1697.610 1697.140 + 1697.140 1696.685 1696.685 1697.665 1697.665 1696.830 + 1696.830 1694.624 1660.048 1657.069 1657.069 1658.643 + 1604.840 1610.029 1610.029 1619.349 1619.349 1641.715 + 1641.715 1655.415 1655.415 1658.379 1658.379 1662.361 + 1662.361 1670.954 1717.916 1724.688 1724.688 1730.078 + 1730.078 1734.519 1734.519 1739.030 1739.030 1740.367 + + 1715.193 1706.995 1696.849 1696.052 1696.052 1695.382 + 1695.382 1695.886 1695.886 1696.831 1696.831 1697.370 + 1697.370 1695.834 1658.773 1659.000 1659.000 1660.960 + 1603.833 1607.174 1607.174 1612.695 1612.695 1631.895 + 1631.895 1646.197 1646.197 1653.648 1653.648 1658.785 + 1658.785 1667.948 1708.258 1712.824 1712.824 1717.579 + 1717.579 1722.182 1722.182 1730.242 1730.242 1733.167 + + 1715.193 1706.995 1706.995 1703.212 1696.052 1695.382 + 1695.382 1695.886 1695.886 1696.831 1696.831 1697.370 + 1697.370 1695.834 1695.834 1690.134 1659.000 1660.960 + 1660.960 1666.044 1607.174 1612.695 1612.695 1631.895 + 1631.895 1646.197 1646.197 1653.648 1653.648 1658.785 + 1658.785 1667.948 1667.948 1681.278 1712.824 1717.579 + 1717.579 1722.182 1722.182 1730.242 1730.242 1733.167 + + 1719.298 1709.412 1709.412 1705.470 1695.062 1694.462 + 1694.462 1695.773 1695.773 1696.776 1696.776 1696.839 + 1696.839 1695.088 1695.088 1689.102 1660.089 1662.493 + 1662.493 1667.095 1609.077 1616.793 1616.793 1629.412 + 1629.412 1639.430 1639.430 1645.429 1645.429 1655.028 + 1655.028 1664.798 1664.798 1679.744 1694.512 1702.990 + 1702.990 1714.568 1714.568 1725.376 1725.376 1728.800 + + 1719.298 1709.412 1709.412 1705.470 1705.470 1702.108 + 1694.462 1695.773 1695.773 1696.776 1696.776 1696.839 + 1696.839 1695.088 1695.088 1689.102 1689.102 1681.688 + 1681.688 1676.832 1676.832 1675.147 1616.793 1629.412 + 1629.412 1639.430 1639.430 1645.429 1645.429 1655.028 + 1655.028 1664.798 1664.798 1679.744 1694.512 1702.990 + 1702.990 1714.568 1714.568 1725.376 1725.376 1728.800 + + 1724.060 1714.231 1714.231 1708.300 1708.300 1704.346 + 1691.872 1691.579 1691.579 1694.015 1694.015 1695.587 + 1695.587 1692.418 1692.418 1685.315 1685.315 1678.706 + 1678.706 1675.745 1675.745 1673.504 1622.519 1630.578 + 1630.578 1637.168 1637.168 1643.098 1643.098 1650.285 + 1650.285 1660.712 1660.712 1675.818 1675.818 1691.616 + 1691.616 1708.117 1708.117 1720.902 1720.902 1724.969 + + 1724.060 1714.231 1714.231 1708.300 1708.300 1704.346 + 1704.346 1702.141 1691.579 1694.015 1694.015 1695.587 + 1695.587 1692.418 1692.418 1685.315 1685.315 1678.706 + 1678.706 1675.745 1675.745 1673.504 1673.504 1675.040 + 1630.578 1637.168 1637.168 1643.098 1643.098 1650.285 + 1650.285 1660.712 1660.712 1675.818 1675.818 1691.616 + 1691.616 1708.117 1708.117 1720.902 1720.902 1724.969 + + 1727.250 1717.774 1717.774 1711.129 1711.129 1706.916 + 1706.916 1705.021 1688.361 1689.642 1689.642 1690.211 + 1690.211 1685.018 1685.018 1676.321 1676.321 1674.078 + 1674.078 1674.542 1674.542 1673.486 1673.486 1672.884 + 1634.203 1639.489 1639.489 1645.993 1645.993 1651.354 + 1651.354 1661.940 1661.940 1674.799 1674.799 1687.814 + 1687.814 1705.173 1705.173 1718.566 1718.566 1722.917 + + 1727.250 1717.774 1717.774 1711.129 1711.129 1706.916 + 1706.916 1705.021 1688.361 1689.642 1689.642 1690.211 + 1690.211 1685.018 1685.018 1676.321 1676.321 1674.078 + 1674.078 1674.542 1674.542 1673.486 1673.486 1672.884 + 1672.884 1677.103 1639.489 1645.993 1645.993 1651.354 + 1651.354 1661.940 1661.940 1674.799 1674.799 1687.814 + 1687.814 1705.173 1705.173 1718.566 1718.566 1722.917 + + 1730.496 1722.156 1722.156 1714.933 1714.933 1709.127 + 1709.127 1709.633 1686.138 1684.920 1684.920 1682.130 + 1682.130 1674.535 1674.535 1666.151 1666.151 1668.529 + 1668.529 1672.037 1672.037 1673.041 1673.041 1673.806 + 1673.806 1677.618 1644.931 1649.887 1649.887 1656.647 + 1656.647 1669.062 1669.062 1681.937 1681.937 1691.519 + 1691.519 1706.568 1706.568 1719.275 1719.275 1723.517 + + 1665.867 1671.063 1671.063 1685.278 1685.278 1698.629 + 1698.629 1707.978 1678.107 1680.506 1680.506 1687.837 + 1687.837 1691.482 1691.482 1688.457 1688.457 1685.809 + 1685.809 1687.242 1687.242 1689.556 1715.954 1723.903 + 1723.903 1724.130 1724.130 1726.927 1726.927 1727.333 + 1727.333 1725.651 1725.651 1733.006 1733.006 1744.105 + 1744.105 1753.445 1753.445 1762.293 1762.293 1765.485 + + 1667.930 1673.927 1673.927 1685.128 1685.128 1696.645 + 1696.645 1705.158 1673.563 1676.184 1676.184 1683.847 + 1683.847 1687.378 1687.378 1687.071 1687.071 1684.990 + 1684.990 1682.820 1682.820 1682.304 1707.337 1714.042 + 1714.042 1716.649 1716.649 1716.916 1716.916 1716.109 + 1716.109 1713.446 1713.446 1720.270 1720.270 1732.182 + 1732.182 1742.364 1742.364 1751.193 1751.193 1754.456 + 1667.930 1673.927 1673.927 1685.128 1685.128 1696.645 + 1696.645 1705.158 1673.563 1676.184 1676.184 1683.847 + 1683.847 1687.378 1687.378 1687.071 1687.071 1684.990 + 1684.990 1682.820 1682.820 1682.304 1682.304 1683.627 + 1714.042 1716.649 1716.649 1716.916 1716.916 1716.109 + 1716.109 1713.446 1713.446 1720.270 1720.270 1732.182 + 1732.182 1742.364 1742.364 1751.193 1751.193 1754.456 + + 1670.569 1672.289 1672.289 1682.816 1682.816 1694.577 + 1694.577 1702.195 1668.164 1671.464 1671.464 1675.976 + 1675.976 1678.739 1678.739 1680.488 1680.488 1675.512 + 1675.512 1674.007 1674.007 1672.760 1672.760 1673.465 + 1705.599 1708.292 1708.292 1709.607 1709.607 1707.822 + 1707.822 1706.394 1706.394 1710.949 1710.949 1723.646 + 1723.646 1736.064 1736.064 1744.229 1744.229 1747.239 + 1670.569 1672.289 1672.289 1682.816 1682.816 1694.577 + 1694.577 1702.195 1668.164 1671.464 1671.464 1675.976 + 1675.976 1678.739 1678.739 1680.488 1680.488 1675.512 + 1675.512 1674.007 1674.007 1672.760 1672.760 1673.465 + 1705.599 1708.292 1708.292 1709.607 1709.607 1707.822 + 1707.822 1706.394 1706.394 1710.949 1710.949 1723.646 + 1723.646 1736.064 1736.064 1744.229 1744.229 1747.239 + + 1672.252 1667.824 1667.824 1679.071 1679.071 1690.318 + 1690.318 1697.720 1660.779 1664.065 1664.065 1664.710 + 1664.710 1664.855 1664.855 1665.056 1665.056 1660.361 + 1660.361 1661.424 1661.424 1658.914 1658.914 1661.536 + 1699.066 1701.787 1701.787 1702.859 1702.859 1702.973 + 1702.973 1703.734 1703.734 1706.242 1706.242 1714.273 + 1714.273 1730.829 1730.829 1739.602 1739.602 1742.466 + 1672.252 1667.824 1667.824 1679.071 1679.071 1690.318 + 1690.318 1697.720 1660.779 1664.065 1664.065 1664.710 + 1664.710 1664.855 1664.855 1665.056 1665.056 1660.361 + 1660.361 1661.424 1661.424 1658.914 1658.914 1661.536 + 1699.066 1701.787 1701.787 1702.859 1702.859 1702.973 + 1702.973 1703.734 1703.734 1706.242 1706.242 1714.273 + 1714.273 1730.829 1730.829 1739.602 1739.602 1742.466 + + 1670.187 1664.132 1664.132 1674.528 1674.528 1685.612 + 1685.612 1693.100 1651.703 1652.935 1652.935 1649.501 + 1649.501 1651.972 1651.972 1651.421 1651.421 1648.920 + 1648.920 1649.342 1649.342 1647.408 1647.408 1651.121 + 1694.583 1697.473 1697.473 1699.426 1699.426 1701.541 + 1701.541 1703.599 1703.599 1702.881 1702.881 1712.664 + 1712.664 1726.038 1726.038 1737.261 1737.261 1740.295 + 1670.187 1664.132 1664.132 1674.528 1674.528 1685.612 + 1685.612 1693.100 1651.703 1652.935 1652.935 1649.501 + 1649.501 1651.972 1651.972 1651.421 1651.421 1648.920 + 1648.920 1649.342 1649.342 1647.408 1647.408 1651.121 + 1694.583 1697.473 1697.473 1699.426 1699.426 1701.541 + 1701.541 1703.599 1703.599 1702.881 1702.881 1712.664 + 1712.664 1726.038 1726.038 1737.261 1737.261 1740.295 + + 1670.288 1664.758 1664.758 1671.690 1671.690 1681.381 + 1681.381 1689.311 1644.195 1643.438 1643.438 1640.570 + 1640.570 1641.149 1641.149 1641.565 1641.565 1642.812 + 1642.812 1643.080 1643.080 1642.168 1642.168 1644.829 + 1692.201 1694.995 1694.995 1697.798 1697.798 1700.489 + 1700.489 1704.086 1704.086 1703.803 1703.803 1716.325 + 1716.325 1727.933 1727.933 1738.114 1738.114 1740.979 + 1670.288 1664.758 1664.758 1671.690 1671.690 1681.381 + 1681.381 1689.311 1644.195 1643.438 1643.438 1640.570 + 1640.570 1641.149 1641.149 1641.565 1641.565 1642.812 + 1642.812 1643.080 1643.080 1642.168 1642.168 1644.829 + 1644.829 1649.928 1694.995 1697.798 1697.798 1700.489 + 1700.489 1704.086 1704.086 1703.803 1703.803 1716.325 + 1716.325 1727.933 1727.933 1738.114 1738.114 1740.979 + + 1672.584 1666.863 1666.863 1670.425 1670.425 1677.467 + 1677.467 1685.256 1639.536 1639.696 1639.696 1634.663 + 1634.663 1633.383 1633.383 1637.494 1637.494 1640.025 + 1640.025 1640.202 1640.202 1638.493 1638.493 1640.185 + 1640.185 1644.763 1694.538 1697.865 1697.865 1702.665 + 1702.665 1708.768 1708.768 1709.871 1709.871 1721.919 + 1721.919 1731.575 1731.575 1740.556 1740.556 1743.232 + 1672.584 1666.863 1666.863 1670.425 1670.425 1677.467 + 1677.467 1685.256 1639.536 1639.696 1639.696 1634.663 + 1634.663 1633.383 1633.383 1637.494 1637.494 1640.025 + 1640.025 1640.202 1640.202 1638.493 1638.493 1640.185 + 1640.185 1644.763 1694.538 1697.865 1697.865 1702.665 + 1702.665 1708.768 1708.768 1709.871 1709.871 1721.919 + 1721.919 1731.575 1731.575 1740.556 1740.556 1743.232 + + 1676.262 1669.484 1669.484 1668.149 1668.149 1673.444 + 1673.444 1681.232 1634.859 1635.607 1635.607 1628.960 + 1628.960 1628.664 1628.664 1633.390 1633.390 1636.520 + 1636.520 1636.747 1636.747 1634.858 1634.858 1636.785 + 1636.785 1641.600 1696.118 1699.357 1699.357 1707.674 + 1707.674 1713.375 1713.375 1717.075 1717.075 1728.144 + 1728.144 1737.222 1737.222 1744.496 1744.496 1746.788 + 1676.262 1669.484 1669.484 1668.149 1668.149 1673.444 + 1673.444 1681.232 1634.859 1635.607 1635.607 1628.960 + 1628.960 1628.664 1628.664 1633.390 1633.390 1636.520 + 1636.520 1636.747 1636.747 1634.858 1634.858 1636.785 + 1636.785 1641.600 1696.118 1699.357 1699.357 1707.674 + 1707.674 1713.375 1713.375 1717.075 1717.075 1728.144 + 1728.144 1737.222 1737.222 1744.496 1744.496 1746.788 + + 1680.412 1675.761 1675.761 1668.350 1668.350 1672.286 + 1672.286 1677.738 1627.515 1628.287 1628.287 1624.069 + 1624.069 1623.581 1623.581 1628.450 1628.450 1632.727 + 1632.727 1633.224 1633.224 1632.592 1632.592 1636.149 + 1636.149 1641.645 1701.263 1705.415 1705.415 1716.153 + 1716.153 1719.584 1719.584 1725.255 1725.255 1736.408 + 1736.408 1742.976 1742.976 1749.150 1749.150 1751.631 + 1680.412 1675.761 1675.761 1668.350 1668.350 1672.286 + 1672.286 1677.738 1675.686 1683.030 1628.287 1624.069 + 1624.069 1623.581 1623.581 1628.450 1628.450 1632.727 + 1632.727 1633.224 1633.224 1632.592 1632.592 1636.149 + 1636.149 1641.645 1701.263 1705.415 1705.415 1716.153 + 1716.153 1719.584 1719.584 1725.255 1725.255 1736.408 + 1736.408 1742.976 1742.976 1749.150 1749.150 1751.631 + + 1685.135 1683.224 1683.224 1675.462 1675.462 1674.671 + 1674.671 1677.387 1667.272 1670.099 1617.783 1616.625 + 1616.625 1618.401 1618.401 1622.718 1622.718 1628.764 + 1628.764 1630.594 1630.594 1634.397 1634.397 1639.368 + 1639.368 1644.736 1708.362 1713.907 1713.907 1725.781 + 1725.781 1729.513 1729.513 1732.701 1732.701 1742.634 + 1742.634 1750.060 1750.060 1756.477 1756.477 1758.687 + 1685.135 1683.224 1683.224 1675.462 1675.462 1674.671 + 1674.671 1677.387 1667.272 1670.099 1617.783 1616.625 + 1616.625 1618.401 1618.401 1622.718 1622.718 1628.764 + 1628.764 1630.594 1630.594 1634.397 1634.397 1639.368 + 1639.368 1644.736 1708.362 1713.907 1713.907 1725.781 + 1725.781 1729.513 1729.513 1732.701 1732.701 1742.634 + 1742.634 1750.060 1750.060 1756.477 1756.477 1758.687 + + 1689.931 1689.348 1689.348 1685.776 1685.776 1681.931 + 1681.931 1680.987 1659.096 1657.984 1607.618 1607.962 + 1607.962 1611.749 1611.749 1617.219 1617.219 1626.322 + 1626.322 1630.215 1630.215 1638.705 1638.705 1643.063 + 1643.063 1648.907 1715.582 1722.879 1722.879 1733.121 + 1733.121 1736.164 1736.164 1738.981 1738.981 1748.325 + 1748.325 1757.223 1757.223 1765.742 1765.742 1767.589 + 1689.931 1689.348 1689.348 1685.776 1685.776 1681.931 + 1681.931 1680.987 1659.096 1657.984 1657.984 1658.771 + 1607.962 1611.749 1611.749 1617.219 1617.219 1626.322 + 1626.322 1630.215 1630.215 1638.705 1638.705 1643.063 + 1643.063 1648.907 1715.582 1722.879 1722.879 1733.121 + 1733.121 1736.164 1736.164 1738.981 1738.981 1748.325 + 1748.325 1757.223 1757.223 1765.742 1765.742 1767.589 + + 1695.900 1695.442 1695.442 1693.651 1693.651 1691.262 + 1691.262 1687.787 1651.146 1648.306 1648.306 1646.719 + 1598.572 1602.100 1602.100 1614.453 1614.453 1625.689 + 1625.689 1634.618 1634.618 1644.456 1644.456 1646.780 + 1646.780 1652.596 1720.002 1728.531 1728.531 1736.086 + 1736.086 1740.136 1740.136 1744.418 1744.418 1755.207 + 1755.207 1772.300 1772.300 1778.263 1778.263 1778.629 + 1695.900 1695.442 1695.442 1693.651 1693.651 1691.262 + 1691.262 1687.787 1651.146 1648.306 1648.306 1646.719 + 1598.572 1602.100 1602.100 1614.453 1614.453 1625.689 + 1625.689 1634.618 1634.618 1644.456 1644.456 1646.780 + 1646.780 1652.596 1720.002 1728.531 1728.531 1736.086 + 1736.086 1740.136 1740.136 1744.418 1744.418 1755.207 + 1755.207 1772.300 1772.300 1778.263 1778.263 1778.629 + + 1698.677 1698.205 1698.205 1698.712 1698.712 1698.385 + 1698.385 1694.503 1644.780 1641.866 1641.866 1639.128 + 1592.681 1594.605 1594.605 1608.204 1608.204 1626.996 + 1626.996 1640.222 1640.222 1646.820 1646.820 1649.790 + 1649.790 1655.084 1719.562 1726.757 1726.757 1735.341 + 1735.341 1741.235 1741.235 1746.231 1746.231 1765.572 + 1765.572 1786.370 1786.370 1786.100 1786.100 1785.653 + 1698.677 1698.205 1698.205 1698.712 1698.712 1698.385 + 1698.385 1694.503 1644.780 1641.866 1641.866 1639.128 + 1639.128 1639.783 1594.605 1608.204 1608.204 1626.996 + 1626.996 1640.222 1640.222 1646.820 1646.820 1649.790 + 1649.790 1655.084 1655.084 1660.679 1726.757 1735.341 + 1735.341 1741.235 1741.235 1746.231 1746.231 1765.572 + 1765.572 1786.370 1786.370 1786.100 1786.100 1785.653 + + 1702.796 1700.840 1700.840 1702.362 1702.362 1702.258 + 1702.258 1698.528 1641.853 1640.348 1640.348 1637.508 + 1637.508 1634.832 1590.638 1602.091 1602.091 1628.097 + 1628.097 1640.005 1640.005 1646.400 1646.400 1651.219 + 1651.219 1656.995 1656.995 1663.103 1721.472 1730.829 + 1730.829 1740.215 1740.215 1746.539 1746.539 1768.551 + 1768.551 1784.292 1784.292 1784.841 1784.841 1784.681 + 1702.796 1700.840 1700.840 1702.362 1702.362 1702.258 + 1702.258 1698.528 1641.853 1640.348 1640.348 1637.508 + 1637.508 1634.832 1590.638 1602.091 1602.091 1628.097 + 1628.097 1640.005 1640.005 1646.400 1646.400 1651.219 + 1651.219 1656.995 1656.995 1663.103 1721.472 1730.829 + 1730.829 1740.215 1740.215 1746.539 1746.539 1768.551 + 1768.551 1784.292 1784.292 1784.841 1784.841 1784.681 + + 1705.418 1701.131 1701.131 1701.139 1701.139 1701.977 + 1701.977 1699.834 1642.327 1642.439 1642.439 1641.224 + 1641.224 1634.581 1587.691 1593.633 1593.633 1612.016 + 1612.016 1630.660 1630.660 1643.818 1643.818 1651.776 + 1651.776 1657.861 1657.861 1664.671 1715.389 1723.403 + 1723.403 1737.834 1737.834 1749.577 1749.577 1764.907 + 1764.907 1773.645 1773.645 1777.810 1777.810 1778.298 + 1705.418 1701.131 1701.131 1701.139 1701.139 1701.977 + 1701.977 1699.834 1642.327 1642.439 1642.439 1641.224 + 1641.224 1634.581 1634.581 1639.950 1593.633 1612.016 + 1612.016 1630.660 1630.660 1643.818 1643.818 1651.776 + 1651.776 1657.861 1657.861 1664.671 1715.389 1723.403 + 1723.403 1737.834 1737.834 1749.577 1749.577 1764.907 + 1764.907 1773.645 1773.645 1777.810 1777.810 1778.298 + + 1705.046 1698.925 1698.925 1700.360 1700.360 1701.489 + 1701.489 1699.801 1645.081 1647.146 1647.146 1649.537 + 1649.537 1642.004 1642.004 1641.747 1590.779 1603.172 + 1603.172 1621.265 1621.265 1638.101 1638.101 1652.191 + 1652.191 1658.575 1658.575 1665.299 1711.586 1719.927 + 1719.927 1736.861 1736.861 1745.291 1745.291 1755.782 + 1755.782 1764.359 1764.359 1769.442 1769.442 1770.308 + 1705.046 1698.925 1698.925 1700.360 1700.360 1701.489 + 1701.489 1699.801 1645.081 1647.146 1647.146 1649.537 + 1649.537 1642.004 1642.004 1641.747 1590.779 1603.172 + 1603.172 1621.265 1621.265 1638.101 1638.101 1652.191 + 1652.191 1658.575 1658.575 1665.299 1711.586 1719.927 + 1719.927 1736.861 1736.861 1745.291 1745.291 1755.782 + 1755.782 1764.359 1764.359 1769.442 1769.442 1770.308 + + 1701.575 1696.446 1696.446 1700.163 1700.163 1700.071 + 1700.071 1698.265 1649.048 1653.815 1653.815 1661.196 + 1661.196 1656.073 1656.073 1643.726 1594.050 1603.270 + 1603.270 1616.415 1616.415 1633.252 1633.252 1651.405 + 1651.405 1659.210 1659.210 1665.191 1710.274 1717.209 + 1717.209 1731.585 1731.585 1737.342 1737.342 1746.645 + 1746.645 1755.435 1755.435 1760.739 1760.739 1761.683 + 1701.575 1696.446 1696.446 1700.163 1700.163 1700.071 + 1700.071 1698.265 1698.265 1697.624 1653.815 1661.196 + 1661.196 1656.073 1656.073 1643.726 1594.050 1603.270 + 1603.270 1616.415 1616.415 1633.252 1633.252 1651.405 + 1651.405 1659.210 1659.210 1665.191 1710.274 1717.209 + 1717.209 1731.585 1731.585 1737.342 1737.342 1746.645 + 1746.645 1755.435 1755.435 1760.739 1760.739 1761.683 + + 1701.757 1696.753 1696.753 1700.425 1700.425 1699.547 + 1699.547 1697.890 1697.890 1699.240 1657.888 1664.655 + 1664.655 1665.676 1665.676 1652.956 1598.881 1606.997 + 1606.997 1615.135 1615.135 1628.340 1628.340 1649.172 + 1649.172 1660.914 1660.914 1662.974 1709.459 1715.798 + 1715.798 1724.554 1724.554 1733.106 1733.106 1740.164 + 1740.164 1746.489 1746.489 1750.971 1750.971 1751.801 + 1701.757 1696.753 1696.753 1700.425 1700.425 1699.547 + 1699.547 1697.890 1697.890 1699.240 1699.240 1698.425 + 1664.655 1665.676 1665.676 1652.956 1652.956 1657.545 + 1606.997 1615.135 1615.135 1628.340 1628.340 1649.172 + 1649.172 1660.914 1660.914 1662.974 1662.974 1668.802 + 1715.798 1724.554 1724.554 1733.106 1733.106 1740.164 + 1740.164 1746.489 1746.489 1750.971 1750.971 1751.801 + + 1702.975 1698.504 1698.504 1699.707 1699.707 1699.251 + 1699.251 1698.726 1698.726 1699.779 1699.779 1699.099 + 1662.615 1662.498 1662.498 1659.182 1659.182 1661.135 + 1607.075 1612.303 1612.303 1621.961 1621.961 1644.392 + 1644.392 1657.844 1657.844 1660.680 1660.680 1664.698 + 1712.763 1720.071 1720.071 1726.745 1726.745 1731.925 + 1731.925 1736.220 1736.220 1740.614 1740.614 1741.866 + 1713.655 1707.769 1698.504 1699.707 1699.707 1699.251 + 1699.251 1698.726 1698.726 1699.779 1699.779 1699.099 + 1699.099 1697.153 1662.498 1659.182 1659.182 1661.135 + 1607.075 1612.303 1612.303 1621.961 1621.961 1644.392 + 1644.392 1657.844 1657.844 1660.680 1660.680 1664.698 + 1664.698 1673.271 1720.071 1726.745 1726.745 1731.925 + 1731.925 1736.220 1736.220 1740.614 1740.614 1741.866 + + 1717.219 1709.162 1698.851 1698.135 1698.135 1697.494 + 1697.494 1697.977 1697.977 1699.020 1699.020 1699.568 + 1699.568 1698.195 1660.832 1660.940 1660.940 1663.219 + 1605.991 1609.399 1609.399 1615.200 1615.200 1634.572 + 1634.572 1648.636 1648.636 1656.084 1656.084 1661.137 + 1661.137 1670.244 1710.094 1714.530 1714.530 1719.204 + 1719.204 1723.814 1723.814 1731.948 1731.948 1734.778 + 1717.219 1709.162 1709.162 1705.497 1698.135 1697.494 + 1697.494 1697.977 1697.977 1699.020 1699.020 1699.568 + 1699.568 1698.195 1698.195 1692.624 1660.940 1663.219 + 1663.219 1669.141 1609.399 1615.200 1615.200 1634.572 + 1634.572 1648.636 1648.636 1656.084 1656.084 1661.137 + 1661.137 1670.244 1670.244 1683.446 1714.530 1719.204 + 1719.204 1723.814 1723.814 1731.948 1731.948 1734.778 + + 1721.234 1711.465 1711.465 1707.672 1697.125 1696.604 + 1696.604 1697.851 1697.851 1698.888 1698.888 1698.985 + 1698.985 1697.316 1697.316 1691.371 1661.870 1664.488 + 1664.488 1669.514 1611.342 1619.285 1619.285 1631.922 + 1631.922 1641.816 1641.816 1647.865 1647.865 1657.423 + 1657.423 1667.147 1667.147 1681.918 1695.688 1704.223 + 1704.223 1716.011 1716.011 1726.964 1726.964 1730.321 + 1721.234 1711.465 1711.465 1707.672 1707.672 1704.463 + 1696.604 1697.851 1697.851 1698.888 1698.888 1698.985 + 1698.985 1697.316 1697.316 1691.371 1691.371 1683.956 + 1683.956 1679.147 1679.147 1678.319 1619.285 1631.922 + 1631.922 1641.816 1641.816 1647.865 1647.865 1657.423 + 1657.423 1667.147 1667.147 1681.918 1695.688 1704.223 + 1704.223 1716.011 1716.011 1726.964 1726.964 1730.321 + + 1725.972 1716.231 1716.231 1710.395 1710.395 1706.544 + 1694.017 1693.762 1693.762 1696.136 1696.136 1697.712 + 1697.712 1694.564 1694.564 1687.392 1687.392 1680.844 + 1680.844 1677.966 1677.966 1675.826 1624.878 1633.015 + 1633.015 1639.587 1639.587 1645.544 1645.544 1652.709 + 1652.709 1663.164 1663.164 1677.598 1677.598 1692.922 + 1692.922 1709.529 1709.529 1722.462 1722.462 1726.464 + 1725.972 1716.231 1716.231 1710.395 1710.395 1706.544 + 1706.544 1704.436 1693.762 1696.136 1696.136 1697.712 + 1697.712 1694.564 1694.564 1687.392 1687.392 1680.844 + 1680.844 1677.966 1677.966 1675.826 1675.826 1678.118 + 1633.015 1639.587 1639.587 1645.544 1645.544 1652.709 + 1652.709 1663.164 1663.164 1677.598 1677.598 1692.922 + 1692.922 1709.529 1709.529 1722.462 1722.462 1726.464 + + 1729.168 1719.762 1719.762 1713.199 1713.199 1708.976 + 1708.976 1707.153 1690.563 1691.830 1691.830 1692.349 + 1692.349 1687.129 1687.129 1678.320 1678.320 1676.194 + 1676.194 1676.760 1676.760 1675.823 1675.823 1675.472 + 1636.535 1641.948 1641.948 1648.457 1648.457 1653.784 + 1653.784 1664.407 1664.407 1676.652 1676.652 1689.313 + 1689.313 1706.751 1706.751 1720.234 1720.234 1724.523 + 1729.168 1719.762 1719.762 1713.199 1713.199 1708.976 + 1708.976 1707.153 1690.563 1691.830 1691.830 1692.349 + 1692.349 1687.129 1687.129 1678.320 1678.320 1676.194 + 1676.194 1676.760 1676.760 1675.823 1675.823 1675.472 + 1675.472 1680.186 1641.948 1648.457 1648.457 1653.784 + 1653.784 1664.407 1664.407 1676.652 1676.652 1689.313 + 1689.313 1706.751 1706.751 1720.234 1720.234 1724.523 + + 1732.468 1724.146 1724.146 1716.962 1716.962 1711.260 + 1711.260 1711.790 1688.235 1687.071 1687.071 1684.279 + 1684.279 1676.719 1676.719 1668.366 1668.366 1670.720 + 1670.720 1674.278 1674.278 1675.411 1675.411 1676.207 + 1676.207 1680.198 1647.323 1652.399 1652.399 1659.150 + 1659.150 1671.521 1671.521 1684.162 1684.162 1693.316 + 1693.316 1708.326 1708.326 1721.092 1721.092 1725.277 + 1665.867 1671.063 1671.063 1685.278 1685.278 1698.629 + 1698.629 1707.978 1678.107 1680.506 1680.506 1687.837 + 1687.837 1691.482 1691.482 1688.457 1688.457 1685.809 + 1685.809 1687.242 1687.242 1689.556 1715.954 1723.903 + 1723.903 1724.130 1724.130 1726.927 1726.927 1727.333 + 1727.333 1725.651 1725.651 1733.006 1733.006 1744.105 + 1744.105 1753.445 1753.445 1762.293 1762.293 1765.485 + + 1667.930 1673.927 1673.927 1685.128 1685.128 1696.645 + 1696.645 1705.158 1673.563 1676.184 1676.184 1683.847 + 1683.847 1687.378 1687.378 1687.071 1687.071 1684.990 + 1684.990 1682.820 1682.820 1682.304 1707.337 1714.042 + 1714.042 1716.649 1716.649 1716.916 1716.916 1716.109 + 1716.109 1713.446 1713.446 1720.270 1720.270 1732.182 + 1732.182 1742.364 1742.364 1751.193 1751.193 1754.456 + + 1667.930 1673.927 1673.927 1685.128 1685.128 1696.645 + 1696.645 1705.158 1673.563 1676.184 1676.184 1683.847 + 1683.847 1687.378 1687.378 1687.071 1687.071 1684.990 + 1684.990 1682.820 1682.820 1682.304 1682.304 1683.627 + 1714.042 1716.649 1716.649 1716.916 1716.916 1716.109 + 1716.109 1713.446 1713.446 1720.270 1720.270 1732.182 + 1732.182 1742.364 1742.364 1751.193 1751.193 1754.456 + + 1670.569 1672.289 1672.289 1682.816 1682.816 1694.577 + 1694.577 1702.195 1668.164 1671.464 1671.464 1675.976 + 1675.976 1678.739 1678.739 1680.488 1680.488 1675.512 + 1675.512 1674.007 1674.007 1672.760 1672.760 1673.465 + 1705.599 1708.292 1708.292 1709.607 1709.607 1707.822 + 1707.822 1706.394 1706.394 1710.949 1710.949 1723.646 + 1723.646 1736.064 1736.064 1744.229 1744.229 1747.239 + + 1670.569 1672.289 1672.289 1682.816 1682.816 1694.577 + 1694.577 1702.195 1668.164 1671.464 1671.464 1675.976 + 1675.976 1678.739 1678.739 1680.488 1680.488 1675.512 + 1675.512 1674.007 1674.007 1672.760 1672.760 1673.465 + 1705.599 1708.292 1708.292 1709.607 1709.607 1707.822 + 1707.822 1706.394 1706.394 1710.949 1710.949 1723.646 + 1723.646 1736.064 1736.064 1744.229 1744.229 1747.239 + + 1672.252 1667.824 1667.824 1679.071 1679.071 1690.318 + 1690.318 1697.720 1660.779 1664.065 1664.065 1664.710 + 1664.710 1664.855 1664.855 1665.056 1665.056 1660.361 + 1660.361 1661.424 1661.424 1658.914 1658.914 1661.536 + 1699.066 1701.787 1701.787 1702.859 1702.859 1702.973 + 1702.973 1703.734 1703.734 1706.242 1706.242 1714.273 + 1714.273 1730.829 1730.829 1739.602 1739.602 1742.466 + + 1672.252 1667.824 1667.824 1679.071 1679.071 1690.318 + 1690.318 1697.720 1660.779 1664.065 1664.065 1664.710 + 1664.710 1664.855 1664.855 1665.056 1665.056 1660.361 + 1660.361 1661.424 1661.424 1658.914 1658.914 1661.536 + 1699.066 1701.787 1701.787 1702.859 1702.859 1702.973 + 1702.973 1703.734 1703.734 1706.242 1706.242 1714.273 + 1714.273 1730.829 1730.829 1739.602 1739.602 1742.466 + + 1670.187 1664.132 1664.132 1674.528 1674.528 1685.612 + 1685.612 1693.100 1651.703 1652.935 1652.935 1649.501 + 1649.501 1651.972 1651.972 1651.421 1651.421 1648.920 + 1648.920 1649.342 1649.342 1647.408 1647.408 1651.121 + 1694.583 1697.473 1697.473 1699.426 1699.426 1701.541 + 1701.541 1703.599 1703.599 1702.881 1702.881 1712.664 + 1712.664 1726.038 1726.038 1737.261 1737.261 1740.295 + + 1670.187 1664.132 1664.132 1674.528 1674.528 1685.612 + 1685.612 1693.100 1651.703 1652.935 1652.935 1649.501 + 1649.501 1651.972 1651.972 1651.421 1651.421 1648.920 + 1648.920 1649.342 1649.342 1647.408 1647.408 1651.121 + 1694.583 1697.473 1697.473 1699.426 1699.426 1701.541 + 1701.541 1703.599 1703.599 1702.881 1702.881 1712.664 + 1712.664 1726.038 1726.038 1737.261 1737.261 1740.295 + + 1670.288 1664.758 1664.758 1671.690 1671.690 1681.381 + 1681.381 1689.311 1644.195 1643.438 1643.438 1640.570 + 1640.570 1641.149 1641.149 1641.565 1641.565 1642.812 + 1642.812 1643.080 1643.080 1642.168 1642.168 1644.829 + 1692.201 1694.995 1694.995 1697.798 1697.798 1700.489 + 1700.489 1704.086 1704.086 1703.803 1703.803 1716.325 + 1716.325 1727.933 1727.933 1738.114 1738.114 1740.979 + + 1670.288 1664.758 1664.758 1671.690 1671.690 1681.381 + 1681.381 1689.311 1644.195 1643.438 1643.438 1640.570 + 1640.570 1641.149 1641.149 1641.565 1641.565 1642.812 + 1642.812 1643.080 1643.080 1642.168 1642.168 1644.829 + 1644.829 1649.928 1694.995 1697.798 1697.798 1700.489 + 1700.489 1704.086 1704.086 1703.803 1703.803 1716.325 + 1716.325 1727.933 1727.933 1738.114 1738.114 1740.979 + + 1672.584 1666.863 1666.863 1670.425 1670.425 1677.467 + 1677.467 1685.256 1639.536 1639.696 1639.696 1634.663 + 1634.663 1633.383 1633.383 1637.494 1637.494 1640.025 + 1640.025 1640.202 1640.202 1638.493 1638.493 1640.185 + 1640.185 1644.763 1694.538 1697.865 1697.865 1702.665 + 1702.665 1708.768 1708.768 1709.871 1709.871 1721.919 + 1721.919 1731.575 1731.575 1740.556 1740.556 1743.232 + + 1672.584 1666.863 1666.863 1670.425 1670.425 1677.467 + 1677.467 1685.256 1639.536 1639.696 1639.696 1634.663 + 1634.663 1633.383 1633.383 1637.494 1637.494 1640.025 + 1640.025 1640.202 1640.202 1638.493 1638.493 1640.185 + 1640.185 1644.763 1694.538 1697.865 1697.865 1702.665 + 1702.665 1708.768 1708.768 1709.871 1709.871 1721.919 + 1721.919 1731.575 1731.575 1740.556 1740.556 1743.232 + + 1676.262 1669.484 1669.484 1668.149 1668.149 1673.444 + 1673.444 1681.232 1634.859 1635.607 1635.607 1628.960 + 1628.960 1628.664 1628.664 1633.390 1633.390 1636.520 + 1636.520 1636.747 1636.747 1634.858 1634.858 1636.785 + 1636.785 1641.600 1696.118 1699.357 1699.357 1707.674 + 1707.674 1713.375 1713.375 1717.075 1717.075 1728.144 + 1728.144 1737.222 1737.222 1744.496 1744.496 1746.788 + + 1676.262 1669.484 1669.484 1668.149 1668.149 1673.444 + 1673.444 1681.232 1634.859 1635.607 1635.607 1628.960 + 1628.960 1628.664 1628.664 1633.390 1633.390 1636.520 + 1636.520 1636.747 1636.747 1634.858 1634.858 1636.785 + 1636.785 1641.600 1696.118 1699.357 1699.357 1707.674 + 1707.674 1713.375 1713.375 1717.075 1717.075 1728.144 + 1728.144 1737.222 1737.222 1744.496 1744.496 1746.788 + + 1680.412 1675.761 1675.761 1668.350 1668.350 1672.286 + 1672.286 1677.738 1627.515 1628.287 1628.287 1624.069 + 1624.069 1623.581 1623.581 1628.450 1628.450 1632.727 + 1632.727 1633.224 1633.224 1632.592 1632.592 1636.149 + 1636.149 1641.645 1701.263 1705.415 1705.415 1716.153 + 1716.153 1719.584 1719.584 1725.255 1725.255 1736.408 + 1736.408 1742.976 1742.976 1749.150 1749.150 1751.631 + + 1680.412 1675.761 1675.761 1668.350 1668.350 1672.286 + 1672.286 1677.738 1675.686 1683.030 1628.287 1624.069 + 1624.069 1623.581 1623.581 1628.450 1628.450 1632.727 + 1632.727 1633.224 1633.224 1632.592 1632.592 1636.149 + 1636.149 1641.645 1701.263 1705.415 1705.415 1716.153 + 1716.153 1719.584 1719.584 1725.255 1725.255 1736.408 + 1736.408 1742.976 1742.976 1749.150 1749.150 1751.631 + + 1685.135 1683.224 1683.224 1675.462 1675.462 1674.671 + 1674.671 1677.387 1667.272 1670.099 1617.783 1616.625 + 1616.625 1618.401 1618.401 1622.718 1622.718 1628.764 + 1628.764 1630.594 1630.594 1634.397 1634.397 1639.368 + 1639.368 1644.736 1708.362 1713.907 1713.907 1725.781 + 1725.781 1729.513 1729.513 1732.701 1732.701 1742.634 + 1742.634 1750.060 1750.060 1756.477 1756.477 1758.687 + + 1685.135 1683.224 1683.224 1675.462 1675.462 1674.671 + 1674.671 1677.387 1667.272 1670.099 1617.783 1616.625 + 1616.625 1618.401 1618.401 1622.718 1622.718 1628.764 + 1628.764 1630.594 1630.594 1634.397 1634.397 1639.368 + 1639.368 1644.736 1708.362 1713.907 1713.907 1725.781 + 1725.781 1729.513 1729.513 1732.701 1732.701 1742.634 + 1742.634 1750.060 1750.060 1756.477 1756.477 1758.687 + + 1689.931 1689.348 1689.348 1685.776 1685.776 1681.931 + 1681.931 1680.987 1659.096 1657.984 1607.618 1607.962 + 1607.962 1611.749 1611.749 1617.219 1617.219 1626.322 + 1626.322 1630.215 1630.215 1638.705 1638.705 1643.063 + 1643.063 1648.907 1715.582 1722.879 1722.879 1733.121 + 1733.121 1736.164 1736.164 1738.981 1738.981 1748.325 + 1748.325 1757.223 1757.223 1765.742 1765.742 1767.589 + + 1689.931 1689.348 1689.348 1685.776 1685.776 1681.931 + 1681.931 1680.987 1659.096 1657.984 1657.984 1658.771 + 1607.962 1611.749 1611.749 1617.219 1617.219 1626.322 + 1626.322 1630.215 1630.215 1638.705 1638.705 1643.063 + 1643.063 1648.907 1715.582 1722.879 1722.879 1733.121 + 1733.121 1736.164 1736.164 1738.981 1738.981 1748.325 + 1748.325 1757.223 1757.223 1765.742 1765.742 1767.589 + + 1695.900 1695.442 1695.442 1693.651 1693.651 1691.262 + 1691.262 1687.787 1651.146 1648.306 1648.306 1646.719 + 1598.572 1602.100 1602.100 1614.453 1614.453 1625.689 + 1625.689 1634.618 1634.618 1644.456 1644.456 1646.780 + 1646.780 1652.596 1720.002 1728.531 1728.531 1736.086 + 1736.086 1740.136 1740.136 1744.418 1744.418 1755.207 + 1755.207 1772.300 1772.300 1778.263 1778.263 1778.629 + + 1695.900 1695.442 1695.442 1693.651 1693.651 1691.262 + 1691.262 1687.787 1651.146 1648.306 1648.306 1646.719 + 1598.572 1602.100 1602.100 1614.453 1614.453 1625.689 + 1625.689 1634.618 1634.618 1644.456 1644.456 1646.780 + 1646.780 1652.596 1720.002 1728.531 1728.531 1736.086 + 1736.086 1740.136 1740.136 1744.418 1744.418 1755.207 + 1755.207 1772.300 1772.300 1778.263 1778.263 1778.629 + + 1698.677 1698.205 1698.205 1698.712 1698.712 1698.385 + 1698.385 1694.503 1644.780 1641.866 1641.866 1639.128 + 1592.681 1594.605 1594.605 1608.204 1608.204 1626.996 + 1626.996 1640.222 1640.222 1646.820 1646.820 1649.790 + 1649.790 1655.084 1719.562 1726.757 1726.757 1735.341 + 1735.341 1741.235 1741.235 1746.231 1746.231 1765.572 + 1765.572 1786.370 1786.370 1786.100 1786.100 1785.653 + + 1698.677 1698.205 1698.205 1698.712 1698.712 1698.385 + 1698.385 1694.503 1644.780 1641.866 1641.866 1639.128 + 1639.128 1639.783 1594.605 1608.204 1608.204 1626.996 + 1626.996 1640.222 1640.222 1646.820 1646.820 1649.790 + 1649.790 1655.084 1655.084 1660.679 1726.757 1735.341 + 1735.341 1741.235 1741.235 1746.231 1746.231 1765.572 + 1765.572 1786.370 1786.370 1786.100 1786.100 1785.653 + + 1702.796 1700.840 1700.840 1702.362 1702.362 1702.258 + 1702.258 1698.528 1641.853 1640.348 1640.348 1637.508 + 1637.508 1634.832 1590.638 1602.091 1602.091 1628.097 + 1628.097 1640.005 1640.005 1646.400 1646.400 1651.219 + 1651.219 1656.995 1656.995 1663.103 1721.472 1730.829 + 1730.829 1740.215 1740.215 1746.539 1746.539 1768.551 + 1768.551 1784.292 1784.292 1784.841 1784.841 1784.681 + + 1702.796 1700.840 1700.840 1702.362 1702.362 1702.258 + 1702.258 1698.528 1641.853 1640.348 1640.348 1637.508 + 1637.508 1634.832 1590.638 1602.091 1602.091 1628.097 + 1628.097 1640.005 1640.005 1646.400 1646.400 1651.219 + 1651.219 1656.995 1656.995 1663.103 1721.472 1730.829 + 1730.829 1740.215 1740.215 1746.539 1746.539 1768.551 + 1768.551 1784.292 1784.292 1784.841 1784.841 1784.681 + + 1705.418 1701.131 1701.131 1701.139 1701.139 1701.977 + 1701.977 1699.834 1642.327 1642.439 1642.439 1641.224 + 1641.224 1634.581 1587.691 1593.633 1593.633 1612.016 + 1612.016 1630.660 1630.660 1643.818 1643.818 1651.776 + 1651.776 1657.861 1657.861 1664.671 1715.389 1723.403 + 1723.403 1737.834 1737.834 1749.577 1749.577 1764.907 + 1764.907 1773.645 1773.645 1777.810 1777.810 1778.298 + + 1705.418 1701.131 1701.131 1701.139 1701.139 1701.977 + 1701.977 1699.834 1642.327 1642.439 1642.439 1641.224 + 1641.224 1634.581 1634.581 1639.950 1593.633 1612.016 + 1612.016 1630.660 1630.660 1643.818 1643.818 1651.776 + 1651.776 1657.861 1657.861 1664.671 1715.389 1723.403 + 1723.403 1737.834 1737.834 1749.577 1749.577 1764.907 + 1764.907 1773.645 1773.645 1777.810 1777.810 1778.298 + + 1705.046 1698.925 1698.925 1700.360 1700.360 1701.489 + 1701.489 1699.801 1645.081 1647.146 1647.146 1649.537 + 1649.537 1642.004 1642.004 1641.747 1590.779 1603.172 + 1603.172 1621.265 1621.265 1638.101 1638.101 1652.191 + 1652.191 1658.575 1658.575 1665.299 1711.586 1719.927 + 1719.927 1736.861 1736.861 1745.291 1745.291 1755.782 + 1755.782 1764.359 1764.359 1769.442 1769.442 1770.308 + + 1705.046 1698.925 1698.925 1700.360 1700.360 1701.489 + 1701.489 1699.801 1645.081 1647.146 1647.146 1649.537 + 1649.537 1642.004 1642.004 1641.747 1590.779 1603.172 + 1603.172 1621.265 1621.265 1638.101 1638.101 1652.191 + 1652.191 1658.575 1658.575 1665.299 1711.586 1719.927 + 1719.927 1736.861 1736.861 1745.291 1745.291 1755.782 + 1755.782 1764.359 1764.359 1769.442 1769.442 1770.308 + + 1701.575 1696.446 1696.446 1700.163 1700.163 1700.071 + 1700.071 1698.265 1649.048 1653.815 1653.815 1661.196 + 1661.196 1656.073 1656.073 1643.726 1594.050 1603.270 + 1603.270 1616.415 1616.415 1633.252 1633.252 1651.405 + 1651.405 1659.210 1659.210 1665.191 1710.274 1717.209 + 1717.209 1731.585 1731.585 1737.342 1737.342 1746.645 + 1746.645 1755.435 1755.435 1760.739 1760.739 1761.683 + + 1701.575 1696.446 1696.446 1700.163 1700.163 1700.071 + 1700.071 1698.265 1698.265 1697.624 1653.815 1661.196 + 1661.196 1656.073 1656.073 1643.726 1594.050 1603.270 + 1603.270 1616.415 1616.415 1633.252 1633.252 1651.405 + 1651.405 1659.210 1659.210 1665.191 1710.274 1717.209 + 1717.209 1731.585 1731.585 1737.342 1737.342 1746.645 + 1746.645 1755.435 1755.435 1760.739 1760.739 1761.683 + + 1701.757 1696.753 1696.753 1700.425 1700.425 1699.547 + 1699.547 1697.890 1697.890 1699.240 1657.888 1664.655 + 1664.655 1665.676 1665.676 1652.956 1598.881 1606.997 + 1606.997 1615.135 1615.135 1628.340 1628.340 1649.172 + 1649.172 1660.914 1660.914 1662.974 1709.459 1715.798 + 1715.798 1724.554 1724.554 1733.106 1733.106 1740.164 + 1740.164 1746.489 1746.489 1750.971 1750.971 1751.801 + + 1701.757 1696.753 1696.753 1700.425 1700.425 1699.547 + 1699.547 1697.890 1697.890 1699.240 1699.240 1698.425 + 1664.655 1665.676 1665.676 1652.956 1652.956 1657.545 + 1606.997 1615.135 1615.135 1628.340 1628.340 1649.172 + 1649.172 1660.914 1660.914 1662.974 1662.974 1668.802 + 1715.798 1724.554 1724.554 1733.106 1733.106 1740.164 + 1740.164 1746.489 1746.489 1750.971 1750.971 1751.801 + + 1702.975 1698.504 1698.504 1699.707 1699.707 1699.251 + 1699.251 1698.726 1698.726 1699.779 1699.779 1699.099 + 1662.615 1662.498 1662.498 1659.182 1659.182 1661.135 + 1607.075 1612.303 1612.303 1621.961 1621.961 1644.392 + 1644.392 1657.844 1657.844 1660.680 1660.680 1664.698 + 1712.763 1720.071 1720.071 1726.745 1726.745 1731.925 + 1731.925 1736.220 1736.220 1740.614 1740.614 1741.866 + + 1713.655 1707.769 1698.504 1699.707 1699.707 1699.251 + 1699.251 1698.726 1698.726 1699.779 1699.779 1699.099 + 1699.099 1697.153 1662.498 1659.182 1659.182 1661.135 + 1607.075 1612.303 1612.303 1621.961 1621.961 1644.392 + 1644.392 1657.844 1657.844 1660.680 1660.680 1664.698 + 1664.698 1673.271 1720.071 1726.745 1726.745 1731.925 + 1731.925 1736.220 1736.220 1740.614 1740.614 1741.866 + + 1717.219 1709.162 1698.851 1698.135 1698.135 1697.494 + 1697.494 1697.977 1697.977 1699.020 1699.020 1699.568 + 1699.568 1698.195 1660.832 1660.940 1660.940 1663.219 + 1605.991 1609.399 1609.399 1615.200 1615.200 1634.572 + 1634.572 1648.636 1648.636 1656.084 1656.084 1661.137 + 1661.137 1670.244 1710.094 1714.530 1714.530 1719.204 + 1719.204 1723.814 1723.814 1731.948 1731.948 1734.778 + + 1717.219 1709.162 1709.162 1705.497 1698.135 1697.494 + 1697.494 1697.977 1697.977 1699.020 1699.020 1699.568 + 1699.568 1698.195 1698.195 1692.624 1660.940 1663.219 + 1663.219 1669.141 1609.399 1615.200 1615.200 1634.572 + 1634.572 1648.636 1648.636 1656.084 1656.084 1661.137 + 1661.137 1670.244 1670.244 1683.446 1714.530 1719.204 + 1719.204 1723.814 1723.814 1731.948 1731.948 1734.778 + + 1721.234 1711.465 1711.465 1707.672 1697.125 1696.604 + 1696.604 1697.851 1697.851 1698.888 1698.888 1698.985 + 1698.985 1697.316 1697.316 1691.371 1661.870 1664.488 + 1664.488 1669.514 1611.342 1619.285 1619.285 1631.922 + 1631.922 1641.816 1641.816 1647.865 1647.865 1657.423 + 1657.423 1667.147 1667.147 1681.918 1695.688 1704.223 + 1704.223 1716.011 1716.011 1726.964 1726.964 1730.321 + + 1721.234 1711.465 1711.465 1707.672 1707.672 1704.463 + 1696.604 1697.851 1697.851 1698.888 1698.888 1698.985 + 1698.985 1697.316 1697.316 1691.371 1691.371 1683.956 + 1683.956 1679.147 1679.147 1678.319 1619.285 1631.922 + 1631.922 1641.816 1641.816 1647.865 1647.865 1657.423 + 1657.423 1667.147 1667.147 1681.918 1695.688 1704.223 + 1704.223 1716.011 1716.011 1726.964 1726.964 1730.321 + + 1725.972 1716.231 1716.231 1710.395 1710.395 1706.544 + 1694.017 1693.762 1693.762 1696.136 1696.136 1697.712 + 1697.712 1694.564 1694.564 1687.392 1687.392 1680.844 + 1680.844 1677.966 1677.966 1675.826 1624.878 1633.015 + 1633.015 1639.587 1639.587 1645.544 1645.544 1652.709 + 1652.709 1663.164 1663.164 1677.598 1677.598 1692.922 + 1692.922 1709.529 1709.529 1722.462 1722.462 1726.464 + + 1725.972 1716.231 1716.231 1710.395 1710.395 1706.544 + 1706.544 1704.436 1693.762 1696.136 1696.136 1697.712 + 1697.712 1694.564 1694.564 1687.392 1687.392 1680.844 + 1680.844 1677.966 1677.966 1675.826 1675.826 1678.118 + 1633.015 1639.587 1639.587 1645.544 1645.544 1652.709 + 1652.709 1663.164 1663.164 1677.598 1677.598 1692.922 + 1692.922 1709.529 1709.529 1722.462 1722.462 1726.464 + + 1729.168 1719.762 1719.762 1713.199 1713.199 1708.976 + 1708.976 1707.153 1690.563 1691.830 1691.830 1692.349 + 1692.349 1687.129 1687.129 1678.320 1678.320 1676.194 + 1676.194 1676.760 1676.760 1675.823 1675.823 1675.472 + 1636.535 1641.948 1641.948 1648.457 1648.457 1653.784 + 1653.784 1664.407 1664.407 1676.652 1676.652 1689.313 + 1689.313 1706.751 1706.751 1720.234 1720.234 1724.523 + + 1729.168 1719.762 1719.762 1713.199 1713.199 1708.976 + 1708.976 1707.153 1690.563 1691.830 1691.830 1692.349 + 1692.349 1687.129 1687.129 1678.320 1678.320 1676.194 + 1676.194 1676.760 1676.760 1675.823 1675.823 1675.472 + 1675.472 1680.186 1641.948 1648.457 1648.457 1653.784 + 1653.784 1664.407 1664.407 1676.652 1676.652 1689.313 + 1689.313 1706.751 1706.751 1720.234 1720.234 1724.523 + + 1732.468 1724.146 1724.146 1716.962 1716.962 1711.260 + 1711.260 1711.790 1688.235 1687.071 1687.071 1684.279 + 1684.279 1676.719 1676.719 1668.366 1668.366 1670.720 + 1670.720 1674.278 1674.278 1675.411 1675.411 1676.207 + 1676.207 1680.198 1647.323 1652.399 1652.399 1659.150 + 1659.150 1671.521 1671.521 1684.162 1684.162 1693.316 + 1693.316 1708.326 1708.326 1721.092 1721.092 1725.277 + + 1667.850 1673.388 1673.388 1687.525 1687.525 1700.764 + 1700.764 1709.990 1680.149 1682.560 1682.560 1689.930 + 1689.930 1693.544 1693.544 1690.494 1690.494 1687.896 + 1687.896 1689.422 1689.422 1691.749 1719.726 1726.549 + 1726.549 1726.243 1726.243 1729.303 1729.303 1729.559 + 1729.559 1727.953 1727.953 1735.054 1735.054 1745.805 + 1745.805 1755.817 1755.817 1765.176 1765.176 1768.202 + + 1670.031 1676.111 1676.111 1687.281 1687.281 1698.754 + 1698.754 1707.144 1675.607 1678.211 1678.211 1685.938 + 1685.938 1689.444 1689.444 1689.143 1689.143 1687.063 + 1687.063 1684.915 1684.915 1684.480 1711.125 1716.853 + 1716.853 1718.847 1718.847 1719.161 1719.161 1718.284 + 1718.284 1715.806 1715.806 1722.728 1722.728 1734.543 + 1734.543 1744.699 1744.699 1753.769 1753.769 1756.851 + 1670.031 1676.111 1676.111 1687.281 1687.281 1698.754 + 1698.754 1707.144 1675.607 1678.211 1678.211 1685.938 + 1685.938 1689.444 1689.444 1689.143 1689.143 1687.063 + 1687.063 1684.915 1684.915 1684.480 1684.480 1685.812 + 1716.853 1718.847 1718.847 1719.161 1719.161 1718.284 + 1718.284 1715.806 1715.806 1722.728 1722.728 1734.543 + 1734.543 1744.699 1744.699 1753.769 1753.769 1756.851 + + 1672.588 1674.362 1674.362 1684.927 1684.927 1696.686 + 1696.686 1704.055 1670.319 1673.535 1673.535 1678.062 + 1678.062 1680.824 1680.824 1682.531 1682.531 1677.560 + 1677.560 1676.151 1676.151 1674.924 1674.924 1675.664 + 1708.495 1710.617 1710.617 1711.857 1711.857 1710.024 + 1710.024 1708.846 1708.846 1713.403 1713.403 1725.920 + 1725.920 1738.258 1738.258 1746.465 1746.465 1749.294 + 1672.588 1674.362 1674.362 1684.927 1684.927 1696.686 + 1696.686 1704.055 1670.319 1673.535 1673.535 1678.062 + 1678.062 1680.824 1680.824 1682.531 1682.531 1677.560 + 1677.560 1676.151 1676.151 1674.924 1674.924 1675.664 + 1708.495 1710.617 1710.617 1711.857 1711.857 1710.024 + 1710.024 1708.846 1708.846 1713.403 1713.403 1725.920 + 1725.920 1738.258 1738.258 1746.465 1746.465 1749.294 + + 1674.080 1669.830 1669.830 1681.162 1681.162 1692.225 + 1692.225 1698.825 1662.984 1666.221 1666.221 1666.751 + 1666.751 1666.966 1666.966 1667.104 1667.104 1662.466 + 1662.466 1663.560 1663.560 1661.098 1661.098 1663.789 + 1701.972 1704.125 1704.125 1705.124 1705.124 1705.217 + 1705.217 1706.025 1706.025 1708.716 1708.716 1716.846 + 1716.846 1732.937 1732.937 1741.448 1741.448 1744.162 + 1674.080 1669.830 1669.830 1681.162 1681.162 1692.225 + 1692.225 1698.825 1662.984 1666.221 1666.221 1666.751 + 1666.751 1666.966 1666.966 1667.104 1667.104 1662.466 + 1662.466 1663.560 1663.560 1661.098 1661.098 1663.789 + 1701.972 1704.125 1704.125 1705.124 1705.124 1705.217 + 1705.217 1706.025 1706.025 1708.716 1708.716 1716.846 + 1716.846 1732.937 1732.937 1741.448 1741.448 1744.162 + + 1671.977 1666.082 1666.082 1676.571 1676.571 1687.560 + 1687.560 1694.266 1653.710 1654.988 1654.988 1651.556 + 1651.556 1654.157 1654.157 1653.491 1653.491 1651.055 + 1651.055 1651.453 1651.453 1649.558 1649.558 1653.377 + 1697.462 1699.854 1699.854 1701.647 1701.647 1703.877 + 1703.877 1705.813 1705.813 1705.318 1705.318 1715.133 + 1715.133 1727.741 1727.741 1738.778 1738.778 1741.735 + 1671.977 1666.082 1666.082 1676.571 1676.571 1687.560 + 1687.560 1694.266 1653.710 1654.988 1654.988 1651.556 + 1651.556 1654.157 1654.157 1653.491 1653.491 1651.055 + 1651.055 1651.453 1651.453 1649.558 1649.558 1653.377 + 1697.462 1699.854 1699.854 1701.647 1701.647 1703.877 + 1703.877 1705.813 1705.813 1705.318 1705.318 1715.133 + 1715.133 1727.741 1727.741 1738.778 1738.778 1741.735 + + 1672.239 1666.738 1666.738 1673.701 1673.701 1683.386 + 1683.386 1690.984 1646.191 1645.484 1645.484 1642.610 + 1642.610 1643.336 1643.336 1643.700 1643.700 1644.982 + 1644.982 1645.206 1645.206 1644.331 1644.331 1647.070 + 1694.973 1697.366 1697.366 1699.993 1699.993 1702.802 + 1702.802 1706.382 1706.382 1706.206 1706.206 1718.904 + 1718.904 1729.777 1729.777 1739.632 1739.632 1742.418 + 1672.239 1666.738 1666.738 1673.701 1673.701 1683.386 + 1683.386 1690.984 1646.191 1645.484 1645.484 1642.610 + 1642.610 1643.336 1643.336 1643.700 1643.700 1644.982 + 1644.982 1645.206 1645.206 1644.331 1644.331 1647.070 + 1647.070 1652.208 1697.366 1699.993 1699.993 1702.802 + 1702.802 1706.382 1706.382 1706.206 1706.206 1718.904 + 1718.904 1729.777 1729.777 1739.632 1739.632 1742.418 + + 1674.622 1668.852 1668.852 1672.376 1672.376 1679.411 + 1679.411 1687.034 1641.789 1641.925 1641.925 1636.672 + 1636.672 1635.630 1635.630 1639.686 1639.686 1642.233 + 1642.233 1642.321 1642.321 1640.658 1640.658 1642.415 + 1642.415 1647.043 1696.818 1700.038 1700.038 1705.060 + 1705.060 1711.075 1711.075 1712.219 1712.219 1724.489 + 1724.489 1733.681 1733.681 1742.281 1742.281 1744.808 + 1674.622 1668.852 1668.852 1672.376 1672.376 1679.411 + 1679.411 1687.034 1641.789 1641.925 1641.925 1636.672 + 1636.672 1635.630 1635.630 1639.686 1639.686 1642.233 + 1642.233 1642.321 1642.321 1640.658 1640.658 1642.415 + 1642.415 1647.043 1696.818 1700.038 1700.038 1705.060 + 1705.060 1711.075 1711.075 1712.219 1712.219 1724.489 + 1724.489 1733.681 1733.681 1742.281 1742.281 1744.808 + + 1678.319 1671.638 1671.638 1670.051 1670.051 1675.269 + 1675.269 1683.096 1637.125 1637.830 1637.830 1630.960 + 1630.960 1630.946 1630.946 1635.661 1635.661 1638.759 + 1638.759 1638.854 1638.854 1636.974 1636.974 1639.032 + 1639.032 1643.884 1698.361 1701.633 1701.633 1710.064 + 1710.064 1715.758 1715.758 1719.507 1719.507 1730.786 + 1730.786 1739.544 1739.544 1746.272 1746.272 1748.390 + 1678.319 1671.638 1671.638 1670.051 1670.051 1675.269 + 1675.269 1683.096 1637.125 1637.830 1637.830 1630.960 + 1630.960 1630.946 1630.946 1635.661 1635.661 1638.759 + 1638.759 1638.854 1638.854 1636.974 1636.974 1639.032 + 1639.032 1643.884 1698.361 1701.633 1701.633 1710.064 + 1710.064 1715.758 1715.758 1719.507 1719.507 1730.786 + 1730.786 1739.544 1739.544 1746.272 1746.272 1748.390 + + 1682.446 1678.208 1678.208 1670.413 1670.413 1674.026 + 1674.026 1679.614 1629.733 1630.583 1630.583 1626.151 + 1626.151 1625.832 1625.832 1630.795 1630.795 1635.011 + 1635.011 1635.620 1635.620 1634.873 1634.873 1638.392 + 1638.392 1643.918 1703.650 1707.921 1707.921 1718.589 + 1718.589 1721.992 1721.992 1727.656 1727.656 1739.027 + 1739.027 1745.195 1745.195 1750.850 1750.850 1753.270 + 1682.446 1678.208 1678.208 1670.413 1670.413 1674.026 + 1674.026 1679.614 1677.608 1684.499 1630.583 1626.151 + 1626.151 1625.832 1625.832 1630.795 1630.795 1635.011 + 1635.011 1635.620 1635.620 1634.873 1634.873 1638.392 + 1638.392 1643.918 1703.650 1707.921 1707.921 1718.589 + 1718.589 1721.992 1721.992 1727.656 1727.656 1739.027 + 1739.027 1745.195 1745.195 1750.850 1750.850 1753.270 + + 1686.964 1685.502 1685.502 1677.894 1677.894 1676.557 + 1676.557 1679.238 1669.137 1671.771 1619.985 1618.736 + 1618.736 1620.684 1620.684 1625.110 1625.110 1631.028 + 1631.028 1632.877 1632.877 1636.686 1636.686 1641.620 + 1641.620 1646.998 1711.200 1717.410 1717.410 1728.166 + 1728.166 1731.889 1731.889 1735.058 1735.058 1745.195 + 1745.195 1752.647 1752.647 1758.724 1758.724 1760.733 + 1686.964 1685.502 1685.502 1677.894 1677.894 1676.557 + 1676.557 1679.238 1669.137 1671.771 1619.985 1618.736 + 1618.736 1620.684 1620.684 1625.110 1625.110 1631.028 + 1631.028 1632.877 1632.877 1636.686 1636.686 1641.620 + 1641.620 1646.998 1711.200 1717.410 1717.410 1728.166 + 1728.166 1731.889 1731.889 1735.058 1735.058 1745.195 + 1745.195 1752.647 1752.647 1758.724 1758.724 1760.733 + + 1691.656 1691.448 1691.448 1687.965 1687.965 1683.964 + 1683.964 1682.894 1661.072 1659.981 1609.761 1610.141 + 1610.141 1614.036 1614.036 1619.527 1619.527 1628.560 + 1628.560 1632.551 1632.551 1640.947 1640.947 1645.388 + 1645.388 1651.182 1718.050 1725.665 1725.665 1735.547 + 1735.547 1738.530 1738.530 1741.374 1741.374 1750.728 + 1750.728 1758.795 1758.795 1767.872 1767.872 1769.574 + 1691.656 1691.448 1691.448 1687.965 1687.965 1683.964 + 1683.964 1682.894 1661.072 1659.981 1659.981 1660.749 + 1610.141 1614.036 1614.036 1619.527 1619.527 1628.560 + 1628.560 1632.551 1632.551 1640.947 1640.947 1645.388 + 1645.388 1651.182 1718.050 1725.665 1725.665 1735.547 + 1735.547 1738.530 1738.530 1741.374 1741.374 1750.728 + 1750.728 1758.795 1758.795 1767.872 1767.872 1769.574 + + 1697.665 1697.516 1697.516 1695.669 1695.669 1693.384 + 1693.384 1689.868 1653.394 1650.855 1650.855 1649.365 + 1600.697 1604.406 1604.406 1616.821 1616.821 1628.012 + 1628.012 1637.071 1637.071 1646.611 1646.611 1649.114 + 1649.114 1654.888 1722.074 1730.867 1730.867 1738.551 + 1738.551 1742.511 1742.511 1746.885 1746.885 1757.856 + 1757.856 1773.464 1773.464 1779.759 1779.759 1780.200 + 1697.665 1697.516 1697.516 1695.669 1695.669 1693.384 + 1693.384 1689.868 1653.394 1650.855 1650.855 1649.365 + 1600.697 1604.406 1604.406 1616.821 1616.821 1628.012 + 1628.012 1637.071 1637.071 1646.611 1646.611 1649.114 + 1649.114 1654.888 1722.074 1730.867 1730.867 1738.551 + 1738.551 1742.511 1742.511 1746.885 1746.885 1757.856 + 1757.856 1773.464 1773.464 1779.759 1779.759 1780.200 + + 1700.485 1700.248 1700.248 1700.557 1700.557 1700.535 + 1700.535 1696.735 1647.233 1644.931 1644.931 1642.272 + 1594.777 1596.761 1596.761 1610.551 1610.551 1629.359 + 1629.359 1642.622 1642.622 1649.051 1649.051 1652.094 + 1652.094 1657.382 1721.477 1729.020 1729.020 1737.823 + 1737.823 1743.657 1743.657 1748.738 1748.738 1768.559 + 1768.559 1788.399 1788.399 1787.617 1787.617 1787.169 + 1700.485 1700.248 1700.248 1700.557 1700.557 1700.535 + 1700.535 1696.735 1647.233 1644.931 1644.931 1642.272 + 1642.272 1642.583 1596.761 1610.551 1610.551 1629.359 + 1629.359 1642.622 1642.622 1649.051 1649.051 1652.094 + 1652.094 1657.382 1657.382 1663.002 1729.020 1737.823 + 1737.823 1743.657 1743.657 1748.738 1748.738 1768.559 + 1768.559 1788.399 1788.399 1787.617 1787.617 1787.169 + + 1704.731 1702.872 1702.872 1704.210 1704.210 1704.395 + 1704.395 1700.819 1644.104 1643.010 1643.010 1640.108 + 1640.108 1637.216 1592.776 1604.435 1604.435 1630.586 + 1630.586 1642.415 1642.415 1648.716 1648.716 1653.547 + 1653.547 1659.312 1659.312 1665.434 1723.714 1733.342 + 1733.342 1742.664 1742.664 1749.096 1749.096 1770.177 + 1770.177 1785.839 1785.839 1786.349 1786.349 1786.193 + 1704.731 1702.872 1702.872 1704.210 1704.210 1704.395 + 1704.395 1700.819 1644.104 1643.010 1643.010 1640.108 + 1640.108 1637.216 1592.776 1604.435 1604.435 1630.586 + 1630.586 1642.415 1642.415 1648.716 1648.716 1653.547 + 1653.547 1659.312 1659.312 1665.434 1723.714 1733.342 + 1733.342 1742.664 1742.664 1749.096 1749.096 1770.177 + 1770.177 1785.839 1785.839 1786.349 1786.349 1786.193 + + 1707.524 1703.283 1703.283 1703.032 1703.032 1704.055 + 1704.055 1702.097 1644.151 1644.395 1644.395 1643.398 + 1643.398 1636.848 1589.829 1595.897 1595.897 1614.480 + 1614.480 1633.227 1633.227 1646.277 1646.277 1654.148 + 1654.148 1660.200 1660.200 1667.026 1717.931 1725.906 + 1725.906 1740.420 1740.420 1752.103 1752.103 1766.739 + 1766.739 1775.062 1775.062 1779.267 1779.267 1779.755 + 1707.524 1703.283 1703.283 1703.032 1703.032 1704.055 + 1704.055 1702.097 1644.151 1644.395 1644.395 1643.398 + 1643.398 1636.848 1636.848 1642.829 1595.897 1614.480 + 1614.480 1633.227 1633.227 1646.277 1646.277 1654.148 + 1654.148 1660.200 1660.200 1667.026 1717.931 1725.906 + 1725.906 1740.420 1740.420 1752.103 1752.103 1766.739 + 1766.739 1775.062 1775.062 1779.267 1779.267 1779.755 + + 1707.225 1701.031 1701.031 1702.245 1702.245 1703.551 + 1703.551 1702.020 1646.744 1648.998 1648.998 1651.680 + 1651.680 1644.217 1644.217 1644.270 1592.973 1605.541 + 1605.541 1623.730 1623.730 1640.703 1640.703 1654.659 + 1654.659 1660.942 1660.942 1667.692 1714.636 1722.896 + 1722.896 1739.469 1739.469 1747.290 1747.290 1757.481 + 1757.481 1765.879 1765.879 1770.930 1770.930 1771.771 + 1707.225 1701.031 1701.031 1702.245 1702.245 1703.551 + 1703.551 1702.020 1646.744 1648.998 1648.998 1651.680 + 1651.680 1644.217 1644.217 1644.270 1592.973 1605.541 + 1605.541 1623.730 1623.730 1640.703 1640.703 1654.659 + 1654.659 1660.942 1660.942 1667.692 1714.636 1722.896 + 1722.896 1739.469 1739.469 1747.290 1747.290 1757.481 + 1757.481 1765.879 1765.879 1770.930 1770.930 1771.771 + + 1703.814 1698.462 1698.462 1702.065 1702.065 1702.200 + 1702.200 1700.444 1650.755 1655.802 1655.802 1663.567 + 1663.567 1658.555 1658.555 1646.100 1596.267 1605.622 + 1605.622 1618.750 1618.750 1635.937 1635.937 1653.934 + 1653.934 1661.611 1661.611 1667.610 1713.008 1720.065 + 1720.065 1734.071 1734.071 1739.040 1739.040 1748.260 + 1748.260 1757.027 1757.027 1762.299 1762.299 1763.211 + 1703.814 1698.462 1698.462 1702.065 1702.065 1702.200 + 1702.200 1700.444 1700.444 1699.845 1655.802 1663.567 + 1663.567 1658.555 1658.555 1646.100 1596.267 1605.622 + 1605.622 1618.750 1618.750 1635.937 1635.937 1653.934 + 1653.934 1661.611 1661.611 1667.610 1713.008 1720.065 + 1720.065 1734.071 1734.071 1739.040 1739.040 1748.260 + 1748.260 1757.027 1757.027 1762.299 1762.299 1763.211 + + 1703.892 1698.844 1698.844 1702.413 1702.413 1701.731 + 1701.731 1699.986 1699.986 1701.444 1660.255 1667.795 + 1667.795 1668.459 1668.459 1655.163 1601.127 1609.353 + 1609.353 1617.404 1617.404 1631.041 1631.041 1651.786 + 1651.786 1663.285 1663.285 1665.301 1711.406 1718.153 + 1718.153 1726.967 1726.967 1735.237 1735.237 1741.963 + 1741.963 1748.144 1748.144 1752.634 1752.634 1753.451 + 1703.892 1698.844 1698.844 1702.413 1702.413 1701.731 + 1701.731 1699.986 1699.986 1701.444 1701.444 1700.815 + 1667.795 1668.459 1668.459 1655.163 1655.163 1660.316 + 1609.353 1617.404 1617.404 1631.041 1631.041 1651.786 + 1651.786 1663.285 1663.285 1665.301 1665.301 1671.156 + 1718.153 1726.967 1726.967 1735.237 1735.237 1741.963 + 1741.963 1748.144 1748.144 1752.634 1752.634 1753.451 + + 1705.022 1700.567 1700.567 1701.804 1701.804 1701.362 + 1701.362 1700.767 1700.767 1701.893 1701.893 1701.368 + 1665.485 1664.948 1664.948 1661.296 1661.296 1663.628 + 1609.311 1614.576 1614.576 1624.572 1624.572 1647.069 + 1647.069 1660.272 1660.272 1662.980 1662.980 1667.035 + 1714.708 1722.226 1722.226 1728.802 1728.802 1733.773 + 1733.773 1737.922 1737.922 1742.198 1742.198 1743.365 + 1715.737 1709.964 1700.567 1701.804 1701.804 1701.362 + 1701.362 1700.767 1700.767 1701.893 1701.893 1701.368 + 1701.368 1699.683 1664.948 1661.296 1661.296 1663.628 + 1609.311 1614.576 1614.576 1624.572 1624.572 1647.069 + 1647.069 1660.272 1660.272 1662.980 1662.980 1667.035 + 1667.035 1675.588 1722.226 1728.802 1728.802 1733.773 + 1733.773 1737.922 1737.922 1742.198 1742.198 1743.365 + + 1719.243 1711.330 1700.853 1700.218 1700.218 1699.607 + 1699.607 1700.068 1700.068 1701.210 1701.210 1701.766 + 1701.766 1700.555 1662.892 1662.881 1662.881 1665.478 + 1608.150 1611.623 1611.623 1617.706 1617.706 1637.249 + 1637.249 1651.075 1651.075 1658.521 1658.521 1663.490 + 1663.490 1672.539 1711.929 1716.236 1716.236 1720.829 + 1720.829 1725.447 1725.447 1733.653 1733.653 1736.389 + 1719.243 1711.330 1711.330 1707.781 1700.218 1699.607 + 1699.607 1700.068 1700.068 1701.210 1701.210 1701.766 + 1701.766 1700.555 1700.555 1695.115 1662.881 1665.478 + 1665.478 1672.237 1611.623 1617.706 1617.706 1637.249 + 1637.249 1651.075 1651.075 1658.521 1658.521 1663.490 + 1663.490 1672.539 1672.539 1685.615 1716.236 1720.829 + 1720.829 1725.447 1725.447 1733.653 1733.653 1736.389 + + 1723.169 1713.518 1713.518 1709.875 1699.187 1698.747 + 1698.747 1699.929 1699.929 1700.999 1700.999 1701.130 + 1701.130 1699.544 1699.544 1693.640 1663.652 1666.483 + 1666.483 1671.932 1613.606 1621.778 1621.778 1634.432 + 1634.432 1644.201 1644.201 1650.301 1650.301 1659.819 + 1659.819 1669.497 1669.497 1684.092 1696.864 1705.456 + 1705.456 1717.453 1717.453 1728.552 1728.552 1731.841 + 1723.169 1713.518 1713.518 1709.875 1709.875 1706.817 + 1698.747 1699.929 1699.929 1700.999 1700.999 1701.130 + 1701.130 1699.544 1699.544 1693.640 1693.640 1686.224 + 1686.224 1681.462 1681.462 1681.491 1621.778 1634.432 + 1634.432 1644.201 1644.201 1650.301 1650.301 1659.819 + 1659.819 1669.497 1669.497 1684.092 1696.864 1705.456 + 1705.456 1717.453 1717.453 1728.552 1728.552 1731.841 + + 1727.884 1718.230 1718.230 1712.490 1712.490 1708.743 + 1696.162 1695.945 1695.945 1698.258 1698.258 1699.837 + 1699.837 1696.711 1696.711 1689.469 1689.469 1682.982 + 1682.982 1680.188 1680.188 1678.148 1627.237 1635.453 + 1635.453 1642.007 1642.007 1647.990 1647.990 1655.134 + 1655.134 1665.616 1665.616 1679.378 1679.378 1694.228 + 1694.228 1710.940 1710.940 1724.022 1724.022 1727.958 + 1727.884 1718.230 1718.230 1712.490 1712.490 1708.743 + 1708.743 1706.731 1695.945 1698.258 1698.258 1699.837 + 1699.837 1696.711 1696.711 1689.469 1689.469 1682.982 + 1682.982 1680.188 1680.188 1678.148 1678.148 1681.195 + 1635.453 1642.007 1642.007 1647.990 1647.990 1655.134 + 1655.134 1665.616 1665.616 1679.378 1679.378 1694.228 + 1694.228 1710.940 1710.940 1724.022 1724.022 1727.958 + + 1731.086 1721.751 1721.751 1715.268 1715.268 1711.037 + 1711.037 1709.285 1692.764 1694.018 1694.018 1694.486 + 1694.486 1689.240 1689.240 1680.319 1680.319 1678.310 + 1678.310 1678.978 1678.978 1678.160 1678.160 1678.061 + 1638.867 1644.408 1644.408 1650.921 1650.921 1656.214 + 1656.214 1666.875 1666.875 1678.506 1678.506 1690.812 + 1690.812 1708.329 1708.329 1721.903 1721.903 1726.129 + 1731.086 1721.751 1721.751 1715.268 1715.268 1711.037 + 1711.037 1709.285 1692.764 1694.018 1694.018 1694.486 + 1694.486 1689.240 1689.240 1680.319 1680.319 1678.310 + 1678.310 1678.978 1678.978 1678.160 1678.160 1678.061 + 1678.061 1683.268 1644.408 1650.921 1650.921 1656.214 + 1656.214 1666.875 1666.875 1678.506 1678.506 1690.812 + 1690.812 1708.329 1708.329 1721.903 1721.903 1726.129 + + 1734.441 1726.135 1726.135 1718.991 1718.991 1713.393 + 1713.393 1713.947 1690.333 1689.222 1689.222 1686.427 + 1686.427 1678.903 1678.903 1670.580 1670.580 1672.911 + 1672.911 1676.519 1676.519 1677.781 1677.781 1678.607 + 1678.607 1682.778 1649.716 1654.912 1654.912 1661.654 + 1661.654 1673.981 1673.981 1686.388 1686.388 1695.113 + 1695.113 1710.083 1710.083 1722.909 1722.909 1727.038 + 1667.850 1673.388 1673.388 1687.525 1687.525 1700.764 + 1700.764 1709.990 1680.149 1682.560 1682.560 1689.930 + 1689.930 1693.544 1693.544 1690.494 1690.494 1687.896 + 1687.896 1689.422 1689.422 1691.749 1719.726 1726.549 + 1726.549 1726.243 1726.243 1729.303 1729.303 1729.559 + 1729.559 1727.953 1727.953 1735.054 1735.054 1745.805 + 1745.805 1755.817 1755.817 1765.176 1765.176 1768.202 + + 1670.031 1676.111 1676.111 1687.281 1687.281 1698.754 + 1698.754 1707.144 1675.607 1678.211 1678.211 1685.938 + 1685.938 1689.444 1689.444 1689.143 1689.143 1687.063 + 1687.063 1684.915 1684.915 1684.480 1711.125 1716.853 + 1716.853 1718.847 1718.847 1719.161 1719.161 1718.284 + 1718.284 1715.806 1715.806 1722.728 1722.728 1734.543 + 1734.543 1744.699 1744.699 1753.769 1753.769 1756.851 + + 1670.031 1676.111 1676.111 1687.281 1687.281 1698.754 + 1698.754 1707.144 1675.607 1678.211 1678.211 1685.938 + 1685.938 1689.444 1689.444 1689.143 1689.143 1687.063 + 1687.063 1684.915 1684.915 1684.480 1684.480 1685.812 + 1716.853 1718.847 1718.847 1719.161 1719.161 1718.284 + 1718.284 1715.806 1715.806 1722.728 1722.728 1734.543 + 1734.543 1744.699 1744.699 1753.769 1753.769 1756.851 + + 1672.588 1674.362 1674.362 1684.927 1684.927 1696.686 + 1696.686 1704.055 1670.319 1673.535 1673.535 1678.062 + 1678.062 1680.824 1680.824 1682.531 1682.531 1677.560 + 1677.560 1676.151 1676.151 1674.924 1674.924 1675.664 + 1708.495 1710.617 1710.617 1711.857 1711.857 1710.024 + 1710.024 1708.846 1708.846 1713.403 1713.403 1725.920 + 1725.920 1738.258 1738.258 1746.465 1746.465 1749.294 + + 1672.588 1674.362 1674.362 1684.927 1684.927 1696.686 + 1696.686 1704.055 1670.319 1673.535 1673.535 1678.062 + 1678.062 1680.824 1680.824 1682.531 1682.531 1677.560 + 1677.560 1676.151 1676.151 1674.924 1674.924 1675.664 + 1708.495 1710.617 1710.617 1711.857 1711.857 1710.024 + 1710.024 1708.846 1708.846 1713.403 1713.403 1725.920 + 1725.920 1738.258 1738.258 1746.465 1746.465 1749.294 + + 1674.080 1669.830 1669.830 1681.162 1681.162 1692.225 + 1692.225 1698.825 1662.984 1666.221 1666.221 1666.751 + 1666.751 1666.966 1666.966 1667.104 1667.104 1662.466 + 1662.466 1663.560 1663.560 1661.098 1661.098 1663.789 + 1701.972 1704.125 1704.125 1705.124 1705.124 1705.217 + 1705.217 1706.025 1706.025 1708.716 1708.716 1716.846 + 1716.846 1732.937 1732.937 1741.448 1741.448 1744.162 + + 1674.080 1669.830 1669.830 1681.162 1681.162 1692.225 + 1692.225 1698.825 1662.984 1666.221 1666.221 1666.751 + 1666.751 1666.966 1666.966 1667.104 1667.104 1662.466 + 1662.466 1663.560 1663.560 1661.098 1661.098 1663.789 + 1701.972 1704.125 1704.125 1705.124 1705.124 1705.217 + 1705.217 1706.025 1706.025 1708.716 1708.716 1716.846 + 1716.846 1732.937 1732.937 1741.448 1741.448 1744.162 + + 1671.977 1666.082 1666.082 1676.571 1676.571 1687.560 + 1687.560 1694.266 1653.710 1654.988 1654.988 1651.556 + 1651.556 1654.157 1654.157 1653.491 1653.491 1651.055 + 1651.055 1651.453 1651.453 1649.558 1649.558 1653.377 + 1697.462 1699.854 1699.854 1701.647 1701.647 1703.877 + 1703.877 1705.813 1705.813 1705.318 1705.318 1715.133 + 1715.133 1727.741 1727.741 1738.778 1738.778 1741.735 + + 1671.977 1666.082 1666.082 1676.571 1676.571 1687.560 + 1687.560 1694.266 1653.710 1654.988 1654.988 1651.556 + 1651.556 1654.157 1654.157 1653.491 1653.491 1651.055 + 1651.055 1651.453 1651.453 1649.558 1649.558 1653.377 + 1697.462 1699.854 1699.854 1701.647 1701.647 1703.877 + 1703.877 1705.813 1705.813 1705.318 1705.318 1715.133 + 1715.133 1727.741 1727.741 1738.778 1738.778 1741.735 + + 1672.239 1666.738 1666.738 1673.701 1673.701 1683.386 + 1683.386 1690.984 1646.191 1645.484 1645.484 1642.610 + 1642.610 1643.336 1643.336 1643.700 1643.700 1644.982 + 1644.982 1645.206 1645.206 1644.331 1644.331 1647.070 + 1694.973 1697.366 1697.366 1699.993 1699.993 1702.802 + 1702.802 1706.382 1706.382 1706.206 1706.206 1718.904 + 1718.904 1729.777 1729.777 1739.632 1739.632 1742.418 + + 1672.239 1666.738 1666.738 1673.701 1673.701 1683.386 + 1683.386 1690.984 1646.191 1645.484 1645.484 1642.610 + 1642.610 1643.336 1643.336 1643.700 1643.700 1644.982 + 1644.982 1645.206 1645.206 1644.331 1644.331 1647.070 + 1647.070 1652.208 1697.366 1699.993 1699.993 1702.802 + 1702.802 1706.382 1706.382 1706.206 1706.206 1718.904 + 1718.904 1729.777 1729.777 1739.632 1739.632 1742.418 + + 1674.622 1668.852 1668.852 1672.376 1672.376 1679.411 + 1679.411 1687.034 1641.789 1641.925 1641.925 1636.672 + 1636.672 1635.630 1635.630 1639.686 1639.686 1642.233 + 1642.233 1642.321 1642.321 1640.658 1640.658 1642.415 + 1642.415 1647.043 1696.818 1700.038 1700.038 1705.060 + 1705.060 1711.075 1711.075 1712.219 1712.219 1724.489 + 1724.489 1733.681 1733.681 1742.281 1742.281 1744.808 + + 1674.622 1668.852 1668.852 1672.376 1672.376 1679.411 + 1679.411 1687.034 1641.789 1641.925 1641.925 1636.672 + 1636.672 1635.630 1635.630 1639.686 1639.686 1642.233 + 1642.233 1642.321 1642.321 1640.658 1640.658 1642.415 + 1642.415 1647.043 1696.818 1700.038 1700.038 1705.060 + 1705.060 1711.075 1711.075 1712.219 1712.219 1724.489 + 1724.489 1733.681 1733.681 1742.281 1742.281 1744.808 + + 1678.319 1671.638 1671.638 1670.051 1670.051 1675.269 + 1675.269 1683.096 1637.125 1637.830 1637.830 1630.960 + 1630.960 1630.946 1630.946 1635.661 1635.661 1638.759 + 1638.759 1638.854 1638.854 1636.974 1636.974 1639.032 + 1639.032 1643.884 1698.361 1701.633 1701.633 1710.064 + 1710.064 1715.758 1715.758 1719.507 1719.507 1730.786 + 1730.786 1739.544 1739.544 1746.272 1746.272 1748.390 + + 1678.319 1671.638 1671.638 1670.051 1670.051 1675.269 + 1675.269 1683.096 1637.125 1637.830 1637.830 1630.960 + 1630.960 1630.946 1630.946 1635.661 1635.661 1638.759 + 1638.759 1638.854 1638.854 1636.974 1636.974 1639.032 + 1639.032 1643.884 1698.361 1701.633 1701.633 1710.064 + 1710.064 1715.758 1715.758 1719.507 1719.507 1730.786 + 1730.786 1739.544 1739.544 1746.272 1746.272 1748.390 + + 1682.446 1678.208 1678.208 1670.413 1670.413 1674.026 + 1674.026 1679.614 1629.733 1630.583 1630.583 1626.151 + 1626.151 1625.832 1625.832 1630.795 1630.795 1635.011 + 1635.011 1635.620 1635.620 1634.873 1634.873 1638.392 + 1638.392 1643.918 1703.650 1707.921 1707.921 1718.589 + 1718.589 1721.992 1721.992 1727.656 1727.656 1739.027 + 1739.027 1745.195 1745.195 1750.850 1750.850 1753.270 + + 1682.446 1678.208 1678.208 1670.413 1670.413 1674.026 + 1674.026 1679.614 1677.608 1684.499 1630.583 1626.151 + 1626.151 1625.832 1625.832 1630.795 1630.795 1635.011 + 1635.011 1635.620 1635.620 1634.873 1634.873 1638.392 + 1638.392 1643.918 1703.650 1707.921 1707.921 1718.589 + 1718.589 1721.992 1721.992 1727.656 1727.656 1739.027 + 1739.027 1745.195 1745.195 1750.850 1750.850 1753.270 + + 1686.964 1685.502 1685.502 1677.894 1677.894 1676.557 + 1676.557 1679.238 1669.137 1671.771 1619.985 1618.736 + 1618.736 1620.684 1620.684 1625.110 1625.110 1631.028 + 1631.028 1632.877 1632.877 1636.686 1636.686 1641.620 + 1641.620 1646.998 1711.200 1717.410 1717.410 1728.166 + 1728.166 1731.889 1731.889 1735.058 1735.058 1745.195 + 1745.195 1752.647 1752.647 1758.724 1758.724 1760.733 + + 1686.964 1685.502 1685.502 1677.894 1677.894 1676.557 + 1676.557 1679.238 1669.137 1671.771 1619.985 1618.736 + 1618.736 1620.684 1620.684 1625.110 1625.110 1631.028 + 1631.028 1632.877 1632.877 1636.686 1636.686 1641.620 + 1641.620 1646.998 1711.200 1717.410 1717.410 1728.166 + 1728.166 1731.889 1731.889 1735.058 1735.058 1745.195 + 1745.195 1752.647 1752.647 1758.724 1758.724 1760.733 + + 1691.656 1691.448 1691.448 1687.965 1687.965 1683.964 + 1683.964 1682.894 1661.072 1659.981 1609.761 1610.141 + 1610.141 1614.036 1614.036 1619.527 1619.527 1628.560 + 1628.560 1632.551 1632.551 1640.947 1640.947 1645.388 + 1645.388 1651.182 1718.050 1725.665 1725.665 1735.547 + 1735.547 1738.530 1738.530 1741.374 1741.374 1750.728 + 1750.728 1758.795 1758.795 1767.872 1767.872 1769.574 + + 1691.656 1691.448 1691.448 1687.965 1687.965 1683.964 + 1683.964 1682.894 1661.072 1659.981 1659.981 1660.749 + 1610.141 1614.036 1614.036 1619.527 1619.527 1628.560 + 1628.560 1632.551 1632.551 1640.947 1640.947 1645.388 + 1645.388 1651.182 1718.050 1725.665 1725.665 1735.547 + 1735.547 1738.530 1738.530 1741.374 1741.374 1750.728 + 1750.728 1758.795 1758.795 1767.872 1767.872 1769.574 + + 1697.665 1697.516 1697.516 1695.669 1695.669 1693.384 + 1693.384 1689.868 1653.394 1650.855 1650.855 1649.365 + 1600.697 1604.406 1604.406 1616.821 1616.821 1628.012 + 1628.012 1637.071 1637.071 1646.611 1646.611 1649.114 + 1649.114 1654.888 1722.074 1730.867 1730.867 1738.551 + 1738.551 1742.511 1742.511 1746.885 1746.885 1757.856 + 1757.856 1773.464 1773.464 1779.759 1779.759 1780.200 + + 1697.665 1697.516 1697.516 1695.669 1695.669 1693.384 + 1693.384 1689.868 1653.394 1650.855 1650.855 1649.365 + 1600.697 1604.406 1604.406 1616.821 1616.821 1628.012 + 1628.012 1637.071 1637.071 1646.611 1646.611 1649.114 + 1649.114 1654.888 1722.074 1730.867 1730.867 1738.551 + 1738.551 1742.511 1742.511 1746.885 1746.885 1757.856 + 1757.856 1773.464 1773.464 1779.759 1779.759 1780.200 + + 1700.485 1700.248 1700.248 1700.557 1700.557 1700.535 + 1700.535 1696.735 1647.233 1644.931 1644.931 1642.272 + 1594.777 1596.761 1596.761 1610.551 1610.551 1629.359 + 1629.359 1642.622 1642.622 1649.051 1649.051 1652.094 + 1652.094 1657.382 1721.477 1729.020 1729.020 1737.823 + 1737.823 1743.657 1743.657 1748.738 1748.738 1768.559 + 1768.559 1788.399 1788.399 1787.617 1787.617 1787.169 + + 1700.485 1700.248 1700.248 1700.557 1700.557 1700.535 + 1700.535 1696.735 1647.233 1644.931 1644.931 1642.272 + 1642.272 1642.583 1596.761 1610.551 1610.551 1629.359 + 1629.359 1642.622 1642.622 1649.051 1649.051 1652.094 + 1652.094 1657.382 1657.382 1663.002 1729.020 1737.823 + 1737.823 1743.657 1743.657 1748.738 1748.738 1768.559 + 1768.559 1788.399 1788.399 1787.617 1787.617 1787.169 + + 1704.731 1702.872 1702.872 1704.210 1704.210 1704.395 + 1704.395 1700.819 1644.104 1643.010 1643.010 1640.108 + 1640.108 1637.216 1592.776 1604.435 1604.435 1630.586 + 1630.586 1642.415 1642.415 1648.716 1648.716 1653.547 + 1653.547 1659.312 1659.312 1665.434 1723.714 1733.342 + 1733.342 1742.664 1742.664 1749.096 1749.096 1770.177 + 1770.177 1785.839 1785.839 1786.349 1786.349 1786.193 + + 1704.731 1702.872 1702.872 1704.210 1704.210 1704.395 + 1704.395 1700.819 1644.104 1643.010 1643.010 1640.108 + 1640.108 1637.216 1592.776 1604.435 1604.435 1630.586 + 1630.586 1642.415 1642.415 1648.716 1648.716 1653.547 + 1653.547 1659.312 1659.312 1665.434 1723.714 1733.342 + 1733.342 1742.664 1742.664 1749.096 1749.096 1770.177 + 1770.177 1785.839 1785.839 1786.349 1786.349 1786.193 + + 1707.524 1703.283 1703.283 1703.032 1703.032 1704.055 + 1704.055 1702.097 1644.151 1644.395 1644.395 1643.398 + 1643.398 1636.848 1589.829 1595.897 1595.897 1614.480 + 1614.480 1633.227 1633.227 1646.277 1646.277 1654.148 + 1654.148 1660.200 1660.200 1667.026 1717.931 1725.906 + 1725.906 1740.420 1740.420 1752.103 1752.103 1766.739 + 1766.739 1775.062 1775.062 1779.267 1779.267 1779.755 + + 1707.524 1703.283 1703.283 1703.032 1703.032 1704.055 + 1704.055 1702.097 1644.151 1644.395 1644.395 1643.398 + 1643.398 1636.848 1636.848 1642.829 1595.897 1614.480 + 1614.480 1633.227 1633.227 1646.277 1646.277 1654.148 + 1654.148 1660.200 1660.200 1667.026 1717.931 1725.906 + 1725.906 1740.420 1740.420 1752.103 1752.103 1766.739 + 1766.739 1775.062 1775.062 1779.267 1779.267 1779.755 + + 1707.225 1701.031 1701.031 1702.245 1702.245 1703.551 + 1703.551 1702.020 1646.744 1648.998 1648.998 1651.680 + 1651.680 1644.217 1644.217 1644.270 1592.973 1605.541 + 1605.541 1623.730 1623.730 1640.703 1640.703 1654.659 + 1654.659 1660.942 1660.942 1667.692 1714.636 1722.896 + 1722.896 1739.469 1739.469 1747.290 1747.290 1757.481 + 1757.481 1765.879 1765.879 1770.930 1770.930 1771.771 + + 1707.225 1701.031 1701.031 1702.245 1702.245 1703.551 + 1703.551 1702.020 1646.744 1648.998 1648.998 1651.680 + 1651.680 1644.217 1644.217 1644.270 1592.973 1605.541 + 1605.541 1623.730 1623.730 1640.703 1640.703 1654.659 + 1654.659 1660.942 1660.942 1667.692 1714.636 1722.896 + 1722.896 1739.469 1739.469 1747.290 1747.290 1757.481 + 1757.481 1765.879 1765.879 1770.930 1770.930 1771.771 + + 1703.814 1698.462 1698.462 1702.065 1702.065 1702.200 + 1702.200 1700.444 1650.755 1655.802 1655.802 1663.567 + 1663.567 1658.555 1658.555 1646.100 1596.267 1605.622 + 1605.622 1618.750 1618.750 1635.937 1635.937 1653.934 + 1653.934 1661.611 1661.611 1667.610 1713.008 1720.065 + 1720.065 1734.071 1734.071 1739.040 1739.040 1748.260 + 1748.260 1757.027 1757.027 1762.299 1762.299 1763.211 + + 1703.814 1698.462 1698.462 1702.065 1702.065 1702.200 + 1702.200 1700.444 1700.444 1699.845 1655.802 1663.567 + 1663.567 1658.555 1658.555 1646.100 1596.267 1605.622 + 1605.622 1618.750 1618.750 1635.937 1635.937 1653.934 + 1653.934 1661.611 1661.611 1667.610 1713.008 1720.065 + 1720.065 1734.071 1734.071 1739.040 1739.040 1748.260 + 1748.260 1757.027 1757.027 1762.299 1762.299 1763.211 + + 1703.892 1698.844 1698.844 1702.413 1702.413 1701.731 + 1701.731 1699.986 1699.986 1701.444 1660.255 1667.795 + 1667.795 1668.459 1668.459 1655.163 1601.127 1609.353 + 1609.353 1617.404 1617.404 1631.041 1631.041 1651.786 + 1651.786 1663.285 1663.285 1665.301 1711.406 1718.153 + 1718.153 1726.967 1726.967 1735.237 1735.237 1741.963 + 1741.963 1748.144 1748.144 1752.634 1752.634 1753.451 + + 1703.892 1698.844 1698.844 1702.413 1702.413 1701.731 + 1701.731 1699.986 1699.986 1701.444 1701.444 1700.815 + 1667.795 1668.459 1668.459 1655.163 1655.163 1660.316 + 1609.353 1617.404 1617.404 1631.041 1631.041 1651.786 + 1651.786 1663.285 1663.285 1665.301 1665.301 1671.156 + 1718.153 1726.967 1726.967 1735.237 1735.237 1741.963 + 1741.963 1748.144 1748.144 1752.634 1752.634 1753.451 + + 1705.022 1700.567 1700.567 1701.804 1701.804 1701.362 + 1701.362 1700.767 1700.767 1701.893 1701.893 1701.368 + 1665.485 1664.948 1664.948 1661.296 1661.296 1663.628 + 1609.311 1614.576 1614.576 1624.572 1624.572 1647.069 + 1647.069 1660.272 1660.272 1662.980 1662.980 1667.035 + 1714.708 1722.226 1722.226 1728.802 1728.802 1733.773 + 1733.773 1737.922 1737.922 1742.198 1742.198 1743.365 + + 1715.737 1709.964 1700.567 1701.804 1701.804 1701.362 + 1701.362 1700.767 1700.767 1701.893 1701.893 1701.368 + 1701.368 1699.683 1664.948 1661.296 1661.296 1663.628 + 1609.311 1614.576 1614.576 1624.572 1624.572 1647.069 + 1647.069 1660.272 1660.272 1662.980 1662.980 1667.035 + 1667.035 1675.588 1722.226 1728.802 1728.802 1733.773 + 1733.773 1737.922 1737.922 1742.198 1742.198 1743.365 + + 1719.243 1711.330 1700.853 1700.218 1700.218 1699.607 + 1699.607 1700.068 1700.068 1701.210 1701.210 1701.766 + 1701.766 1700.555 1662.892 1662.881 1662.881 1665.478 + 1608.150 1611.623 1611.623 1617.706 1617.706 1637.249 + 1637.249 1651.075 1651.075 1658.521 1658.521 1663.490 + 1663.490 1672.539 1711.929 1716.236 1716.236 1720.829 + 1720.829 1725.447 1725.447 1733.653 1733.653 1736.389 + + 1719.243 1711.330 1711.330 1707.781 1700.218 1699.607 + 1699.607 1700.068 1700.068 1701.210 1701.210 1701.766 + 1701.766 1700.555 1700.555 1695.115 1662.881 1665.478 + 1665.478 1672.237 1611.623 1617.706 1617.706 1637.249 + 1637.249 1651.075 1651.075 1658.521 1658.521 1663.490 + 1663.490 1672.539 1672.539 1685.615 1716.236 1720.829 + 1720.829 1725.447 1725.447 1733.653 1733.653 1736.389 + + 1723.169 1713.518 1713.518 1709.875 1699.187 1698.747 + 1698.747 1699.929 1699.929 1700.999 1700.999 1701.130 + 1701.130 1699.544 1699.544 1693.640 1663.652 1666.483 + 1666.483 1671.932 1613.606 1621.778 1621.778 1634.432 + 1634.432 1644.201 1644.201 1650.301 1650.301 1659.819 + 1659.819 1669.497 1669.497 1684.092 1696.864 1705.456 + 1705.456 1717.453 1717.453 1728.552 1728.552 1731.841 + + 1723.169 1713.518 1713.518 1709.875 1709.875 1706.817 + 1698.747 1699.929 1699.929 1700.999 1700.999 1701.130 + 1701.130 1699.544 1699.544 1693.640 1693.640 1686.224 + 1686.224 1681.462 1681.462 1681.491 1621.778 1634.432 + 1634.432 1644.201 1644.201 1650.301 1650.301 1659.819 + 1659.819 1669.497 1669.497 1684.092 1696.864 1705.456 + 1705.456 1717.453 1717.453 1728.552 1728.552 1731.841 + + 1727.884 1718.230 1718.230 1712.490 1712.490 1708.743 + 1696.162 1695.945 1695.945 1698.258 1698.258 1699.837 + 1699.837 1696.711 1696.711 1689.469 1689.469 1682.982 + 1682.982 1680.188 1680.188 1678.148 1627.237 1635.453 + 1635.453 1642.007 1642.007 1647.990 1647.990 1655.134 + 1655.134 1665.616 1665.616 1679.378 1679.378 1694.228 + 1694.228 1710.940 1710.940 1724.022 1724.022 1727.958 + + 1727.884 1718.230 1718.230 1712.490 1712.490 1708.743 + 1708.743 1706.731 1695.945 1698.258 1698.258 1699.837 + 1699.837 1696.711 1696.711 1689.469 1689.469 1682.982 + 1682.982 1680.188 1680.188 1678.148 1678.148 1681.195 + 1635.453 1642.007 1642.007 1647.990 1647.990 1655.134 + 1655.134 1665.616 1665.616 1679.378 1679.378 1694.228 + 1694.228 1710.940 1710.940 1724.022 1724.022 1727.958 + + 1731.086 1721.751 1721.751 1715.268 1715.268 1711.037 + 1711.037 1709.285 1692.764 1694.018 1694.018 1694.486 + 1694.486 1689.240 1689.240 1680.319 1680.319 1678.310 + 1678.310 1678.978 1678.978 1678.160 1678.160 1678.061 + 1638.867 1644.408 1644.408 1650.921 1650.921 1656.214 + 1656.214 1666.875 1666.875 1678.506 1678.506 1690.812 + 1690.812 1708.329 1708.329 1721.903 1721.903 1726.129 + + 1731.086 1721.751 1721.751 1715.268 1715.268 1711.037 + 1711.037 1709.285 1692.764 1694.018 1694.018 1694.486 + 1694.486 1689.240 1689.240 1680.319 1680.319 1678.310 + 1678.310 1678.978 1678.978 1678.160 1678.160 1678.061 + 1678.061 1683.268 1644.408 1650.921 1650.921 1656.214 + 1656.214 1666.875 1666.875 1678.506 1678.506 1690.812 + 1690.812 1708.329 1708.329 1721.903 1721.903 1726.129 + + 1734.441 1726.135 1726.135 1718.991 1718.991 1713.393 + 1713.393 1713.947 1690.333 1689.222 1689.222 1686.427 + 1686.427 1678.903 1678.903 1670.580 1670.580 1672.911 + 1672.911 1676.519 1676.519 1677.781 1677.781 1678.607 + 1678.607 1682.778 1649.716 1654.912 1654.912 1661.654 + 1661.654 1673.981 1673.981 1686.388 1686.388 1695.113 + 1695.113 1710.083 1710.083 1722.909 1722.909 1727.038 + + 1669.834 1675.714 1675.714 1689.772 1689.772 1702.899 + 1702.899 1712.002 1682.191 1684.614 1684.614 1692.024 + 1692.024 1695.607 1695.607 1692.531 1692.531 1689.982 + 1689.982 1691.602 1691.602 1693.941 1723.498 1729.196 + 1729.196 1728.356 1728.356 1731.680 1731.680 1731.786 + 1731.786 1730.255 1730.255 1737.102 1737.102 1747.505 + 1747.505 1758.189 1758.189 1768.058 1768.058 1770.918 + + 1672.131 1678.295 1678.295 1689.435 1689.435 1700.862 + 1700.862 1709.130 1677.652 1680.239 1680.239 1688.029 + 1688.029 1691.510 1691.510 1691.214 1691.214 1689.136 + 1689.136 1687.009 1687.009 1686.656 1714.912 1719.665 + 1719.665 1721.045 1721.045 1721.406 1721.406 1720.458 + 1720.458 1718.166 1718.166 1725.185 1725.185 1736.905 + 1736.905 1747.035 1747.035 1756.344 1756.344 1759.245 + 1672.131 1678.295 1678.295 1689.435 1689.435 1700.862 + 1700.862 1709.130 1677.652 1680.239 1680.239 1688.029 + 1688.029 1691.510 1691.510 1691.214 1691.214 1689.136 + 1689.136 1687.009 1687.009 1686.656 1686.656 1687.997 + 1719.665 1721.045 1721.045 1721.406 1721.406 1720.458 + 1720.458 1718.166 1718.166 1725.185 1725.185 1736.905 + 1736.905 1747.035 1747.035 1756.344 1756.344 1759.245 + + 1674.608 1676.434 1676.434 1687.038 1687.038 1698.796 + 1698.796 1705.914 1672.474 1675.606 1675.606 1680.147 + 1680.147 1682.909 1682.909 1684.574 1684.574 1679.609 + 1679.609 1678.295 1678.295 1677.088 1677.088 1677.864 + 1711.390 1712.942 1712.942 1714.106 1714.106 1712.227 + 1712.227 1711.298 1711.298 1715.858 1715.858 1728.193 + 1728.193 1740.453 1740.453 1748.702 1748.702 1751.350 + 1674.608 1676.434 1676.434 1687.038 1687.038 1698.796 + 1698.796 1705.914 1672.474 1675.606 1675.606 1680.147 + 1680.147 1682.909 1682.909 1684.574 1684.574 1679.609 + 1679.609 1678.295 1678.295 1677.088 1677.088 1677.864 + 1711.390 1712.942 1712.942 1714.106 1714.106 1712.227 + 1712.227 1711.298 1711.298 1715.858 1715.858 1728.193 + 1728.193 1740.453 1740.453 1748.702 1748.702 1751.350 + + 1675.909 1671.835 1671.835 1683.252 1683.252 1694.132 + 1694.132 1699.930 1665.189 1668.376 1668.376 1668.792 + 1668.792 1669.077 1669.077 1669.151 1669.151 1664.571 + 1664.571 1665.695 1665.695 1663.281 1663.281 1666.041 + 1704.879 1706.463 1706.463 1707.388 1707.388 1707.461 + 1707.461 1708.316 1708.316 1711.190 1711.190 1719.418 + 1719.418 1735.045 1735.045 1743.294 1743.294 1745.858 + 1675.909 1671.835 1671.835 1683.252 1683.252 1694.132 + 1694.132 1699.930 1665.189 1668.376 1668.376 1668.792 + 1668.792 1669.077 1669.077 1669.151 1669.151 1664.571 + 1664.571 1665.695 1665.695 1663.281 1663.281 1666.041 + 1704.879 1706.463 1706.463 1707.388 1707.388 1707.461 + 1707.461 1708.316 1708.316 1711.190 1711.190 1719.418 + 1719.418 1735.045 1735.045 1743.294 1743.294 1745.858 + + 1673.768 1668.032 1668.032 1678.613 1678.613 1689.507 + 1689.507 1695.432 1655.718 1657.041 1657.041 1653.612 + 1653.612 1656.343 1656.343 1655.560 1655.560 1653.190 + 1653.190 1653.564 1653.564 1651.708 1651.708 1655.633 + 1700.342 1702.234 1702.234 1703.869 1703.869 1706.213 + 1706.213 1708.026 1708.026 1707.755 1707.755 1717.602 + 1717.602 1729.443 1729.443 1740.295 1740.295 1743.175 + 1673.768 1668.032 1668.032 1678.613 1678.613 1689.507 + 1689.507 1695.432 1655.718 1657.041 1657.041 1653.612 + 1653.612 1656.343 1656.343 1655.560 1655.560 1653.190 + 1653.190 1653.564 1653.564 1651.708 1651.708 1655.633 + 1700.342 1702.234 1702.234 1703.869 1703.869 1706.213 + 1706.213 1708.026 1708.026 1707.755 1707.755 1717.602 + 1717.602 1729.443 1729.443 1740.295 1740.295 1743.175 + + 1674.190 1668.718 1668.718 1675.712 1675.712 1685.391 + 1685.391 1692.656 1648.188 1647.529 1647.529 1644.651 + 1644.651 1645.523 1645.523 1645.834 1645.834 1647.152 + 1647.152 1647.332 1647.332 1646.494 1646.494 1649.311 + 1697.746 1699.737 1699.737 1702.187 1702.187 1705.115 + 1705.115 1708.678 1708.678 1708.609 1708.609 1721.484 + 1721.484 1731.621 1731.621 1741.151 1741.151 1743.857 + 1674.190 1668.718 1668.718 1675.712 1675.712 1685.391 + 1685.391 1692.656 1648.188 1647.529 1647.529 1644.651 + 1644.651 1645.523 1645.523 1645.834 1645.834 1647.152 + 1647.152 1647.332 1647.332 1646.494 1646.494 1649.311 + 1649.311 1654.487 1699.737 1702.187 1702.187 1705.115 + 1705.115 1708.678 1708.678 1708.609 1708.609 1721.484 + 1721.484 1731.621 1731.621 1741.151 1741.151 1743.857 + + 1676.661 1670.842 1670.842 1674.327 1674.327 1681.355 + 1681.355 1688.812 1644.041 1644.154 1644.154 1638.682 + 1638.682 1637.876 1637.876 1641.878 1641.878 1644.442 + 1644.442 1644.441 1644.441 1642.823 1642.823 1644.646 + 1644.646 1649.323 1699.097 1702.212 1702.212 1707.455 + 1707.455 1713.381 1713.381 1714.567 1714.567 1727.060 + 1727.060 1735.786 1735.786 1744.005 1744.005 1746.384 + 1676.661 1670.842 1670.842 1674.327 1674.327 1681.355 + 1681.355 1688.812 1644.041 1644.154 1644.154 1638.682 + 1638.682 1637.876 1637.876 1641.878 1641.878 1644.442 + 1644.442 1644.441 1644.441 1642.823 1642.823 1644.646 + 1644.646 1649.323 1699.097 1702.212 1702.212 1707.455 + 1707.455 1713.381 1713.381 1714.567 1714.567 1727.060 + 1727.060 1735.786 1735.786 1744.005 1744.005 1746.384 + + 1680.377 1673.791 1673.791 1671.953 1671.953 1677.094 + 1677.094 1684.961 1639.391 1640.054 1640.054 1632.961 + 1632.961 1633.227 1633.227 1637.933 1637.933 1640.999 + 1640.999 1640.961 1640.961 1639.090 1639.090 1641.279 + 1641.279 1646.168 1700.605 1703.908 1703.908 1712.455 + 1712.455 1718.142 1718.142 1721.938 1721.938 1733.428 + 1733.428 1741.867 1741.867 1748.048 1748.048 1749.992 + 1680.377 1673.791 1673.791 1671.953 1671.953 1677.094 + 1677.094 1684.961 1639.391 1640.054 1640.054 1632.961 + 1632.961 1633.227 1633.227 1637.933 1637.933 1640.999 + 1640.999 1640.961 1640.961 1639.090 1639.090 1641.279 + 1641.279 1646.168 1700.605 1703.908 1703.908 1712.455 + 1712.455 1718.142 1718.142 1721.938 1721.938 1733.428 + 1733.428 1741.867 1741.867 1748.048 1748.048 1749.992 + + 1684.480 1680.655 1680.655 1672.477 1672.477 1675.766 + 1675.766 1681.490 1631.952 1632.879 1632.879 1628.234 + 1628.234 1628.084 1628.084 1633.140 1633.140 1637.295 + 1637.295 1638.015 1638.015 1637.154 1637.154 1640.634 + 1640.634 1646.191 1706.037 1710.427 1710.427 1721.025 + 1721.025 1724.400 1724.400 1730.057 1730.057 1741.646 + 1741.646 1747.414 1747.414 1752.550 1752.550 1754.909 + 1684.480 1680.655 1680.655 1672.477 1672.477 1675.766 + 1675.766 1681.490 1679.531 1685.967 1632.879 1628.234 + 1628.234 1628.084 1628.084 1633.140 1633.140 1637.295 + 1637.295 1638.015 1638.015 1637.154 1637.154 1640.634 + 1640.634 1646.191 1706.037 1710.427 1710.427 1721.025 + 1721.025 1724.400 1724.400 1730.057 1730.057 1741.646 + 1741.646 1747.414 1747.414 1752.550 1752.550 1754.909 + + 1688.794 1687.780 1687.780 1680.326 1680.326 1678.442 + 1678.442 1681.090 1671.003 1673.443 1622.187 1620.846 + 1620.846 1622.967 1622.967 1627.503 1627.503 1633.293 + 1633.293 1635.159 1635.159 1638.975 1638.975 1643.872 + 1643.872 1649.261 1714.039 1720.913 1720.913 1730.550 + 1730.550 1734.266 1734.266 1737.415 1737.415 1747.757 + 1747.757 1755.235 1755.235 1760.971 1760.971 1762.780 + 1688.794 1687.780 1687.780 1680.326 1680.326 1678.442 + 1678.442 1681.090 1671.003 1673.443 1622.187 1620.846 + 1620.846 1622.967 1622.967 1627.503 1627.503 1633.293 + 1633.293 1635.159 1635.159 1638.975 1638.975 1643.872 + 1643.872 1649.261 1714.039 1720.913 1720.913 1730.550 + 1730.550 1734.266 1734.266 1737.415 1737.415 1747.757 + 1747.757 1755.235 1755.235 1760.971 1760.971 1762.780 + + 1693.381 1693.548 1693.548 1690.154 1690.154 1685.998 + 1685.998 1684.800 1663.047 1661.978 1611.904 1612.321 + 1612.321 1616.322 1616.322 1621.835 1621.835 1630.799 + 1630.799 1634.887 1634.887 1643.189 1643.189 1647.713 + 1647.713 1653.457 1720.519 1728.450 1728.450 1737.973 + 1737.973 1740.897 1740.897 1743.767 1743.767 1753.131 + 1753.131 1760.368 1760.368 1770.001 1770.001 1771.560 + 1693.381 1693.548 1693.548 1690.154 1690.154 1685.998 + 1685.998 1684.800 1663.047 1661.978 1661.978 1662.727 + 1612.321 1616.322 1616.322 1621.835 1621.835 1630.799 + 1630.799 1634.887 1634.887 1643.189 1643.189 1647.713 + 1647.713 1653.457 1720.519 1728.450 1728.450 1737.973 + 1737.973 1740.897 1740.897 1743.767 1743.767 1753.131 + 1753.131 1760.368 1760.368 1770.001 1770.001 1771.560 + + 1699.429 1699.591 1699.591 1697.688 1697.688 1695.506 + 1695.506 1691.949 1655.641 1653.403 1653.403 1652.011 + 1602.823 1606.711 1606.711 1619.189 1619.189 1630.334 + 1630.334 1639.524 1639.524 1648.766 1648.766 1651.447 + 1651.447 1657.180 1724.147 1733.203 1733.203 1741.015 + 1741.015 1744.887 1744.887 1749.352 1749.352 1760.505 + 1760.505 1774.627 1774.627 1781.255 1781.255 1781.770 + 1699.429 1699.591 1699.591 1697.688 1697.688 1695.506 + 1695.506 1691.949 1655.641 1653.403 1653.403 1652.011 + 1602.823 1606.711 1606.711 1619.189 1619.189 1630.334 + 1630.334 1639.524 1639.524 1648.766 1648.766 1651.447 + 1651.447 1657.180 1724.147 1733.203 1733.203 1741.015 + 1741.015 1744.887 1744.887 1749.352 1749.352 1760.505 + 1760.505 1774.627 1774.627 1781.255 1781.255 1781.770 + + 1702.294 1702.292 1702.292 1702.401 1702.401 1702.686 + 1702.686 1698.967 1649.686 1647.995 1647.995 1645.417 + 1596.874 1598.917 1598.917 1612.898 1612.898 1631.721 + 1631.721 1645.023 1645.023 1651.282 1651.282 1654.397 + 1654.397 1659.681 1723.391 1731.282 1731.282 1740.304 + 1740.304 1746.079 1746.079 1751.245 1751.245 1771.546 + 1771.546 1790.428 1790.428 1789.135 1789.135 1788.685 + 1702.294 1702.292 1702.292 1702.401 1702.401 1702.686 + 1702.686 1698.967 1649.686 1647.995 1647.995 1645.417 + 1645.417 1645.382 1598.917 1612.898 1612.898 1631.721 + 1631.721 1645.023 1645.023 1651.282 1651.282 1654.397 + 1654.397 1659.681 1659.681 1665.324 1731.282 1740.304 + 1740.304 1746.079 1746.079 1751.245 1751.245 1771.546 + 1771.546 1790.428 1790.428 1789.135 1789.135 1788.685 + + 1706.667 1704.904 1704.904 1706.058 1706.058 1706.533 + 1706.533 1703.110 1646.355 1645.671 1645.671 1642.708 + 1642.708 1639.600 1594.915 1606.780 1606.780 1633.074 + 1633.074 1644.824 1644.824 1651.032 1651.032 1655.875 + 1655.875 1661.629 1661.629 1667.765 1725.957 1735.854 + 1735.854 1745.113 1745.113 1751.654 1751.654 1771.803 + 1771.803 1787.386 1787.386 1787.857 1787.857 1787.706 + 1706.667 1704.904 1704.904 1706.058 1706.058 1706.533 + 1706.533 1703.110 1646.355 1645.671 1645.671 1642.708 + 1642.708 1639.600 1594.915 1606.780 1606.780 1633.074 + 1633.074 1644.824 1644.824 1651.032 1651.032 1655.875 + 1655.875 1661.629 1661.629 1667.765 1725.957 1735.854 + 1735.854 1745.113 1745.113 1751.654 1751.654 1771.803 + 1771.803 1787.386 1787.386 1787.857 1787.857 1787.706 + + 1709.631 1705.435 1705.435 1704.925 1704.925 1706.133 + 1706.133 1704.361 1645.975 1646.351 1646.351 1645.573 + 1645.573 1639.115 1591.966 1598.160 1598.160 1616.944 + 1616.944 1635.794 1635.794 1648.736 1648.736 1656.520 + 1656.520 1662.539 1662.539 1669.380 1720.474 1728.409 + 1728.409 1743.006 1743.006 1754.629 1754.629 1768.571 + 1768.571 1776.478 1776.478 1780.725 1780.725 1781.211 + 1709.631 1705.435 1705.435 1704.925 1704.925 1706.133 + 1706.133 1704.361 1645.975 1646.351 1646.351 1645.573 + 1645.573 1639.115 1639.115 1645.708 1598.160 1616.944 + 1616.944 1635.794 1635.794 1648.736 1648.736 1656.520 + 1656.520 1662.539 1662.539 1669.380 1720.474 1728.409 + 1728.409 1743.006 1743.006 1754.629 1754.629 1768.571 + 1768.571 1776.478 1776.478 1780.725 1780.725 1781.211 + + 1709.403 1703.137 1703.137 1704.131 1704.131 1705.613 + 1705.613 1704.240 1648.406 1650.850 1650.850 1653.824 + 1653.824 1646.431 1646.431 1646.793 1595.167 1607.911 + 1607.911 1626.195 1626.195 1643.306 1643.306 1657.128 + 1657.128 1663.309 1663.309 1670.084 1717.686 1725.866 + 1725.866 1742.076 1742.076 1749.289 1749.289 1759.180 + 1759.180 1767.399 1767.399 1772.419 1772.419 1773.234 + 1709.403 1703.137 1703.137 1704.131 1704.131 1705.613 + 1705.613 1704.240 1648.406 1650.850 1650.850 1653.824 + 1653.824 1646.431 1646.431 1646.793 1595.167 1607.911 + 1607.911 1626.195 1626.195 1643.306 1643.306 1657.128 + 1657.128 1663.309 1663.309 1670.084 1717.686 1725.866 + 1725.866 1742.076 1742.076 1749.289 1749.289 1759.180 + 1759.180 1767.399 1767.399 1772.419 1772.419 1773.234 + + 1706.053 1700.478 1700.478 1703.967 1703.967 1704.329 + 1704.329 1702.625 1652.462 1657.790 1657.790 1665.938 + 1665.938 1661.037 1661.037 1648.475 1598.484 1607.975 + 1607.975 1621.085 1621.085 1638.621 1638.621 1656.464 + 1656.464 1664.011 1664.011 1670.029 1715.742 1722.922 + 1722.922 1736.556 1736.556 1740.739 1740.739 1749.874 + 1749.874 1758.620 1758.620 1763.860 1763.860 1764.739 + 1706.053 1700.478 1700.478 1703.967 1703.967 1704.329 + 1704.329 1702.625 1702.625 1702.066 1657.790 1665.938 + 1665.938 1661.037 1661.037 1648.475 1598.484 1607.975 + 1607.975 1621.085 1621.085 1638.621 1638.621 1656.464 + 1656.464 1664.011 1664.011 1670.029 1715.742 1722.922 + 1722.922 1736.556 1736.556 1740.739 1740.739 1749.874 + 1749.874 1758.620 1758.620 1763.860 1763.860 1764.739 + + 1706.027 1700.936 1700.936 1704.401 1704.401 1703.915 + 1703.915 1702.082 1702.082 1703.649 1662.623 1670.935 + 1670.935 1671.243 1671.243 1657.370 1603.373 1611.709 + 1611.709 1619.672 1619.672 1633.741 1633.741 1654.400 + 1654.400 1665.655 1665.655 1667.628 1713.354 1720.509 + 1720.509 1729.380 1729.380 1737.368 1737.368 1743.761 + 1743.761 1749.799 1749.799 1754.298 1754.298 1755.102 + 1706.027 1700.936 1700.936 1704.401 1704.401 1703.915 + 1703.915 1702.082 1702.082 1703.649 1703.649 1703.204 + 1670.935 1671.243 1671.243 1657.370 1657.370 1663.086 + 1611.709 1619.672 1619.672 1633.741 1633.741 1654.400 + 1654.400 1665.655 1665.655 1667.628 1667.628 1673.510 + 1720.509 1729.380 1729.380 1737.368 1737.368 1743.761 + 1743.761 1749.799 1749.799 1754.298 1754.298 1755.102 + + 1707.069 1702.630 1702.630 1703.901 1703.901 1703.472 + 1703.472 1702.808 1702.808 1704.007 1704.007 1703.637 + 1668.356 1667.398 1667.398 1663.409 1663.409 1666.120 + 1611.546 1616.850 1616.850 1627.183 1627.183 1649.746 + 1649.746 1662.700 1662.700 1665.280 1665.280 1669.372 + 1716.654 1724.382 1724.382 1730.858 1730.858 1735.620 + 1735.620 1739.623 1739.623 1743.782 1743.782 1744.864 + 1717.820 1712.158 1702.630 1703.901 1703.901 1703.472 + 1703.472 1702.808 1702.808 1704.007 1704.007 1703.637 + 1703.637 1702.213 1667.398 1663.409 1663.409 1666.120 + 1611.546 1616.850 1616.850 1627.183 1627.183 1649.746 + 1649.746 1662.700 1662.700 1665.280 1665.280 1669.372 + 1669.372 1677.905 1724.382 1730.858 1730.858 1735.620 + 1735.620 1739.623 1739.623 1743.782 1743.782 1744.864 + + 1721.268 1713.497 1702.856 1702.301 1702.301 1701.720 + 1701.720 1702.159 1702.159 1703.399 1703.399 1703.964 + 1703.964 1702.915 1664.951 1664.822 1664.822 1667.738 + 1610.308 1613.847 1613.847 1620.211 1620.211 1639.927 + 1639.927 1653.514 1653.514 1660.958 1660.958 1665.842 + 1665.842 1674.834 1713.765 1717.942 1717.942 1722.453 + 1722.453 1727.079 1727.079 1735.359 1735.359 1738.000 + 1721.268 1713.497 1713.497 1710.066 1702.301 1701.720 + 1701.720 1702.159 1702.159 1703.399 1703.399 1703.964 + 1703.964 1702.915 1702.915 1697.605 1664.822 1667.738 + 1667.738 1675.334 1613.847 1620.211 1620.211 1639.927 + 1639.927 1653.514 1653.514 1660.958 1660.958 1665.842 + 1665.842 1674.834 1674.834 1687.783 1717.942 1722.453 + 1722.453 1727.079 1727.079 1735.359 1735.359 1738.000 + + 1725.104 1715.571 1715.571 1712.078 1701.249 1700.889 + 1700.889 1702.007 1702.007 1703.110 1703.110 1703.276 + 1703.276 1701.772 1701.772 1695.909 1665.434 1668.478 + 1668.478 1674.351 1615.871 1624.271 1624.271 1636.942 + 1636.942 1646.586 1646.586 1652.737 1652.737 1662.214 + 1662.214 1671.847 1671.847 1686.266 1698.040 1706.688 + 1706.688 1718.896 1718.896 1730.140 1730.140 1733.361 + 1725.104 1715.571 1715.571 1712.078 1712.078 1709.172 + 1700.889 1702.007 1702.007 1703.110 1703.110 1703.276 + 1703.276 1701.772 1701.772 1695.909 1695.909 1688.492 + 1688.492 1683.778 1683.778 1684.663 1624.271 1636.942 + 1636.942 1646.586 1646.586 1652.737 1652.737 1662.214 + 1662.214 1671.847 1671.847 1686.266 1698.040 1706.688 + 1706.688 1718.896 1718.896 1730.140 1730.140 1733.361 + + 1729.797 1720.230 1720.230 1714.585 1714.585 1710.941 + 1698.308 1698.129 1698.129 1700.380 1700.380 1701.962 + 1701.962 1698.857 1698.857 1691.547 1691.547 1685.120 + 1685.120 1682.409 1682.409 1680.470 1629.595 1637.890 + 1637.890 1644.426 1644.426 1650.436 1650.436 1657.558 + 1657.558 1668.067 1668.067 1681.158 1681.158 1695.534 + 1695.534 1712.351 1712.351 1725.582 1725.582 1729.453 + 1729.797 1720.230 1720.230 1714.585 1714.585 1710.941 + 1710.941 1709.026 1698.129 1700.380 1700.380 1701.962 + 1701.962 1698.857 1698.857 1691.547 1691.547 1685.120 + 1685.120 1682.409 1682.409 1680.470 1680.470 1684.273 + 1637.890 1644.426 1644.426 1650.436 1650.436 1657.558 + 1657.558 1668.067 1668.067 1681.158 1681.158 1695.534 + 1695.534 1712.351 1712.351 1725.582 1725.582 1729.453 + + 1733.003 1723.740 1723.740 1717.338 1717.338 1713.098 + 1713.098 1711.417 1694.966 1696.205 1696.205 1696.624 + 1696.624 1691.350 1691.350 1682.318 1682.318 1680.426 + 1680.426 1681.196 1681.196 1680.496 1680.496 1680.649 + 1641.198 1646.867 1646.867 1653.385 1653.385 1658.643 + 1658.643 1669.342 1669.342 1680.359 1680.359 1692.311 + 1692.311 1709.907 1709.907 1723.571 1723.571 1727.735 + 1733.003 1723.740 1723.740 1717.338 1717.338 1713.098 + 1713.098 1711.417 1694.966 1696.205 1696.205 1696.624 + 1696.624 1691.350 1691.350 1682.318 1682.318 1680.426 + 1680.426 1681.196 1681.196 1680.496 1680.496 1680.649 + 1680.649 1686.351 1646.867 1653.385 1653.385 1658.643 + 1658.643 1669.342 1669.342 1680.359 1680.359 1692.311 + 1692.311 1709.907 1709.907 1723.571 1723.571 1727.735 + + 1736.413 1728.125 1728.125 1721.021 1721.021 1715.527 + 1715.527 1716.104 1692.431 1691.372 1691.372 1688.576 + 1688.576 1681.087 1681.087 1672.794 1672.794 1675.102 + 1675.102 1678.760 1678.760 1680.152 1680.152 1681.008 + 1681.008 1685.358 1652.109 1657.424 1657.424 1664.157 + 1664.157 1676.440 1676.440 1688.613 1688.613 1696.910 + 1696.910 1711.841 1711.841 1724.726 1724.726 1728.799 + 1669.834 1675.714 1675.714 1689.772 1689.772 1702.899 + 1702.899 1712.002 1682.191 1684.614 1684.614 1692.024 + 1692.024 1695.607 1695.607 1692.531 1692.531 1689.982 + 1689.982 1691.602 1691.602 1693.941 1723.498 1729.196 + 1729.196 1728.356 1728.356 1731.680 1731.680 1731.786 + 1731.786 1730.255 1730.255 1737.102 1737.102 1747.505 + 1747.505 1758.189 1758.189 1768.058 1768.058 1770.918 + + 1672.131 1678.295 1678.295 1689.435 1689.435 1700.862 + 1700.862 1709.130 1677.652 1680.239 1680.239 1688.029 + 1688.029 1691.510 1691.510 1691.214 1691.214 1689.136 + 1689.136 1687.009 1687.009 1686.656 1714.912 1719.665 + 1719.665 1721.045 1721.045 1721.406 1721.406 1720.458 + 1720.458 1718.166 1718.166 1725.185 1725.185 1736.905 + 1736.905 1747.035 1747.035 1756.344 1756.344 1759.245 + + 1672.131 1678.295 1678.295 1689.435 1689.435 1700.862 + 1700.862 1709.130 1677.652 1680.239 1680.239 1688.029 + 1688.029 1691.510 1691.510 1691.214 1691.214 1689.136 + 1689.136 1687.009 1687.009 1686.656 1686.656 1687.997 + 1719.665 1721.045 1721.045 1721.406 1721.406 1720.458 + 1720.458 1718.166 1718.166 1725.185 1725.185 1736.905 + 1736.905 1747.035 1747.035 1756.344 1756.344 1759.245 + + 1674.608 1676.434 1676.434 1687.038 1687.038 1698.796 + 1698.796 1705.914 1672.474 1675.606 1675.606 1680.147 + 1680.147 1682.909 1682.909 1684.574 1684.574 1679.609 + 1679.609 1678.295 1678.295 1677.088 1677.088 1677.864 + 1711.390 1712.942 1712.942 1714.106 1714.106 1712.227 + 1712.227 1711.298 1711.298 1715.858 1715.858 1728.193 + 1728.193 1740.453 1740.453 1748.702 1748.702 1751.350 + + 1674.608 1676.434 1676.434 1687.038 1687.038 1698.796 + 1698.796 1705.914 1672.474 1675.606 1675.606 1680.147 + 1680.147 1682.909 1682.909 1684.574 1684.574 1679.609 + 1679.609 1678.295 1678.295 1677.088 1677.088 1677.864 + 1711.390 1712.942 1712.942 1714.106 1714.106 1712.227 + 1712.227 1711.298 1711.298 1715.858 1715.858 1728.193 + 1728.193 1740.453 1740.453 1748.702 1748.702 1751.350 + + 1675.909 1671.835 1671.835 1683.252 1683.252 1694.132 + 1694.132 1699.930 1665.189 1668.376 1668.376 1668.792 + 1668.792 1669.077 1669.077 1669.151 1669.151 1664.571 + 1664.571 1665.695 1665.695 1663.281 1663.281 1666.041 + 1704.879 1706.463 1706.463 1707.388 1707.388 1707.461 + 1707.461 1708.316 1708.316 1711.190 1711.190 1719.418 + 1719.418 1735.045 1735.045 1743.294 1743.294 1745.858 + + 1675.909 1671.835 1671.835 1683.252 1683.252 1694.132 + 1694.132 1699.930 1665.189 1668.376 1668.376 1668.792 + 1668.792 1669.077 1669.077 1669.151 1669.151 1664.571 + 1664.571 1665.695 1665.695 1663.281 1663.281 1666.041 + 1704.879 1706.463 1706.463 1707.388 1707.388 1707.461 + 1707.461 1708.316 1708.316 1711.190 1711.190 1719.418 + 1719.418 1735.045 1735.045 1743.294 1743.294 1745.858 + + 1673.768 1668.032 1668.032 1678.613 1678.613 1689.507 + 1689.507 1695.432 1655.718 1657.041 1657.041 1653.612 + 1653.612 1656.343 1656.343 1655.560 1655.560 1653.190 + 1653.190 1653.564 1653.564 1651.708 1651.708 1655.633 + 1700.342 1702.234 1702.234 1703.869 1703.869 1706.213 + 1706.213 1708.026 1708.026 1707.755 1707.755 1717.602 + 1717.602 1729.443 1729.443 1740.295 1740.295 1743.175 + + 1673.768 1668.032 1668.032 1678.613 1678.613 1689.507 + 1689.507 1695.432 1655.718 1657.041 1657.041 1653.612 + 1653.612 1656.343 1656.343 1655.560 1655.560 1653.190 + 1653.190 1653.564 1653.564 1651.708 1651.708 1655.633 + 1700.342 1702.234 1702.234 1703.869 1703.869 1706.213 + 1706.213 1708.026 1708.026 1707.755 1707.755 1717.602 + 1717.602 1729.443 1729.443 1740.295 1740.295 1743.175 + + 1674.190 1668.718 1668.718 1675.712 1675.712 1685.391 + 1685.391 1692.656 1648.188 1647.529 1647.529 1644.651 + 1644.651 1645.523 1645.523 1645.834 1645.834 1647.152 + 1647.152 1647.332 1647.332 1646.494 1646.494 1649.311 + 1697.746 1699.737 1699.737 1702.187 1702.187 1705.115 + 1705.115 1708.678 1708.678 1708.609 1708.609 1721.484 + 1721.484 1731.621 1731.621 1741.151 1741.151 1743.857 + + 1674.190 1668.718 1668.718 1675.712 1675.712 1685.391 + 1685.391 1692.656 1648.188 1647.529 1647.529 1644.651 + 1644.651 1645.523 1645.523 1645.834 1645.834 1647.152 + 1647.152 1647.332 1647.332 1646.494 1646.494 1649.311 + 1649.311 1654.487 1699.737 1702.187 1702.187 1705.115 + 1705.115 1708.678 1708.678 1708.609 1708.609 1721.484 + 1721.484 1731.621 1731.621 1741.151 1741.151 1743.857 + + 1676.661 1670.842 1670.842 1674.327 1674.327 1681.355 + 1681.355 1688.812 1644.041 1644.154 1644.154 1638.682 + 1638.682 1637.876 1637.876 1641.878 1641.878 1644.442 + 1644.442 1644.441 1644.441 1642.823 1642.823 1644.646 + 1644.646 1649.323 1699.097 1702.212 1702.212 1707.455 + 1707.455 1713.381 1713.381 1714.567 1714.567 1727.060 + 1727.060 1735.786 1735.786 1744.005 1744.005 1746.384 + + 1676.661 1670.842 1670.842 1674.327 1674.327 1681.355 + 1681.355 1688.812 1644.041 1644.154 1644.154 1638.682 + 1638.682 1637.876 1637.876 1641.878 1641.878 1644.442 + 1644.442 1644.441 1644.441 1642.823 1642.823 1644.646 + 1644.646 1649.323 1699.097 1702.212 1702.212 1707.455 + 1707.455 1713.381 1713.381 1714.567 1714.567 1727.060 + 1727.060 1735.786 1735.786 1744.005 1744.005 1746.384 + + 1680.377 1673.791 1673.791 1671.953 1671.953 1677.094 + 1677.094 1684.961 1639.391 1640.054 1640.054 1632.961 + 1632.961 1633.227 1633.227 1637.933 1637.933 1640.999 + 1640.999 1640.961 1640.961 1639.090 1639.090 1641.279 + 1641.279 1646.168 1700.605 1703.908 1703.908 1712.455 + 1712.455 1718.142 1718.142 1721.938 1721.938 1733.428 + 1733.428 1741.867 1741.867 1748.048 1748.048 1749.992 + + 1680.377 1673.791 1673.791 1671.953 1671.953 1677.094 + 1677.094 1684.961 1639.391 1640.054 1640.054 1632.961 + 1632.961 1633.227 1633.227 1637.933 1637.933 1640.999 + 1640.999 1640.961 1640.961 1639.090 1639.090 1641.279 + 1641.279 1646.168 1700.605 1703.908 1703.908 1712.455 + 1712.455 1718.142 1718.142 1721.938 1721.938 1733.428 + 1733.428 1741.867 1741.867 1748.048 1748.048 1749.992 + + 1684.480 1680.655 1680.655 1672.477 1672.477 1675.766 + 1675.766 1681.490 1631.952 1632.879 1632.879 1628.234 + 1628.234 1628.084 1628.084 1633.140 1633.140 1637.295 + 1637.295 1638.015 1638.015 1637.154 1637.154 1640.634 + 1640.634 1646.191 1706.037 1710.427 1710.427 1721.025 + 1721.025 1724.400 1724.400 1730.057 1730.057 1741.646 + 1741.646 1747.414 1747.414 1752.550 1752.550 1754.909 + + 1684.480 1680.655 1680.655 1672.477 1672.477 1675.766 + 1675.766 1681.490 1679.531 1685.967 1632.879 1628.234 + 1628.234 1628.084 1628.084 1633.140 1633.140 1637.295 + 1637.295 1638.015 1638.015 1637.154 1637.154 1640.634 + 1640.634 1646.191 1706.037 1710.427 1710.427 1721.025 + 1721.025 1724.400 1724.400 1730.057 1730.057 1741.646 + 1741.646 1747.414 1747.414 1752.550 1752.550 1754.909 + + 1688.794 1687.780 1687.780 1680.326 1680.326 1678.442 + 1678.442 1681.090 1671.003 1673.443 1622.187 1620.846 + 1620.846 1622.967 1622.967 1627.503 1627.503 1633.293 + 1633.293 1635.159 1635.159 1638.975 1638.975 1643.872 + 1643.872 1649.261 1714.039 1720.913 1720.913 1730.550 + 1730.550 1734.266 1734.266 1737.415 1737.415 1747.757 + 1747.757 1755.235 1755.235 1760.971 1760.971 1762.780 + + 1688.794 1687.780 1687.780 1680.326 1680.326 1678.442 + 1678.442 1681.090 1671.003 1673.443 1622.187 1620.846 + 1620.846 1622.967 1622.967 1627.503 1627.503 1633.293 + 1633.293 1635.159 1635.159 1638.975 1638.975 1643.872 + 1643.872 1649.261 1714.039 1720.913 1720.913 1730.550 + 1730.550 1734.266 1734.266 1737.415 1737.415 1747.757 + 1747.757 1755.235 1755.235 1760.971 1760.971 1762.780 + + 1693.381 1693.548 1693.548 1690.154 1690.154 1685.998 + 1685.998 1684.800 1663.047 1661.978 1611.904 1612.321 + 1612.321 1616.322 1616.322 1621.835 1621.835 1630.799 + 1630.799 1634.887 1634.887 1643.189 1643.189 1647.713 + 1647.713 1653.457 1720.519 1728.450 1728.450 1737.973 + 1737.973 1740.897 1740.897 1743.767 1743.767 1753.131 + 1753.131 1760.368 1760.368 1770.001 1770.001 1771.560 + + 1693.381 1693.548 1693.548 1690.154 1690.154 1685.998 + 1685.998 1684.800 1663.047 1661.978 1661.978 1662.727 + 1612.321 1616.322 1616.322 1621.835 1621.835 1630.799 + 1630.799 1634.887 1634.887 1643.189 1643.189 1647.713 + 1647.713 1653.457 1720.519 1728.450 1728.450 1737.973 + 1737.973 1740.897 1740.897 1743.767 1743.767 1753.131 + 1753.131 1760.368 1760.368 1770.001 1770.001 1771.560 + + 1699.429 1699.591 1699.591 1697.688 1697.688 1695.506 + 1695.506 1691.949 1655.641 1653.403 1653.403 1652.011 + 1602.823 1606.711 1606.711 1619.189 1619.189 1630.334 + 1630.334 1639.524 1639.524 1648.766 1648.766 1651.447 + 1651.447 1657.180 1724.147 1733.203 1733.203 1741.015 + 1741.015 1744.887 1744.887 1749.352 1749.352 1760.505 + 1760.505 1774.627 1774.627 1781.255 1781.255 1781.770 + + 1699.429 1699.591 1699.591 1697.688 1697.688 1695.506 + 1695.506 1691.949 1655.641 1653.403 1653.403 1652.011 + 1602.823 1606.711 1606.711 1619.189 1619.189 1630.334 + 1630.334 1639.524 1639.524 1648.766 1648.766 1651.447 + 1651.447 1657.180 1724.147 1733.203 1733.203 1741.015 + 1741.015 1744.887 1744.887 1749.352 1749.352 1760.505 + 1760.505 1774.627 1774.627 1781.255 1781.255 1781.770 + + 1702.294 1702.292 1702.292 1702.401 1702.401 1702.686 + 1702.686 1698.967 1649.686 1647.995 1647.995 1645.417 + 1596.874 1598.917 1598.917 1612.898 1612.898 1631.721 + 1631.721 1645.023 1645.023 1651.282 1651.282 1654.397 + 1654.397 1659.681 1723.391 1731.282 1731.282 1740.304 + 1740.304 1746.079 1746.079 1751.245 1751.245 1771.546 + 1771.546 1790.428 1790.428 1789.135 1789.135 1788.685 + + 1702.294 1702.292 1702.292 1702.401 1702.401 1702.686 + 1702.686 1698.967 1649.686 1647.995 1647.995 1645.417 + 1645.417 1645.382 1598.917 1612.898 1612.898 1631.721 + 1631.721 1645.023 1645.023 1651.282 1651.282 1654.397 + 1654.397 1659.681 1659.681 1665.324 1731.282 1740.304 + 1740.304 1746.079 1746.079 1751.245 1751.245 1771.546 + 1771.546 1790.428 1790.428 1789.135 1789.135 1788.685 + + 1706.667 1704.904 1704.904 1706.058 1706.058 1706.533 + 1706.533 1703.110 1646.355 1645.671 1645.671 1642.708 + 1642.708 1639.600 1594.915 1606.780 1606.780 1633.074 + 1633.074 1644.824 1644.824 1651.032 1651.032 1655.875 + 1655.875 1661.629 1661.629 1667.765 1725.957 1735.854 + 1735.854 1745.113 1745.113 1751.654 1751.654 1771.803 + 1771.803 1787.386 1787.386 1787.857 1787.857 1787.706 + + 1706.667 1704.904 1704.904 1706.058 1706.058 1706.533 + 1706.533 1703.110 1646.355 1645.671 1645.671 1642.708 + 1642.708 1639.600 1594.915 1606.780 1606.780 1633.074 + 1633.074 1644.824 1644.824 1651.032 1651.032 1655.875 + 1655.875 1661.629 1661.629 1667.765 1725.957 1735.854 + 1735.854 1745.113 1745.113 1751.654 1751.654 1771.803 + 1771.803 1787.386 1787.386 1787.857 1787.857 1787.706 + + 1709.631 1705.435 1705.435 1704.925 1704.925 1706.133 + 1706.133 1704.361 1645.975 1646.351 1646.351 1645.573 + 1645.573 1639.115 1591.966 1598.160 1598.160 1616.944 + 1616.944 1635.794 1635.794 1648.736 1648.736 1656.520 + 1656.520 1662.539 1662.539 1669.380 1720.474 1728.409 + 1728.409 1743.006 1743.006 1754.629 1754.629 1768.571 + 1768.571 1776.478 1776.478 1780.725 1780.725 1781.211 + + 1709.631 1705.435 1705.435 1704.925 1704.925 1706.133 + 1706.133 1704.361 1645.975 1646.351 1646.351 1645.573 + 1645.573 1639.115 1639.115 1645.708 1598.160 1616.944 + 1616.944 1635.794 1635.794 1648.736 1648.736 1656.520 + 1656.520 1662.539 1662.539 1669.380 1720.474 1728.409 + 1728.409 1743.006 1743.006 1754.629 1754.629 1768.571 + 1768.571 1776.478 1776.478 1780.725 1780.725 1781.211 + + 1709.403 1703.137 1703.137 1704.131 1704.131 1705.613 + 1705.613 1704.240 1648.406 1650.850 1650.850 1653.824 + 1653.824 1646.431 1646.431 1646.793 1595.167 1607.911 + 1607.911 1626.195 1626.195 1643.306 1643.306 1657.128 + 1657.128 1663.309 1663.309 1670.084 1717.686 1725.866 + 1725.866 1742.076 1742.076 1749.289 1749.289 1759.180 + 1759.180 1767.399 1767.399 1772.419 1772.419 1773.234 + + 1709.403 1703.137 1703.137 1704.131 1704.131 1705.613 + 1705.613 1704.240 1648.406 1650.850 1650.850 1653.824 + 1653.824 1646.431 1646.431 1646.793 1595.167 1607.911 + 1607.911 1626.195 1626.195 1643.306 1643.306 1657.128 + 1657.128 1663.309 1663.309 1670.084 1717.686 1725.866 + 1725.866 1742.076 1742.076 1749.289 1749.289 1759.180 + 1759.180 1767.399 1767.399 1772.419 1772.419 1773.234 + + 1706.053 1700.478 1700.478 1703.967 1703.967 1704.329 + 1704.329 1702.625 1652.462 1657.790 1657.790 1665.938 + 1665.938 1661.037 1661.037 1648.475 1598.484 1607.975 + 1607.975 1621.085 1621.085 1638.621 1638.621 1656.464 + 1656.464 1664.011 1664.011 1670.029 1715.742 1722.922 + 1722.922 1736.556 1736.556 1740.739 1740.739 1749.874 + 1749.874 1758.620 1758.620 1763.860 1763.860 1764.739 + + 1706.053 1700.478 1700.478 1703.967 1703.967 1704.329 + 1704.329 1702.625 1702.625 1702.066 1657.790 1665.938 + 1665.938 1661.037 1661.037 1648.475 1598.484 1607.975 + 1607.975 1621.085 1621.085 1638.621 1638.621 1656.464 + 1656.464 1664.011 1664.011 1670.029 1715.742 1722.922 + 1722.922 1736.556 1736.556 1740.739 1740.739 1749.874 + 1749.874 1758.620 1758.620 1763.860 1763.860 1764.739 + + 1706.027 1700.936 1700.936 1704.401 1704.401 1703.915 + 1703.915 1702.082 1702.082 1703.649 1662.623 1670.935 + 1670.935 1671.243 1671.243 1657.370 1603.373 1611.709 + 1611.709 1619.672 1619.672 1633.741 1633.741 1654.400 + 1654.400 1665.655 1665.655 1667.628 1713.354 1720.509 + 1720.509 1729.380 1729.380 1737.368 1737.368 1743.761 + 1743.761 1749.799 1749.799 1754.298 1754.298 1755.102 + + 1706.027 1700.936 1700.936 1704.401 1704.401 1703.915 + 1703.915 1702.082 1702.082 1703.649 1703.649 1703.204 + 1670.935 1671.243 1671.243 1657.370 1657.370 1663.086 + 1611.709 1619.672 1619.672 1633.741 1633.741 1654.400 + 1654.400 1665.655 1665.655 1667.628 1667.628 1673.510 + 1720.509 1729.380 1729.380 1737.368 1737.368 1743.761 + 1743.761 1749.799 1749.799 1754.298 1754.298 1755.102 + + 1707.069 1702.630 1702.630 1703.901 1703.901 1703.472 + 1703.472 1702.808 1702.808 1704.007 1704.007 1703.637 + 1668.356 1667.398 1667.398 1663.409 1663.409 1666.120 + 1611.546 1616.850 1616.850 1627.183 1627.183 1649.746 + 1649.746 1662.700 1662.700 1665.280 1665.280 1669.372 + 1716.654 1724.382 1724.382 1730.858 1730.858 1735.620 + 1735.620 1739.623 1739.623 1743.782 1743.782 1744.864 + + 1717.820 1712.158 1702.630 1703.901 1703.901 1703.472 + 1703.472 1702.808 1702.808 1704.007 1704.007 1703.637 + 1703.637 1702.213 1667.398 1663.409 1663.409 1666.120 + 1611.546 1616.850 1616.850 1627.183 1627.183 1649.746 + 1649.746 1662.700 1662.700 1665.280 1665.280 1669.372 + 1669.372 1677.905 1724.382 1730.858 1730.858 1735.620 + 1735.620 1739.623 1739.623 1743.782 1743.782 1744.864 + + 1721.268 1713.497 1702.856 1702.301 1702.301 1701.720 + 1701.720 1702.159 1702.159 1703.399 1703.399 1703.964 + 1703.964 1702.915 1664.951 1664.822 1664.822 1667.738 + 1610.308 1613.847 1613.847 1620.211 1620.211 1639.927 + 1639.927 1653.514 1653.514 1660.958 1660.958 1665.842 + 1665.842 1674.834 1713.765 1717.942 1717.942 1722.453 + 1722.453 1727.079 1727.079 1735.359 1735.359 1738.000 + + 1721.268 1713.497 1713.497 1710.066 1702.301 1701.720 + 1701.720 1702.159 1702.159 1703.399 1703.399 1703.964 + 1703.964 1702.915 1702.915 1697.605 1664.822 1667.738 + 1667.738 1675.334 1613.847 1620.211 1620.211 1639.927 + 1639.927 1653.514 1653.514 1660.958 1660.958 1665.842 + 1665.842 1674.834 1674.834 1687.783 1717.942 1722.453 + 1722.453 1727.079 1727.079 1735.359 1735.359 1738.000 + + 1725.104 1715.571 1715.571 1712.078 1701.249 1700.889 + 1700.889 1702.007 1702.007 1703.110 1703.110 1703.276 + 1703.276 1701.772 1701.772 1695.909 1665.434 1668.478 + 1668.478 1674.351 1615.871 1624.271 1624.271 1636.942 + 1636.942 1646.586 1646.586 1652.737 1652.737 1662.214 + 1662.214 1671.847 1671.847 1686.266 1698.040 1706.688 + 1706.688 1718.896 1718.896 1730.140 1730.140 1733.361 + + 1725.104 1715.571 1715.571 1712.078 1712.078 1709.172 + 1700.889 1702.007 1702.007 1703.110 1703.110 1703.276 + 1703.276 1701.772 1701.772 1695.909 1695.909 1688.492 + 1688.492 1683.778 1683.778 1684.663 1624.271 1636.942 + 1636.942 1646.586 1646.586 1652.737 1652.737 1662.214 + 1662.214 1671.847 1671.847 1686.266 1698.040 1706.688 + 1706.688 1718.896 1718.896 1730.140 1730.140 1733.361 + + 1729.797 1720.230 1720.230 1714.585 1714.585 1710.941 + 1698.308 1698.129 1698.129 1700.380 1700.380 1701.962 + 1701.962 1698.857 1698.857 1691.547 1691.547 1685.120 + 1685.120 1682.409 1682.409 1680.470 1629.595 1637.890 + 1637.890 1644.426 1644.426 1650.436 1650.436 1657.558 + 1657.558 1668.067 1668.067 1681.158 1681.158 1695.534 + 1695.534 1712.351 1712.351 1725.582 1725.582 1729.453 + + 1729.797 1720.230 1720.230 1714.585 1714.585 1710.941 + 1710.941 1709.026 1698.129 1700.380 1700.380 1701.962 + 1701.962 1698.857 1698.857 1691.547 1691.547 1685.120 + 1685.120 1682.409 1682.409 1680.470 1680.470 1684.273 + 1637.890 1644.426 1644.426 1650.436 1650.436 1657.558 + 1657.558 1668.067 1668.067 1681.158 1681.158 1695.534 + 1695.534 1712.351 1712.351 1725.582 1725.582 1729.453 + + 1733.003 1723.740 1723.740 1717.338 1717.338 1713.098 + 1713.098 1711.417 1694.966 1696.205 1696.205 1696.624 + 1696.624 1691.350 1691.350 1682.318 1682.318 1680.426 + 1680.426 1681.196 1681.196 1680.496 1680.496 1680.649 + 1641.198 1646.867 1646.867 1653.385 1653.385 1658.643 + 1658.643 1669.342 1669.342 1680.359 1680.359 1692.311 + 1692.311 1709.907 1709.907 1723.571 1723.571 1727.735 + + 1733.003 1723.740 1723.740 1717.338 1717.338 1713.098 + 1713.098 1711.417 1694.966 1696.205 1696.205 1696.624 + 1696.624 1691.350 1691.350 1682.318 1682.318 1680.426 + 1680.426 1681.196 1681.196 1680.496 1680.496 1680.649 + 1680.649 1686.351 1646.867 1653.385 1653.385 1658.643 + 1658.643 1669.342 1669.342 1680.359 1680.359 1692.311 + 1692.311 1709.907 1709.907 1723.571 1723.571 1727.735 + + 1736.413 1728.125 1728.125 1721.021 1721.021 1715.527 + 1715.527 1716.104 1692.431 1691.372 1691.372 1688.576 + 1688.576 1681.087 1681.087 1672.794 1672.794 1675.102 + 1675.102 1678.760 1678.760 1680.152 1680.152 1681.008 + 1681.008 1685.358 1652.109 1657.424 1657.424 1664.157 + 1664.157 1676.440 1676.440 1688.613 1688.613 1696.910 + 1696.910 1711.841 1711.841 1724.726 1724.726 1728.799 + + 1671.817 1678.040 1678.040 1692.020 1692.020 1705.033 + 1705.033 1714.014 1684.233 1686.669 1686.669 1694.117 + 1694.117 1697.670 1697.670 1694.568 1694.568 1692.069 + 1692.069 1693.781 1693.781 1696.134 1727.270 1731.843 + 1731.843 1730.469 1730.469 1734.056 1734.056 1734.013 + 1734.013 1732.557 1732.557 1739.149 1739.149 1749.205 + 1749.205 1760.561 1760.561 1770.941 1770.941 1773.635 + + 1674.232 1680.479 1680.479 1691.588 1691.588 1702.970 + 1702.970 1711.116 1679.696 1682.266 1682.266 1690.120 + 1690.120 1693.576 1693.576 1693.285 1693.285 1691.208 + 1691.208 1689.104 1689.104 1688.831 1718.700 1722.476 + 1722.476 1723.244 1723.244 1723.652 1723.652 1722.633 + 1722.633 1720.525 1720.525 1727.643 1727.643 1739.266 + 1739.266 1749.370 1749.370 1758.919 1758.919 1761.639 + 1674.232 1680.479 1680.479 1691.588 1691.588 1702.970 + 1702.970 1711.116 1679.696 1682.266 1682.266 1690.120 + 1690.120 1693.576 1693.576 1693.285 1693.285 1691.208 + 1691.208 1689.104 1689.104 1688.831 1688.831 1690.182 + 1722.476 1723.244 1723.244 1723.652 1723.652 1722.633 + 1722.633 1720.525 1720.525 1727.643 1727.643 1739.266 + 1739.266 1749.370 1749.370 1758.919 1758.919 1761.639 + + 1676.627 1678.507 1678.507 1689.149 1689.149 1700.906 + 1700.906 1707.774 1674.630 1677.677 1677.677 1682.233 + 1682.233 1684.994 1684.994 1686.617 1686.617 1681.657 + 1681.657 1680.438 1680.438 1679.251 1679.251 1680.063 + 1714.286 1715.267 1715.267 1716.356 1716.356 1714.430 + 1714.430 1713.750 1713.750 1718.312 1718.312 1730.467 + 1730.467 1742.647 1742.647 1750.938 1750.938 1753.405 + 1676.627 1678.507 1678.507 1689.149 1689.149 1700.906 + 1700.906 1707.774 1674.630 1677.677 1677.677 1682.233 + 1682.233 1684.994 1684.994 1686.617 1686.617 1681.657 + 1681.657 1680.438 1680.438 1679.251 1679.251 1680.063 + 1714.286 1715.267 1715.267 1716.356 1716.356 1714.430 + 1714.430 1713.750 1713.750 1718.312 1718.312 1730.467 + 1730.467 1742.647 1742.647 1750.938 1750.938 1753.405 + + 1677.737 1673.840 1673.840 1685.343 1685.343 1696.038 + 1696.038 1701.035 1667.394 1670.531 1670.531 1670.832 + 1670.832 1671.188 1671.188 1671.199 1671.199 1666.676 + 1666.676 1667.831 1667.831 1665.465 1665.465 1668.293 + 1707.785 1708.800 1708.800 1709.652 1709.652 1709.704 + 1709.704 1710.607 1710.607 1713.663 1713.663 1721.990 + 1721.990 1737.153 1737.153 1745.140 1745.140 1747.554 + 1677.737 1673.840 1673.840 1685.343 1685.343 1696.038 + 1696.038 1701.035 1667.394 1670.531 1670.531 1670.832 + 1670.832 1671.188 1671.188 1671.199 1671.199 1666.676 + 1666.676 1667.831 1667.831 1665.465 1665.465 1668.293 + 1707.785 1708.800 1708.800 1709.652 1709.652 1709.704 + 1709.704 1710.607 1710.607 1713.663 1713.663 1721.990 + 1721.990 1737.153 1737.153 1745.140 1745.140 1747.554 + + 1675.558 1669.982 1669.982 1680.656 1680.656 1691.455 + 1691.455 1696.599 1657.725 1659.094 1659.094 1655.668 + 1655.668 1658.528 1658.528 1657.630 1657.630 1655.325 + 1655.325 1655.675 1655.675 1653.859 1653.859 1657.889 + 1703.222 1704.615 1704.615 1706.090 1706.090 1708.549 + 1708.549 1710.240 1710.240 1710.192 1710.192 1720.070 + 1720.070 1731.145 1731.145 1741.812 1741.812 1744.615 + 1675.558 1669.982 1669.982 1680.656 1680.656 1691.455 + 1691.455 1696.599 1657.725 1659.094 1659.094 1655.668 + 1655.668 1658.528 1658.528 1657.630 1657.630 1655.325 + 1655.325 1655.675 1655.675 1653.859 1653.859 1657.889 + 1703.222 1704.615 1704.615 1706.090 1706.090 1708.549 + 1708.549 1710.240 1710.240 1710.192 1710.192 1720.070 + 1720.070 1731.145 1731.145 1741.812 1741.812 1744.615 + + 1676.141 1670.698 1670.698 1677.723 1677.723 1687.396 + 1687.396 1694.328 1650.184 1649.575 1649.575 1646.691 + 1646.691 1647.711 1647.711 1647.968 1647.968 1649.322 + 1649.322 1649.458 1649.458 1648.656 1648.656 1651.552 + 1700.518 1702.108 1702.108 1704.382 1704.382 1707.428 + 1707.428 1710.974 1710.974 1711.012 1711.012 1724.064 + 1724.064 1733.465 1733.465 1742.670 1742.670 1745.296 + 1676.141 1670.698 1670.698 1677.723 1677.723 1687.396 + 1687.396 1694.328 1650.184 1649.575 1649.575 1646.691 + 1646.691 1647.711 1647.711 1647.968 1647.968 1649.322 + 1649.322 1649.458 1649.458 1648.656 1648.656 1651.552 + 1651.552 1656.767 1702.108 1704.382 1704.382 1707.428 + 1707.428 1710.974 1710.974 1711.012 1711.012 1724.064 + 1724.064 1733.465 1733.465 1742.670 1742.670 1745.296 + + 1678.699 1672.832 1672.832 1676.278 1676.278 1683.298 + 1683.298 1690.589 1646.294 1646.383 1646.383 1640.692 + 1640.692 1640.123 1640.123 1644.071 1644.071 1646.650 + 1646.650 1646.560 1646.560 1644.988 1644.988 1646.877 + 1646.877 1651.603 1701.377 1704.386 1704.386 1709.850 + 1709.850 1715.687 1715.687 1716.915 1716.915 1729.630 + 1729.630 1737.891 1737.891 1745.729 1745.729 1747.959 + 1678.699 1672.832 1672.832 1676.278 1676.278 1683.298 + 1683.298 1690.589 1646.294 1646.383 1646.383 1640.692 + 1640.692 1640.123 1640.123 1644.071 1644.071 1646.650 + 1646.650 1646.560 1646.560 1644.988 1644.988 1646.877 + 1646.877 1651.603 1701.377 1704.386 1704.386 1709.850 + 1709.850 1715.687 1715.687 1716.915 1716.915 1729.630 + 1729.630 1737.891 1737.891 1745.729 1745.729 1747.959 + + 1682.434 1675.944 1675.944 1673.855 1673.855 1678.920 + 1678.920 1686.825 1641.656 1642.277 1642.277 1634.961 + 1634.961 1635.509 1635.509 1640.204 1640.204 1643.238 + 1643.238 1643.068 1643.068 1641.206 1641.206 1643.526 + 1643.526 1648.452 1702.848 1706.184 1706.184 1714.846 + 1714.846 1720.526 1720.526 1724.369 1724.369 1736.070 + 1736.070 1744.190 1744.190 1749.824 1749.824 1751.594 + 1682.434 1675.944 1675.944 1673.855 1673.855 1678.920 + 1678.920 1686.825 1641.656 1642.277 1642.277 1634.961 + 1634.961 1635.509 1635.509 1640.204 1640.204 1643.238 + 1643.238 1643.068 1643.068 1641.206 1641.206 1643.526 + 1643.526 1648.452 1702.848 1706.184 1706.184 1714.846 + 1714.846 1720.526 1720.526 1724.369 1724.369 1736.070 + 1736.070 1744.190 1744.190 1749.824 1749.824 1751.594 + + 1686.515 1683.102 1683.102 1674.541 1674.541 1677.506 + 1677.506 1683.366 1634.170 1635.175 1635.175 1630.317 + 1630.317 1630.335 1630.335 1635.485 1635.485 1639.579 + 1639.579 1640.410 1640.410 1639.434 1639.434 1642.876 + 1642.876 1648.464 1708.424 1712.933 1712.933 1723.461 + 1723.461 1726.808 1726.808 1732.458 1732.458 1744.265 + 1744.265 1749.632 1749.632 1754.250 1754.250 1756.547 + 1686.515 1683.102 1683.102 1674.541 1674.541 1677.506 + 1677.506 1683.366 1681.453 1687.436 1635.175 1630.317 + 1630.317 1630.335 1630.335 1635.485 1635.485 1639.579 + 1639.579 1640.410 1640.410 1639.434 1639.434 1642.876 + 1642.876 1648.464 1708.424 1712.933 1712.933 1723.461 + 1723.461 1726.808 1726.808 1732.458 1732.458 1744.265 + 1744.265 1749.632 1749.632 1754.250 1754.250 1756.547 + + 1690.624 1690.058 1690.058 1682.758 1682.758 1680.328 + 1680.328 1682.942 1672.868 1675.115 1624.389 1622.957 + 1622.957 1625.251 1625.251 1629.896 1629.896 1635.557 + 1635.557 1637.442 1637.442 1641.264 1641.264 1646.124 + 1646.124 1651.523 1716.878 1724.416 1724.416 1732.935 + 1732.935 1736.642 1736.642 1739.772 1739.772 1750.318 + 1750.318 1757.822 1757.822 1763.219 1763.219 1764.826 + 1690.624 1690.058 1690.058 1682.758 1682.758 1680.328 + 1680.328 1682.942 1672.868 1675.115 1624.389 1622.957 + 1622.957 1625.251 1625.251 1629.896 1629.896 1635.557 + 1635.557 1637.442 1637.442 1641.264 1641.264 1646.124 + 1646.124 1651.523 1716.878 1724.416 1724.416 1732.935 + 1732.935 1736.642 1736.642 1739.772 1739.772 1750.318 + 1750.318 1757.822 1757.822 1763.219 1763.219 1764.826 + + 1695.107 1695.649 1695.649 1692.343 1692.343 1688.031 + 1688.031 1686.707 1665.022 1663.975 1614.047 1614.500 + 1614.500 1618.609 1618.609 1624.143 1624.143 1633.037 + 1633.037 1637.223 1637.223 1645.431 1645.431 1650.038 + 1650.038 1655.731 1722.987 1731.236 1731.236 1740.399 + 1740.399 1743.263 1743.263 1746.160 1746.160 1755.534 + 1755.534 1761.940 1761.940 1772.131 1772.131 1773.545 + 1695.107 1695.649 1695.649 1692.343 1692.343 1688.031 + 1688.031 1686.707 1665.022 1663.975 1663.975 1664.705 + 1614.500 1618.609 1618.609 1624.143 1624.143 1633.037 + 1633.037 1637.223 1637.223 1645.431 1645.431 1650.038 + 1650.038 1655.731 1722.987 1731.236 1731.236 1740.399 + 1740.399 1743.263 1743.263 1746.160 1746.160 1755.534 + 1755.534 1761.940 1761.940 1772.131 1772.131 1773.545 + + 1701.193 1701.666 1701.666 1699.706 1699.706 1697.627 + 1697.627 1694.030 1657.888 1655.951 1655.951 1654.657 + 1604.949 1609.016 1609.016 1621.558 1621.558 1632.657 + 1632.657 1641.977 1641.977 1650.921 1650.921 1653.781 + 1653.781 1659.472 1726.220 1735.539 1735.539 1743.479 + 1743.479 1747.262 1747.262 1751.819 1751.819 1763.154 + 1763.154 1775.791 1775.791 1782.751 1782.751 1783.341 + 1701.193 1701.666 1701.666 1699.706 1699.706 1697.627 + 1697.627 1694.030 1657.888 1655.951 1655.951 1654.657 + 1604.949 1609.016 1609.016 1621.558 1621.558 1632.657 + 1632.657 1641.977 1641.977 1650.921 1650.921 1653.781 + 1653.781 1659.472 1726.220 1735.539 1735.539 1743.479 + 1743.479 1747.262 1747.262 1751.819 1751.819 1763.154 + 1763.154 1775.791 1775.791 1782.751 1782.751 1783.341 + + 1704.102 1704.334 1704.334 1704.246 1704.246 1704.837 + 1704.837 1701.198 1652.139 1651.060 1651.060 1648.561 + 1598.971 1601.073 1601.073 1615.245 1615.245 1634.084 + 1634.084 1647.423 1647.423 1653.513 1653.513 1656.700 + 1656.700 1661.979 1725.306 1733.545 1733.545 1742.786 + 1742.786 1748.501 1748.501 1753.752 1753.752 1774.534 + 1774.534 1792.457 1792.457 1790.652 1790.652 1790.200 + 1704.102 1704.334 1704.334 1704.246 1704.246 1704.837 + 1704.837 1701.198 1652.139 1651.060 1651.060 1648.561 + 1648.561 1648.182 1601.073 1615.245 1615.245 1634.084 + 1634.084 1647.423 1647.423 1653.513 1653.513 1656.700 + 1656.700 1661.979 1661.979 1667.647 1733.545 1742.786 + 1742.786 1748.501 1748.501 1753.752 1753.752 1774.534 + 1774.534 1792.457 1792.457 1790.652 1790.652 1790.200 + + 1708.603 1706.936 1706.936 1707.906 1707.906 1708.670 + 1708.670 1705.401 1648.607 1648.333 1648.333 1645.308 + 1645.308 1641.984 1597.053 1609.125 1609.125 1635.563 + 1635.563 1647.234 1647.234 1653.348 1653.348 1658.203 + 1658.203 1663.946 1663.946 1670.096 1728.200 1738.367 + 1738.367 1747.562 1747.562 1754.211 1754.211 1773.429 + 1773.429 1788.933 1788.933 1789.365 1789.365 1789.218 + 1708.603 1706.936 1706.936 1707.906 1707.906 1708.670 + 1708.670 1705.401 1648.607 1648.333 1648.333 1645.308 + 1645.308 1641.984 1597.053 1609.125 1609.125 1635.563 + 1635.563 1647.234 1647.234 1653.348 1653.348 1658.203 + 1658.203 1663.946 1663.946 1670.096 1728.200 1738.367 + 1738.367 1747.562 1747.562 1754.211 1754.211 1773.429 + 1773.429 1788.933 1788.933 1789.365 1789.365 1789.218 + + 1711.737 1707.586 1707.586 1706.817 1706.817 1708.211 + 1708.211 1706.624 1647.799 1648.307 1648.307 1647.747 + 1647.747 1641.382 1594.104 1600.424 1600.424 1619.408 + 1619.408 1638.362 1638.362 1651.195 1651.195 1658.893 + 1658.893 1664.878 1664.878 1671.735 1723.016 1730.912 + 1730.912 1745.592 1745.592 1757.155 1757.155 1770.403 + 1770.403 1777.895 1777.895 1782.183 1782.183 1782.668 + 1711.737 1707.586 1707.586 1706.817 1706.817 1708.211 + 1708.211 1706.624 1647.799 1648.307 1648.307 1647.747 + 1647.747 1641.382 1641.382 1648.587 1600.424 1619.408 + 1619.408 1638.362 1638.362 1651.195 1651.195 1658.893 + 1658.893 1664.878 1664.878 1671.735 1723.016 1730.912 + 1730.912 1745.592 1745.592 1757.155 1757.155 1770.403 + 1770.403 1777.895 1777.895 1782.183 1782.183 1782.668 + + 1711.582 1705.244 1705.244 1706.016 1706.016 1707.675 + 1707.675 1706.459 1650.069 1652.701 1652.701 1655.967 + 1655.967 1648.644 1648.644 1649.317 1597.360 1610.281 + 1610.281 1628.660 1628.660 1645.909 1645.909 1659.596 + 1659.596 1665.676 1665.676 1672.477 1720.736 1728.835 + 1728.835 1744.684 1744.684 1751.288 1751.288 1760.879 + 1760.879 1768.919 1768.919 1773.908 1773.908 1774.697 + 1711.582 1705.244 1705.244 1706.016 1706.016 1707.675 + 1707.675 1706.459 1650.069 1652.701 1652.701 1655.967 + 1655.967 1648.644 1648.644 1649.317 1597.360 1610.281 + 1610.281 1628.660 1628.660 1645.909 1645.909 1659.596 + 1659.596 1665.676 1665.676 1672.477 1720.736 1728.835 + 1728.835 1744.684 1744.684 1751.288 1751.288 1760.879 + 1760.879 1768.919 1768.919 1773.908 1773.908 1774.697 + + 1708.292 1702.493 1702.493 1705.870 1705.870 1706.459 + 1706.459 1704.805 1654.169 1659.777 1659.777 1668.308 + 1668.308 1663.518 1663.518 1650.850 1600.701 1610.328 + 1610.328 1623.420 1623.420 1641.306 1641.306 1658.994 + 1658.994 1666.412 1666.412 1672.449 1718.476 1725.778 + 1725.778 1739.041 1739.041 1742.437 1742.437 1751.489 + 1751.489 1760.212 1760.212 1765.421 1765.421 1766.267 + 1708.292 1702.493 1702.493 1705.870 1705.870 1706.459 + 1706.459 1704.805 1704.805 1704.287 1659.777 1668.308 + 1668.308 1663.518 1663.518 1650.850 1600.701 1610.328 + 1610.328 1623.420 1623.420 1641.306 1641.306 1658.994 + 1658.994 1666.412 1666.412 1672.449 1718.476 1725.778 + 1725.778 1739.041 1739.041 1742.437 1742.437 1751.489 + 1751.489 1760.212 1760.212 1765.421 1765.421 1766.267 + + 1708.162 1703.028 1703.028 1706.390 1706.390 1706.098 + 1706.098 1704.178 1704.178 1705.853 1664.991 1674.075 + 1674.075 1674.026 1674.026 1659.577 1605.618 1614.066 + 1614.066 1621.941 1621.941 1636.442 1636.442 1657.014 + 1657.014 1668.025 1668.025 1669.955 1715.301 1722.864 + 1722.864 1731.793 1731.793 1739.499 1739.499 1745.560 + 1745.560 1751.454 1751.454 1755.962 1755.962 1756.752 + 1708.162 1703.028 1703.028 1706.390 1706.390 1706.098 + 1706.098 1704.178 1704.178 1705.853 1705.853 1705.594 + 1674.075 1674.026 1674.026 1659.577 1659.577 1665.856 + 1614.066 1621.941 1621.941 1636.442 1636.442 1657.014 + 1657.014 1668.025 1668.025 1669.955 1669.955 1675.864 + 1722.864 1731.793 1731.793 1739.499 1739.499 1745.560 + 1745.560 1751.454 1751.454 1755.962 1755.962 1756.752 + + 1709.116 1704.693 1704.693 1705.998 1705.998 1705.583 + 1705.583 1704.849 1704.849 1706.121 1706.121 1705.906 + 1671.227 1669.849 1669.849 1665.522 1665.522 1668.613 + 1613.782 1619.124 1619.124 1629.795 1629.795 1652.423 + 1652.423 1665.129 1665.129 1667.581 1667.581 1671.709 + 1718.599 1726.537 1726.537 1732.915 1732.915 1737.468 + 1737.468 1741.324 1741.324 1745.366 1745.366 1746.364 + 1719.902 1714.353 1704.693 1705.998 1705.998 1705.583 + 1705.583 1704.849 1704.849 1706.121 1706.121 1705.906 + 1705.906 1704.743 1669.849 1665.522 1665.522 1668.613 + 1613.782 1619.124 1619.124 1629.795 1629.795 1652.423 + 1652.423 1665.129 1665.129 1667.581 1667.581 1671.709 + 1671.709 1680.222 1726.537 1732.915 1732.915 1737.468 + 1737.468 1741.324 1741.324 1745.366 1745.366 1746.364 + + 1723.293 1715.664 1704.858 1704.384 1704.384 1703.832 + 1703.832 1704.250 1704.250 1705.589 1705.589 1706.162 + 1706.162 1705.276 1667.010 1666.763 1666.763 1669.997 + 1612.466 1616.072 1616.072 1622.716 1622.716 1642.604 + 1642.604 1655.953 1655.953 1663.395 1663.395 1668.194 + 1668.194 1677.129 1715.600 1719.648 1719.648 1724.078 + 1724.078 1728.712 1728.712 1737.064 1737.064 1739.612 + 1723.293 1715.664 1715.664 1712.350 1704.384 1703.832 + 1703.832 1704.250 1704.250 1705.589 1705.589 1706.162 + 1706.162 1705.276 1705.276 1700.095 1666.763 1669.997 + 1669.997 1678.431 1616.072 1622.716 1622.716 1642.604 + 1642.604 1655.953 1655.953 1663.395 1663.395 1668.194 + 1668.194 1677.129 1677.129 1689.952 1719.648 1724.078 + 1724.078 1728.712 1728.712 1737.064 1737.064 1739.612 + + 1727.039 1717.624 1717.624 1714.281 1703.311 1703.032 + 1703.032 1704.086 1704.086 1705.221 1705.221 1705.422 + 1705.422 1704.000 1704.000 1698.177 1667.216 1670.473 + 1670.473 1676.769 1618.136 1626.764 1626.764 1639.452 + 1639.452 1648.971 1648.971 1655.173 1655.173 1664.609 + 1664.609 1674.197 1674.197 1688.440 1699.215 1707.921 + 1707.921 1720.338 1720.338 1731.728 1731.728 1734.882 + 1727.039 1717.624 1717.624 1714.281 1714.281 1711.527 + 1703.032 1704.086 1704.086 1705.221 1705.221 1705.422 + 1705.422 1704.000 1704.000 1698.177 1698.177 1690.760 + 1690.760 1686.093 1686.093 1687.836 1626.764 1639.452 + 1639.452 1648.971 1648.971 1655.173 1655.173 1664.609 + 1664.609 1674.197 1674.197 1688.440 1699.215 1707.921 + 1707.921 1720.338 1720.338 1731.728 1731.728 1734.882 + + 1731.709 1722.229 1722.229 1716.680 1716.680 1713.139 + 1700.453 1700.312 1700.312 1702.502 1702.502 1704.086 + 1704.086 1701.003 1701.003 1693.624 1693.624 1687.258 + 1687.258 1684.631 1684.631 1682.792 1631.954 1640.327 + 1640.327 1646.845 1646.845 1652.881 1652.881 1659.982 + 1659.982 1670.519 1670.519 1682.938 1682.938 1696.840 + 1696.840 1713.762 1713.762 1727.142 1727.142 1730.948 + 1731.709 1722.229 1722.229 1716.680 1716.680 1713.139 + 1713.139 1711.321 1700.312 1702.502 1702.502 1704.086 + 1704.086 1701.003 1701.003 1693.624 1693.624 1687.258 + 1687.258 1684.631 1684.631 1682.792 1682.792 1687.351 + 1640.327 1646.845 1646.845 1652.881 1652.881 1659.982 + 1659.982 1670.519 1670.519 1682.938 1682.938 1696.840 + 1696.840 1713.762 1713.762 1727.142 1727.142 1730.948 + + 1734.921 1725.728 1725.728 1719.408 1719.408 1715.159 + 1715.159 1713.550 1697.167 1698.393 1698.393 1698.762 + 1698.762 1693.461 1693.461 1684.317 1684.317 1682.542 + 1682.542 1683.414 1683.414 1682.833 1682.833 1683.238 + 1643.530 1649.327 1649.327 1655.849 1655.849 1661.073 + 1661.073 1671.810 1671.810 1682.213 1682.213 1693.810 + 1693.810 1711.485 1711.485 1725.239 1725.239 1729.341 + 1734.921 1725.728 1725.728 1719.408 1719.408 1715.159 + 1715.159 1713.550 1697.167 1698.393 1698.393 1698.762 + 1698.762 1693.461 1693.461 1684.317 1684.317 1682.542 + 1682.542 1683.414 1683.414 1682.833 1682.833 1683.238 + 1683.238 1689.433 1649.327 1655.849 1655.849 1661.073 + 1661.073 1671.810 1671.810 1682.213 1682.213 1693.810 + 1693.810 1711.485 1711.485 1725.239 1725.239 1729.341 + + 1738.386 1730.114 1730.114 1723.050 1723.050 1717.660 + 1717.660 1718.261 1694.528 1693.523 1693.523 1690.724 + 1690.724 1683.271 1683.271 1675.008 1675.008 1677.293 + 1677.293 1681.001 1681.001 1682.522 1682.522 1683.408 + 1683.408 1687.938 1654.502 1659.937 1659.937 1666.661 + 1666.661 1678.900 1678.900 1690.839 1690.839 1698.707 + 1698.707 1713.599 1713.599 1726.542 1726.542 1730.560 + / + +ACTNUM + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 + / + + +PORO + 0.229940221 0.267998725 0.267248809 0.248628706 0.143597484 + 0.255403936 0.241247088 0.202536285 0.178439736 0.169216886 + 0.0982395038 0.0871957541 0.0865337029 0.107181571 0.13336657 + 0.161255434 0.168142647 0.12688145 0.113884196 0.136451781 + 0.138114989 + 0.146246627 0.199171573 0.266344577 0.286972582 0.19861117 + 0.257348835 0.213223591 0.180872083 0.210870296 0.170497045 + 0.136767447 0.0810357258 0.107368678 0.155616283 0.14580673 + 0.135529056 0.157622293 0.11565271 0.101070121 0.117347546 + 0.139478564 + 0.144413173 0.173310563 0.266815841 0.274327785 0.249854431 + 0.293836355 0.267580926 0.229756817 0.240291253 0.260497063 + 0.237370268 0.159807071 0.12409845 0.115811057 0.141394496 + 0.138055041 0.145110786 0.103658095 0.115213126 0.124877639 + 0.178335458 + 0.144999087 0.236096784 0.214335382 0.239713237 0.193644553 + 0.223109826 0.240559489 0.222534299 0.230322435 0.289834648 + 0.269424736 0.253971785 0.159066439 0.155727848 0.163981721 + 0.150358692 0.126402572 0.107977577 0.120768279 0.12578702 + 0.134366184 + 0.139521748 0.194816291 0.186731875 0.206017941 0.202324077 + 0.221504539 0.254400045 0.223717526 0.21260789 0.236891344 + 0.199681625 0.198608875 0.123896994 0.177039579 0.18100597 + 0.133546561 0.0987016484 0.117163442 0.152237266 0.167804644 + 0.117253132 + 0.158086658 0.144946709 0.143900141 0.206936404 0.186858371 + 0.159792259 0.230321661 0.225240335 0.213980049 0.219359979 + 0.216880798 0.161908463 0.118558735 0.168100119 0.186450154 + 0.222405031 0.141248018 0.101568557 0.142537892 0.137308076 + 0.116498321 + 0.200058401 0.175189748 0.186828569 0.138688311 0.197277665 + 0.166283369 0.217172101 0.19390434 0.216278836 0.27409336 + 0.2028974 0.182854712 0.155228361 0.224978268 0.207565978 + 0.186744258 0.247286141 0.174632937 0.137903631 0.110938713 + 0.100070193 + 0.242533594 0.240334466 0.218663573 0.150863528 0.203530282 + 0.159409523 0.239764929 0.209446371 0.1898458 0.233483478 + 0.234625489 0.28340444 0.216584042 0.246336192 0.224939927 + 0.222856089 0.189212039 0.233025253 0.187184066 0.138786241 + 0.115021236 + 0.172556192 0.237236038 0.241921887 0.10108833 0.0920402184 + 0.17088531 0.220863298 0.248289675 0.222283125 0.216538861 + 0.25096184 0.257102758 0.205967009 0.253440738 0.254770964 + 0.254264414 0.222589195 0.227451414 0.232065216 0.278775424 + 0.232808664 + 0.124841161 0.202946857 0.188675895 0.109380931 0.185112581 + 0.135648191 0.203870207 0.218498006 0.220042735 0.208298504 + 0.225811005 0.224556446 0.154417202 0.159527197 0.174213976 + 0.248272344 0.208881184 0.258149177 0.242371336 0.256111324 + 0.236820027 + 0.149272606 0.171654746 0.142364874 0.103071421 0.180135831 + 0.126250729 0.163724631 0.192238033 0.234448537 0.215475261 + 0.236926883 0.180477023 0.197252706 0.122187451 0.199655041 + 0.179115862 0.205140531 0.182230696 0.243805766 0.245093927 + 0.243570432 + 0.128820047 0.168925643 0.101318978 0.169160604 0.18925193 + 0.216487512 0.137998879 0.193242684 0.227902636 0.18427588 + 0.192191422 0.190014929 0.240206599 0.0973144248 0.189076275 + 0.166016236 0.169541821 0.178028166 0.23724106 0.244640499 + 0.223170653 + 0.173159316 0.185363546 0.0901296884 0.201661557 0.178241268 + 0.271255314 0.188630834 0.166669324 0.19461301 0.250898451 + 0.162233576 0.189325526 0.235711768 0.133954659 0.221117884 + 0.186039358 0.1601661 0.231653184 0.194678351 0.22836259 + 0.245286092 + 0.230598629 0.184620753 0.168428048 0.223263204 0.133346885 + 0.125810027 0.175248057 0.161777213 0.219358861 0.202357411 + 0.164064214 0.208044618 0.228575498 0.171921402 0.216024369 + 0.210855514 0.209493965 0.232678786 0.272622555 0.226885304 + 0.272860467 + 0.229822144 0.243480235 0.262057424 0.225065097 0.118302718 + 0.118143089 0.15561755 0.208963469 0.186493814 0.19152762 + 0.186380237 0.187102661 0.216551051 0.16938816 0.124966845 + 0.230070114 0.237208858 0.253087997 0.270973325 0.235473499 + 0.24545449 + 0.231182188 0.263062507 0.253549308 0.241588742 0.14308925 + 0.122885548 0.22368829 0.186786503 0.164872825 0.194761142 + 0.182154775 0.214734465 0.186476842 0.162608445 0.141745791 + 0.206136778 0.255170792 0.224818304 0.234645754 0.230492204 + 0.230053321 + 0.253192544 0.262421519 0.218057811 0.242757991 0.249162987 + 0.209877819 0.194810495 0.206500009 0.194116786 0.213043153 + 0.108364463 0.135424003 0.153867021 0.171340615 0.178496912 + 0.242739394 0.261794567 0.265701205 0.266720295 0.279927939 + 0.266438365 + 0.192478374 0.23223041 0.221885532 0.246293038 0.268321931 + 0.229108229 0.16912888 0.239621073 0.264496833 0.215008721 + 0.111121923 0.0772074759 0.126015827 0.151893646 0.155445233 + 0.168954685 0.224461898 0.220288172 0.237845063 0.208361864 + 0.195891991 + 0.238893479 0.213597387 0.269703507 0.234719694 0.19847022 + 0.241223574 0.217774928 0.235030308 0.279066831 0.166010156 + 0.204891279 0.0791963041 0.0942570046 0.145670488 0.123015821 + 0.124738321 0.170467243 0.137566775 0.135291889 0.202850655 + 0.192714378 + 0.244212702 0.225200519 0.277058512 0.171257824 0.178433925 + 0.196497336 0.268791437 0.250689894 0.294964343 0.216693252 + 0.216688424 0.139462069 0.12234693 0.140480772 0.105237253 + 0.124066681 0.201106474 0.124487303 0.12793918 0.122628503 + 0.154396519 + 0.261786371 0.22380285 0.159346402 0.174233288 0.184203207 + 0.226689875 0.245244727 0.276751041 0.280829787 0.214566752 + 0.118098155 0.225009531 0.195177853 0.125835046 0.140658647 + 0.145529479 0.149591357 0.154375032 0.147005394 0.160148606 + 0.150159553 + 0.260596305 0.25170821 0.230320141 0.155535266 0.207000807 + 0.225304633 0.271710068 0.22991243 0.22200039 0.257043332 + 0.24938108 0.232326135 0.197146058 0.179260075 0.151140377 + 0.117109738 0.104907177 0.122990884 0.13621743 0.133799121 + 0.13145344 + 0.248775467 0.231094465 0.220493332 0.191456318 0.221687883 + 0.203384548 0.265438497 0.199216828 0.193624958 0.318142861 + 0.305641145 0.236164436 0.158320218 0.215711966 0.18063511 + 0.138738051 0.108826622 0.100443386 0.102853626 0.0984655842 + 0.103461258 + 0.230844289 0.285821289 0.258913189 0.251104385 0.170183018 + 0.267424077 0.29344818 0.214835107 0.137934849 0.0921188965 + 0.0817626268 0.0971920565 0.0636389479 0.0993561819 0.111339577 + 0.102804288 0.13612169 0.146638989 0.163211942 0.160316691 + 0.20267494 + 0.199560612 0.217767626 0.252259225 0.244089589 0.138802961 + 0.210999906 0.221277535 0.193365648 0.215832815 0.182753354 + 0.131769761 0.0751013234 0.0570229404 0.0721002594 0.102762699 + 0.100975394 0.112365969 0.110328935 0.11594484 0.149427906 + 0.212369129 + 0.198849529 0.245790586 0.294659466 0.310281724 0.186356291 + 0.253269285 0.252451986 0.233533427 0.219037786 0.198271424 + 0.240363643 0.179324895 0.0732234567 0.0595173091 0.100327052 + 0.11632441 0.134406194 0.116204374 0.133695006 0.142799005 + 0.186615303 + 0.201432422 0.202482596 0.256080359 0.208842918 0.190122068 + 0.240490958 0.281650275 0.226747423 0.215700686 0.231127769 + 0.251222134 0.232962683 0.119154945 0.172972962 0.117123127 + 0.141379774 0.141176298 0.126815975 0.111115552 0.141618043 + 0.168098405 + 0.162043333 0.117157213 0.16607444 0.149171516 0.1803969 + 0.219185069 0.289682776 0.256946743 0.242250144 0.224451512 + 0.200789526 0.193718836 0.0730071366 0.186951563 0.195565104 + 0.189077452 0.125800908 0.11530152 0.126658306 0.155500159 + 0.152544335 + 0.10519848 0.047697857 0.0667984709 0.142820626 0.193468854 + 0.200289875 0.209699333 0.261633635 0.229406863 0.234922126 + 0.223054618 0.141943932 0.129320249 0.176790893 0.226707667 + 0.245476767 0.218586579 0.111120835 0.138323069 0.135812789 + 0.151941478 + 0.145429388 0.0863501281 0.0809599385 0.131026164 0.225034103 + 0.152755439 0.132948101 0.180570617 0.202886805 0.280746043 + 0.205712855 0.164045855 0.161114693 0.219814211 0.200634718 + 0.223180473 0.279812783 0.211011216 0.151771665 0.120214291 + 0.156556278 + 0.215027526 0.131311268 0.0578942858 0.0767374411 0.193674877 + 0.160537601 0.0910323337 0.0848343968 0.115333639 0.199848443 + 0.248171657 0.267047971 0.297727197 0.232757613 0.22687909 + 0.246228397 0.222256839 0.271432191 0.23810482 0.21442616 + 0.231227383 + 0.0681064948 0.156076372 0.0925739482 0.0616491213 0.0921015516 + 0.122203514 0.0802426189 0.0609156899 0.0471780337 0.0676336065 + 0.197532177 0.233166158 0.192841947 0.245137334 0.277688891 + 0.28617987 0.192387104 0.224513024 0.21828264 0.24536483 + 0.292037517 + 0.0510617904 0.0432443172 0.0373735316 0.115972519 0.120877817 + 0.142957211 0.0956872329 0.0900979564 0.0634529367 0.0642250031 + 0.0875246748 0.128710628 0.168121427 0.110408768 0.254204839 + 0.231175065 0.210472509 0.205839232 0.216667369 0.222554207 + 0.21476388 + 0.093954809 0.0814876258 0.0653602779 0.121728703 0.201948568 + 0.127315432 0.131542936 0.0623207986 0.0844121352 0.108661488 + 0.119797282 0.131484807 0.165310979 0.105429977 0.172789484 + 0.225269794 0.239842921 0.250955999 0.248463809 0.202766106 + 0.211989939 + 0.16610688 0.134584025 0.115818702 0.189092666 0.264294654 + 0.122525066 0.112179555 0.0793469697 0.0444174372 0.0898106024 + 0.129055262 0.114305913 0.149886817 0.135486528 0.101099685 + 0.134492889 0.210214034 0.227194741 0.22701855 0.234885991 + 0.197585493 + 0.252922177 0.19060187 0.175401866 0.203052536 0.17248252 + 0.150311366 0.151973635 0.0913800821 0.0284533817 0.0497757047 + 0.0745541826 0.0656116977 0.0870487019 0.180693969 0.127713665 + 0.145821527 0.167875126 0.14303425 0.20715642 0.178916007 + 0.220655456 + 0.278520405 0.247466728 0.203768477 0.238123894 0.0869364962 + 0.0965126976 0.169973329 0.100590326 0.0560868233 0.0584836639 + 0.0759168193 0.0412321091 0.0299652368 0.170666799 0.143719956 + 0.152601704 0.150694385 0.108854875 0.151212722 0.151762486 + 0.21545063 + 0.246401802 0.244309053 0.273843765 0.227716655 0.14314501 + 0.0887482539 0.111775532 0.158953592 0.111215584 0.0686122552 + 0.0605456755 0.055425752 0.0607642531 0.0913742408 0.0960547328 + 0.126124054 0.136425272 0.085229896 0.0808650628 0.0884426236 + 0.169643357 + 0.240207225 0.228853583 0.258042306 0.204142898 0.103659056 + 0.215803131 0.163597077 0.218097508 0.125492886 0.0958268121 + 0.0665225908 0.0814562961 0.105195381 0.134122178 0.138158038 + 0.111875422 0.120415181 0.0571169332 0.0424202979 0.0982794762 + 0.128758401 + 0.192941219 0.255699486 0.230531678 0.242741361 0.271772206 + 0.21262081 0.21984458 0.178289443 0.152032539 0.122185014 + 0.0734772682 0.0700467825 0.0957908779 0.107531793 0.143482894 + 0.108468309 0.108569928 0.0807050541 0.0524444431 0.102711394 + 0.16513592 + 0.143405646 0.196285099 0.277143419 0.280219972 0.243102834 + 0.159598127 0.205473632 0.226104841 0.210211948 0.14538385 + 0.0736651048 0.11178378 0.138004035 0.15518859 0.120166346 + 0.208420575 0.113143027 0.0877557918 0.0465200916 0.105155788 + 0.151919335 + 0.215375647 0.208356306 0.263645023 0.244222015 0.22470513 + 0.228770867 0.173504487 0.247721016 0.259180009 0.18321611 + 0.100105353 0.0876482651 0.144565314 0.132175371 0.123009205 + 0.152892977 0.150785491 0.116906963 0.0687697977 0.0584720075 + 0.128592134 + 0.178471178 0.222198263 0.181740433 0.207483411 0.177134469 + 0.225615069 0.275914907 0.214149654 0.289489478 0.144104078 + 0.21121946 0.102580428 0.134344444 0.132738546 0.126009196 + 0.145140588 0.103913017 0.108974539 0.0523183458 0.055238571 + 0.0848988816 + 0.17611523 0.216191664 0.203214705 0.141073138 0.186637893 + 0.254982054 0.264429003 0.22038649 0.26432994 0.23330377 + 0.103535734 0.188396811 0.106355458 0.105373465 0.117247246 + 0.107083157 0.0991833434 0.165084437 0.0817408189 0.0803333148 + 0.0853061825 + 0.139867976 0.155352548 0.129101112 0.183719382 0.221201003 + 0.274311215 0.287034124 0.252393723 0.209061742 0.256611735 + 0.217160851 0.112099729 0.178679198 0.0866121724 0.0934977755 + 0.0864847973 0.0991601869 0.10340935 0.122215256 0.102985486 + 0.0877567604 + 0.0548003986 0.0680188388 0.113877699 0.167472616 0.227391571 + 0.152621061 0.134298116 0.185479283 0.20575805 0.240904167 + 0.249192223 0.198876426 0.148103029 0.186794534 0.140010387 + 0.119307563 0.120640047 0.0957880244 0.0842565671 0.112260424 + 0.111610807 + 0.213721171 0.244074732 0.251235068 0.239086822 0.164847374 + 0.244731173 0.304056108 0.168734327 0.0555765182 0.023578167 + 0.0539240837 0.0702948421 0.065382272 0.095515281 0.118976191 + 0.156519577 0.199381858 0.241307721 0.251562804 0.225722194 + 0.236065194 + 0.147657976 0.150257915 0.179238558 0.199167982 0.180314839 + 0.176722527 0.207991481 0.245740965 0.172134727 0.0858699307 + 0.0275565423 0.0440560058 0.0488587134 0.0747773647 0.120484032 + 0.1873831 0.17512989 0.168752238 0.165974736 0.179572076 + 0.219922647 + 0.153471172 0.120175116 0.154493198 0.239642248 0.22025162 + 0.211115718 0.251281828 0.236905426 0.238521516 0.251291156 + 0.208075404 0.165433452 0.0625433251 0.0832351148 0.141846403 + 0.198613167 0.20284386 0.142956376 0.154242277 0.18398805 + 0.178052038 + 0.149035528 0.127261624 0.0820803121 0.166760445 0.22648643 + 0.211839423 0.253588557 0.261604667 0.243709072 0.253797144 + 0.27910766 0.246880084 0.0778390765 0.140753135 0.199798048 + 0.219817698 0.213678271 0.148562118 0.13215436 0.130388245 + 0.1433357 + 0.155559704 0.111412883 0.0846145824 0.124087006 0.140707269 + 0.163934708 0.260604024 0.317255527 0.262775511 0.280509233 + 0.238786697 0.242413893 0.13364011 0.22728987 0.216809317 + 0.202909514 0.181649014 0.14555259 0.139607877 0.117276318 + 0.109058231 + 0.151065648 0.067917116 0.052957423 0.0850711167 0.094746016 + 0.0790700167 0.071919255 0.229891062 0.283746988 0.290624946 + 0.238523796 0.172463983 0.176756784 0.198659226 0.192549109 + 0.236134425 0.181963921 0.153722644 0.134090304 0.125590116 + 0.126314387 + 0.165622875 0.0947936475 0.0452772379 0.0645587295 0.117725395 + 0.049690675 0.061367359 0.0347331092 0.156970263 0.25015676 + 0.224901453 0.195582032 0.217464626 0.23206535 0.193593755 + 0.209689245 0.284818769 0.251078397 0.23688449 0.173560932 + 0.120852679 + 0.188191578 0.136791393 0.0782048404 0.0341281332 0.201948658 + 0.0421606041 0.0374904647 0.0221722275 0.0440405495 0.0505559035 + 0.165999636 0.249287203 0.236784056 0.227436408 0.180840284 + 0.248104796 0.242742643 0.292829782 0.237388685 0.259663373 + 0.203684777 + 0.0766112655 0.107710704 0.142939404 0.0579387285 0.0783685744 + 0.096083127 0.0407804772 0.0144004868 0.00900315307 0.023384342 + 0.0584801696 0.0896352604 0.192685515 0.205701947 0.199973807 + 0.236908928 0.235003054 0.263554871 0.197641075 0.230388895 + 0.273269832 + 0.148272261 0.0395626388 0.0731006414 0.115098119 0.0641010702 + 0.139417663 0.0548795797 0.0369402282 0.0152622554 0.0456140079 + 0.0631483719 0.0846269652 0.130089924 0.138437748 0.154046834 + 0.18231988 0.210420772 0.209527567 0.18326053 0.2100894 + 0.231893748 + 0.208234549 0.193605006 0.158740178 0.0728344619 0.0622050837 + 0.0974873081 0.129954055 0.0843347833 0.0745429397 0.0967555642 + 0.116782255 0.13530314 0.146656901 0.152914286 0.113801561 + 0.154329553 0.175302953 0.204613715 0.181901038 0.196457982 + 0.218608901 + 0.301215857 0.212168917 0.211137965 0.170276731 0.0815485865 + 0.0370631889 0.104987547 0.067937009 0.079712078 0.0715773404 + 0.105145551 0.117547624 0.122207291 0.103771672 0.0937532037 + 0.132968783 0.130943164 0.142734841 0.14797844 0.118668385 + 0.131926373 + 0.30281654 0.208076298 0.215065554 0.219722077 0.0997186527 + 0.0910810009 0.201955527 0.0775660053 0.050702475 0.0447340496 + 0.0668695047 0.0698676333 0.112255573 0.211080015 0.111810274 + 0.128364012 0.130984828 0.139649495 0.15967223 0.106987275 + 0.116226748 + 0.258920312 0.198679626 0.199646041 0.223474324 0.0830505416 + 0.0929034874 0.193476886 0.126496181 0.0557367392 0.0371412337 + 0.0553047955 0.0506750233 0.0643121526 0.0964563116 0.114300005 + 0.122465588 0.128731802 0.130370617 0.131948918 0.0831526518 + 0.0866813138 + 0.211815238 0.212657392 0.267463952 0.223610699 0.115845658 + 0.148185551 0.184589863 0.155774772 0.107521154 0.0780101418 + 0.0462572873 0.0300790649 0.0343017541 0.0816418454 0.0894981325 + 0.0948411003 0.0947894379 0.0416767821 0.0441529229 0.0531881563 + 0.0557974987 + 0.224674955 0.200492352 0.20437786 0.201012269 0.114706807 + 0.17824623 0.323539555 0.256586283 0.161946669 0.142294109 + 0.131537691 0.0686896518 0.0350905694 0.0579959899 0.0762755275 + 0.0756459609 0.0519335531 0.0156334024 0.0256979857 0.0181377865 + 0.0210749879 + 0.192601621 0.25002408 0.225071952 0.235690475 0.271374136 + 0.264451861 0.283863008 0.23396565 0.201869041 0.159753934 + 0.216609165 0.180873632 0.0911079273 0.0680826753 0.21763891 + 0.106535748 0.0968410745 0.0303977057 0.00343991653 0.00382007845 + 0.00482154964 + 0.196960345 0.207815275 0.234657273 0.262442768 0.223060429 + 0.197306424 0.270527214 0.230822742 0.210201114 0.184877485 + 0.292915016 0.178149283 0.138372332 0.129871562 0.13778016 + 0.21236138 0.10863369 0.0471202359 0.00391537044 0.00668794662 + 0.0197085869 + 0.211646214 0.232368141 0.234434292 0.252294272 0.255695164 + 0.241915241 0.143018708 0.253084153 0.247676969 0.180715263 + 0.212302744 0.224207312 0.189486742 0.215051234 0.166942641 + 0.088092424 0.203051105 0.0396603309 0.00723771472 0.0053592287 + 0.0273439176 + 0.17667079 0.201364622 0.215619609 0.257308751 0.233439997 + 0.225255072 0.267409623 0.208758056 0.292326659 0.121027738 + 0.225818634 0.285041422 0.229841173 0.219734281 0.188686416 + 0.107672893 0.0429414399 0.12270771 0.0645658448 0.0221691169 + 0.059461534 + 0.136502787 0.193265826 0.213088512 0.229924157 0.238843173 + 0.283844411 0.250326157 0.251261055 0.286172181 0.256094605 + 0.201327547 0.198534817 0.241178036 0.236865342 0.181011781 + 0.190297931 0.0965887159 0.23797594 0.105590954 0.0622313917 + 0.0662664101 + 0.152750999 0.126404703 0.200443774 0.216371045 0.212210998 + 0.239367634 0.2595568 0.236672685 0.255243331 0.243536815 + 0.269490063 0.13711977 0.174679056 0.214220524 0.184335023 + 0.22874178 0.155588552 0.207784519 0.146511093 0.122608773 + 0.0888624489 + 0.113185868 0.104979418 0.125274763 0.240664765 0.230928823 + 0.152330115 0.1947667 0.197085723 0.227456555 0.23563455 + 0.259583324 0.264396161 0.188742191 0.179022014 0.171978161 + 0.212502524 0.183279932 0.149500698 0.147349924 0.142933726 + 0.151859015 + 0.179500535 0.218354806 0.233539537 0.183874503 0.205226615 + 0.159635365 0.129504412 0.0998168662 0.0568220392 0.053700123 + 0.0475594364 0.0940362588 0.121236101 0.137493178 0.15595226 + 0.145760298 0.114588231 0.146124527 0.240749553 0.212268263 + 0.22777237 + 0.0881088972 0.165812373 0.195335537 0.198397517 0.169211224 + 0.141815558 0.209545597 0.205546781 0.118590683 0.0440287404 + 0.045470912 0.07764934 0.129160643 0.155640215 0.165370211 + 0.145161167 0.12595506 0.132095829 0.180077329 0.205497459 + 0.237271771 + 0.1298507 0.13856627 0.151495039 0.182855785 0.190493613 + 0.177769646 0.245615795 0.314318061 0.218343154 0.177071556 + 0.110453568 0.156937137 0.0986459777 0.115324624 0.13231419 + 0.152574793 0.176281869 0.168682918 0.194890544 0.193301022 + 0.176662251 + 0.153316185 0.205546275 0.181547374 0.15248546 0.221755236 + 0.218157887 0.280644357 0.289784789 0.249419764 0.272107303 + 0.24575308 0.221429586 0.101625413 0.147718698 0.146431729 + 0.165723711 0.184810638 0.194733515 0.191272303 0.140996605 + 0.184811637 + 0.140843824 0.161101237 0.18505545 0.147271663 0.222564444 + 0.203234553 0.270048708 0.249344721 0.282377511 0.296017379 + 0.293502271 0.254259169 0.0980146453 0.11679709 0.172204614 + 0.161064744 0.152728513 0.156812936 0.126789555 0.138894752 + 0.178143531 + 0.170058906 0.133667812 0.0893988907 0.0855654255 0.102545574 + 0.0913351923 0.253819048 0.264696211 0.204204515 0.281079143 + 0.247922882 0.179544345 0.210870311 0.212406278 0.198499173 + 0.199753657 0.156227574 0.143180624 0.135104388 0.13210091 + 0.154917896 + 0.214790687 0.169479415 0.064146325 0.0284335576 0.000928084715 + 0.0548850261 0.144797534 0.224929571 0.236153677 0.251837283 + 0.225126132 0.211449429 0.199408337 0.188145936 0.209413245 + 0.243709683 0.227013841 0.155054584 0.148065418 0.149629086 + 0.11794322 + 0.0881762505 0.105586693 0.186746433 0.0285328925 0.157284722 + 0.0128941834 0.0738555044 0.168144643 0.218872339 0.214031115 + 0.20590283 0.221074119 0.239722908 0.185415342 0.205886543 + 0.20561479 0.246791989 0.247828722 0.222743958 0.135260448 + 0.130972922 + 0.0615222566 0.0403347872 0.00459774956 0.00380566064 0.103142224 + 0.093465656 0.0750747398 0.0880402476 0.154143482 0.174865618 + 0.218452632 0.254324108 0.22658816 0.187880948 0.205060691 + 0.250463158 0.275164902 0.261401296 0.168080926 0.246537596 + 0.26395762 + 0.0923408642 0.0388380475 0.0147933736 0.0129575813 0.0694402754 + 0.111461528 0.107907735 0.114403017 0.113248438 0.135977477 + 0.167027384 0.229904488 0.161888227 0.172865957 0.181341633 + 0.210339934 0.254629135 0.24491407 0.240155727 0.258175433 + 0.288575381 + 0.211040795 0.212951705 0.142824665 0.103121683 0.0794202462 + 0.098905161 0.126735479 0.122254081 0.121494807 0.111738659 + 0.171202943 0.193786398 0.135191306 0.124232516 0.200419292 + 0.231692061 0.255191535 0.220073611 0.213810116 0.212568402 + 0.228123426 + 0.325910389 0.251513869 0.22965087 0.204071447 0.0801059678 + 0.0867487639 0.106226966 0.0735328421 0.097817108 0.097177349 + 0.102503955 0.138679832 0.108305015 0.138427109 0.215094358 + 0.222688407 0.201993614 0.243368149 0.195076033 0.177143306 + 0.201247662 + 0.301065832 0.2408811 0.191965938 0.203655005 0.103367813 + 0.170898885 0.172380075 0.0848218426 0.109022178 0.111049935 + 0.109379008 0.138281673 0.117763869 0.145656183 0.207919061 + 0.192397848 0.222792685 0.234634712 0.192242205 0.208642051 + 0.221490785 + 0.217263266 0.202641785 0.183415815 0.198640451 0.113143377 + 0.111215413 0.182130992 0.112800784 0.187543422 0.145048082 + 0.129098147 0.136353433 0.126588896 0.124803707 0.206272975 + 0.225268707 0.209735632 0.207409531 0.195937574 0.196668014 + 0.189824373 + 0.243447736 0.208131045 0.21901913 0.208645985 0.122154512 + 0.220806986 0.213521719 0.182072416 0.220104501 0.261785954 + 0.192473173 0.13571009 0.113907292 0.1122825 0.129327476 + 0.186003551 0.203882053 0.1881506 0.18870081 0.197468206 + 0.23988986 + 0.216942787 0.195581988 0.185098127 0.240673915 0.181459293 + 0.227093279 0.283300132 0.197801381 0.167670503 0.251467049 + 0.258783847 0.242061555 0.180385426 0.0948037654 0.113283031 + 0.16335687 0.174883693 0.177316666 0.187077194 0.176805481 + 0.17787376 + 0.1955107 0.211546749 0.21926558 0.236033142 0.187964454 + 0.23590602 0.25973165 0.239394128 0.224343792 0.2545802 + 0.300846279 0.29140684 0.226777419 0.210861102 0.1648155 + 0.207663596 0.192570344 0.215324104 0.1833473 0.151117623 + 0.203753322 + 0.244152263 0.245216534 0.24152343 0.260589659 0.236394942 + 0.20932585 0.276995718 0.217071727 0.181938991 0.225463152 + 0.237728789 0.230454922 0.220570803 0.299633443 0.182343394 + 0.268369168 0.242061526 0.223673761 0.18603003 0.194682285 + 0.173954278 + 0.238935873 0.232141227 0.23651965 0.260486424 0.309558809 + 0.225613698 0.145800248 0.198369563 0.16963543 0.233581871 + 0.238686636 0.233945847 0.24461706 0.302768111 0.29672417 + 0.12535584 0.233478203 0.270634264 0.24560295 0.212514222 + 0.224432528 + 0.223348066 0.224695876 0.272701681 0.277768791 0.262919307 + 0.215973616 0.210137963 0.187505886 0.257390201 0.162646145 + 0.228017271 0.294056296 0.272649407 0.223541051 0.268939316 + 0.231027856 0.0966134444 0.2079698 0.246916726 0.264177263 + 0.232692316 + 0.233432025 0.235950828 0.203603938 0.249007791 0.236162171 + 0.242939323 0.247847423 0.232225761 0.245058253 0.232229725 + 0.220654443 0.231235504 0.237689257 0.23239544 0.229176119 + 0.284735233 0.202511832 0.247151256 0.225229904 0.231919363 + 0.22700654 + 0.254520178 0.248693749 0.234055012 0.158636227 0.240835741 + 0.223317251 0.235718399 0.224242479 0.251076669 0.240986481 + 0.23785165 0.180420741 0.215041161 0.181297317 0.164961576 + 0.168712839 0.220545962 0.295211494 0.339676172 0.296861738 + 0.271575332 + 0.253563523 0.26067844 0.256827623 0.257802993 0.197363853 + 0.247456372 0.278505474 0.216604427 0.235309482 0.25680995 + 0.203791514 0.186180159 0.149305984 0.188566506 0.162006423 + 0.109137826 0.101200588 0.073611103 0.176736593 0.272813171 + 0.251744688 + 0.259780526 0.198098436 0.256847769 0.133046612 0.232443839 + 0.0710672885 0.0791569203 0.107918449 0.101554401 0.092246227 + 0.10340251 0.125972196 0.164584294 0.211789608 0.19840394 + 0.203398407 0.180138186 0.20040378 0.218181401 0.21343416 + 0.206028894 + 0.213315636 0.197865441 0.2361193 0.199072748 0.190538615 + 0.0899936333 0.112831391 0.129647523 0.113883965 0.0759703666 + 0.0570441894 0.0597356595 0.163620457 0.190029249 0.174120963 + 0.204621062 0.20898512 0.245285749 0.248720333 0.234320238 + 0.207433596 + 0.203723863 0.232151777 0.231973305 0.121514276 0.173253715 + 0.18228735 0.260619074 0.24203825 0.159475848 0.0798986107 + 0.0663560405 0.133078814 0.0794218257 0.120785251 0.174830958 + 0.223522574 0.191429988 0.262879103 0.287092865 0.251687199 + 0.212954029 + 0.188628301 0.196876109 0.229211211 0.062368881 0.188341588 + 0.221407384 0.291166693 0.275645673 0.270394295 0.223780781 + 0.154164195 0.144603938 0.103506424 0.106283166 0.101215757 + 0.1609952 0.178308025 0.194665685 0.270858288 0.261839718 + 0.225720868 + 0.101052403 0.0970842093 0.150569558 0.041528929 0.140676022 + 0.129939884 0.159295052 0.181020692 0.258614719 0.323327929 + 0.304144621 0.230811402 0.123030439 0.146356165 0.130428135 + 0.150915772 0.175194174 0.224216178 0.257416487 0.261665404 + 0.282850653 + 0.0971930325 0.112002105 0.0956789628 0.0449081771 0.140900493 + 0.120961145 0.0855757222 0.0642688423 0.0924688876 0.187933624 + 0.207530707 0.165508389 0.253666133 0.241524324 0.207597807 + 0.207310095 0.165016547 0.193648413 0.218727767 0.258975178 + 0.252081335 + 0.106457502 0.0684136525 0.0662533864 0.0772418156 0.119809352 + 0.0803868324 0.0474256314 0.0732557476 0.102330633 0.115642704 + 0.154999375 0.189095065 0.22001265 0.199825063 0.228770092 + 0.314346582 0.223945513 0.186613858 0.205095917 0.197839215 + 0.228940114 + 0.0501190796 0.0474796854 0.0733628199 0.0786018968 0.112323292 + 0.0536611937 0.0617888533 0.0666537955 0.128267437 0.138116688 + 0.13567473 0.117525592 0.154613122 0.194346324 0.208448291 + 0.247783035 0.286830664 0.275116593 0.212312624 0.198756471 + 0.199547514 + 0.0141129177 0.011771651 0.048847124 0.0455498956 0.0931361392 + 0.0750368759 0.0803645849 0.0857800394 0.111809947 0.0867298692 + 0.0957790166 0.0982981101 0.149054036 0.18230173 0.21218735 + 0.299380153 0.291894555 0.313079774 0.281443715 0.278461158 + 0.29240346 + 0.0365282334 0.0336585492 0.0400246903 0.0845572501 0.0831879005 + 0.127934963 0.0892545804 0.0897731856 0.0985545143 0.0931769609 + 0.0774058625 0.0742491484 0.14913407 0.151349992 0.207626104 + 0.241671979 0.275007844 0.254148632 0.262717009 0.27559647 + 0.289468437 + 0.16830188 0.0957215652 0.0834162161 0.174115002 0.123091593 + 0.139758348 0.117104203 0.147838995 0.109752811 0.115686759 + 0.102691412 0.0778351352 0.201132625 0.179397151 0.139964014 + 0.171534956 0.204463542 0.177612215 0.222394392 0.224528357 + 0.24678871 + 0.264378995 0.270021975 0.194315687 0.22214523 0.129926071 + 0.137775242 0.147169858 0.100825198 0.100561589 0.116320066 + 0.120910734 0.101540066 0.175342366 0.186874345 0.169854507 + 0.18051742 0.168729067 0.151216045 0.14113012 0.192925781 + 0.22015357 + 0.289143533 0.252367228 0.231058508 0.192974344 0.132259712 + 0.238413602 0.103869617 0.134270862 0.178548351 0.119796515 + 0.136020049 0.127680942 0.167481512 0.158839256 0.15576297 + 0.180592358 0.185163185 0.120649762 0.154353693 0.131708547 + 0.124842077 + 0.260261327 0.183110163 0.22455211 0.188740134 0.166071907 + 0.0807873681 0.169567242 0.142011389 0.224506661 0.221533507 + 0.189868361 0.191546306 0.168320686 0.117276676 0.11958006 + 0.130691186 0.146459967 0.0850318596 0.100806676 0.103174344 + 0.0917599276 + 0.278180927 0.189976692 0.222194552 0.225238711 0.222010642 + 0.22297205 0.197985336 0.148362234 0.250319839 0.256850332 + 0.244116575 0.200697094 0.192284793 0.130115479 0.11118938 + 0.190515324 0.148208663 0.115594588 0.14585869 0.149384931 + 0.125310138 + 0.251370698 0.239812896 0.232430682 0.239755675 0.201913163 + 0.216290712 0.245245054 0.188839287 0.197357431 0.240332007 + 0.247151494 0.237174615 0.226640508 0.145796612 0.127090544 + 0.206896871 0.189792439 0.208012238 0.201194689 0.194260597 + 0.196176931 + 0.253544241 0.25365293 0.245792687 0.195067063 0.171880394 + 0.246715412 0.256478399 0.229706272 0.181244716 0.301657021 + 0.262504339 0.232592925 0.229998589 0.278311491 0.0738490894 + 0.242304578 0.298211694 0.302881926 0.280570745 0.238755703 + 0.284177274 + 0.299944639 0.243796661 0.210139588 0.205781773 0.143621668 + 0.191272333 0.236863226 0.193095401 0.147737414 0.20283699 + 0.206241652 0.243301779 0.231329143 0.265405387 0.219670072 + 0.126458824 0.310082972 0.308002383 0.238812283 0.28816694 + 0.249942705 + 0.112377346 0.220706627 0.186608061 0.19084233 0.214448184 + 0.118488275 0.166889399 0.185824379 0.165891379 0.200495735 + 0.233633026 0.220780849 0.219004512 0.284655839 0.249950275 + 0.162480339 0.251824081 0.299790353 0.221347556 0.240007266 + 0.283255875 + 0.221665025 0.110866562 0.291403443 0.259047568 0.252400935 + 0.17183201 0.110380836 0.127196893 0.196462929 0.208009675 + 0.22531496 0.255028278 0.231675506 0.24326168 0.286847502 + 0.253766298 0.154907003 0.22699672 0.257223219 0.28168118 + 0.29686603 + 0.239364758 0.287394434 0.0748710185 0.267932534 0.257309765 + 0.207526386 0.212880179 0.151164651 0.131127551 0.163245931 + 0.23258318 0.218830377 0.17920962 0.245582134 0.26487276 + 0.264255732 0.236524984 0.227328107 0.237804383 0.25281468 + 0.225645155 + 0.263660491 0.250202149 0.249735549 0.0936747193 0.226261765 + 0.190039411 0.227410898 0.161358222 0.180260882 0.17630735 + 0.163875192 0.199238151 0.229912862 0.160882637 0.140877426 + 0.206135362 0.212490141 0.228280678 0.256342024 0.29185167 + 0.236095086 + 0.268566161 0.263795763 0.25882259 0.228230059 0.274963856 + 0.222290337 0.249134898 0.191871569 0.221328869 0.20926021 + 0.177419856 0.169139177 0.197737262 0.19725506 0.0693471059 + 0.082823284 0.179755315 0.230394647 0.216247588 0.227970585 + 0.245579734 + 0.235325009 0.204685241 0.234963909 0.160227612 0.232280284 + 0.0875542387 0.0876416788 0.160113573 0.13543953 0.108505391 + 0.154109806 0.119290486 0.229216278 0.218744263 0.239890307 + 0.185305595 0.172846824 0.164812997 0.202928379 0.210606441 + 0.166635379 + 0.236135572 0.245406821 0.287303418 0.174893603 0.229678869 + 0.152485639 0.152452692 0.161376715 0.137337491 0.0876621753 + 0.0948807225 0.0828621238 0.173557431 0.220847532 0.240858778 + 0.222594589 0.190005675 0.173521355 0.206355691 0.200944617 + 0.18265681 + 0.159023941 0.190564513 0.202734649 0.150590166 0.191884175 + 0.214172438 0.24279058 0.247247085 0.179161623 0.115256809 + 0.0601500161 0.234824941 0.111492664 0.194918454 0.215421483 + 0.220847964 0.214642107 0.23798123 0.260226995 0.207987726 + 0.164832279 + 0.103229366 0.154723436 0.18615514 0.12610659 0.195478857 + 0.210901454 0.264984012 0.266977787 0.294105977 0.255978167 + 0.187917098 0.243365303 0.146516919 0.153639466 0.191139534 + 0.200094372 0.169884846 0.219461337 0.283141226 0.206264377 + 0.151345283 + 0.0868929103 0.107106902 0.133369446 0.115268052 0.178593621 + 0.197137594 0.230577484 0.209597424 0.269594431 0.288123995 + 0.30448395 0.229595482 0.14716512 0.167449713 0.219218135 + 0.19986257 0.164409101 0.232067153 0.28337878 0.243710861 + 0.1857149 + 0.0725324079 0.117818765 0.14609167 0.120934434 0.115716495 + 0.143093824 0.192758232 0.110013105 0.160338208 0.238734543 + 0.28346163 0.212607831 0.240576535 0.243350923 0.232128724 + 0.262979448 0.193927974 0.196045741 0.225436926 0.236660793 + 0.225451261 + 0.0841192529 0.0613566488 0.0925404057 0.12639755 0.185092658 + 0.106817804 0.116887495 0.0890490115 0.131795138 0.117220812 + 0.195931077 0.289725095 0.238058567 0.208952412 0.200633496 + 0.293154866 0.256491572 0.226249054 0.265847862 0.232626051 + 0.217002019 + 0.0559645332 0.0363762006 0.079194963 0.0955391452 0.163327664 + 0.0871412531 0.11866419 0.0993146375 0.127540842 0.110815965 + 0.100765549 0.203447193 0.258135051 0.18483825 0.211686701 + 0.252405435 0.307460785 0.22459881 0.211734176 0.217499837 + 0.24407573 + 0.0406427532 0.0341019072 0.0782531947 0.0914945826 0.159714848 + 0.0720206052 0.118365884 0.133380324 0.124559186 0.0881784633 + 0.081011951 0.0888733268 0.192909002 0.224391982 0.229150474 + 0.287820697 0.27288267 0.304650962 0.272851586 0.300396323 + 0.291093051 + 0.117859967 0.035821043 0.0729989111 0.146378815 0.153339222 + 0.0968655199 0.104707271 0.115940191 0.113756552 0.102357127 + 0.104000419 0.0953333527 0.185804531 0.215687513 0.285077244 + 0.321498543 0.291254699 0.240308538 0.250824273 0.309565246 + 0.283126175 + 0.217700377 0.211140692 0.184410706 0.236395746 0.156470358 + 0.153081626 0.117528014 0.123785727 0.0979793221 0.114979349 + 0.131801665 0.113399789 0.159860089 0.210681289 0.231403485 + 0.252376199 0.250282228 0.244234055 0.215356186 0.262728065 + 0.286328614 + 0.225568637 0.216556564 0.215925276 0.259461403 0.212958708 + 0.170329973 0.152717724 0.115545623 0.0880739614 0.13289924 + 0.125779957 0.128850386 0.157662675 0.191359505 0.209837228 + 0.241312116 0.231963485 0.314959198 0.263993859 0.25936836 + 0.286088198 + 0.277523577 0.169908598 0.176432177 0.19238098 0.179605365 + 0.244315267 0.132999346 0.18657425 0.0773503557 0.115998104 + 0.118099056 0.109556764 0.112161621 0.164363563 0.138360664 + 0.178561613 0.194350511 0.183940202 0.195382714 0.2291843 + 0.284896046 + 0.240487143 0.178803578 0.208965078 0.216573149 0.209084511 + 0.156002536 0.193332165 0.164449796 0.138104752 0.107572146 + 0.078917101 0.0739829987 0.081050083 0.178583309 0.0847441256 + 0.100297719 0.0664488152 0.0487063937 0.0741453692 0.187098578 + 0.239888728 + 0.267592728 0.180217266 0.202891678 0.230496794 0.228456393 + 0.237411857 0.223558798 0.11735189 0.25681746 0.24682118 + 0.143376008 0.070985496 0.0620477721 0.0903493762 0.0463481359 + 0.0325780809 0.00926639512 0.0108376164 0.0472456664 0.0664408356 + 0.151303455 + 0.25706774 0.28587693 0.268613636 0.198183432 0.201291054 + 0.251104265 0.275651723 0.223663509 0.179307133 0.260415524 + 0.26473853 0.193169102 0.168256506 0.180629149 0.0400888883 + 0.0735260993 0.0310276989 0.047731135 0.0785420984 0.119222604 + 0.165993184 + 0.100707635 0.244879007 0.291131914 0.312312156 0.243762806 + 0.283381611 0.294541121 0.250819921 0.175419152 0.263780862 + 0.230508938 0.226720035 0.247982472 0.252906531 0.0825608298 + 0.127808586 0.157218292 0.175914541 0.180170506 0.216443166 + 0.283610046 + 0.198822945 0.173533633 0.120308779 0.126232818 0.169644848 + 0.225898996 0.273503721 0.225665018 0.170026466 0.273215741 + 0.251368523 0.261227965 0.232204646 0.244762763 0.219498351 + 0.204976797 0.263047814 0.28994894 0.251981348 0.259605765 + 0.286660492 + 0.0333463028 0.1705897 0.0593073703 0.0890869945 0.101947412 + 0.132757261 0.218769133 0.253067523 0.182572424 0.243526265 + 0.241024435 0.212837934 0.255188942 0.24844268 0.255405098 + 0.241755366 0.293416083 0.289606273 0.23478429 0.297554731 + 0.304924011 + 0.0446572676 0.0623613484 0.146834582 0.0976396799 0.110805534 + 0.0946482271 0.0804123059 0.171132982 0.212956011 0.22802195 + 0.205954716 0.209147349 0.195625022 0.221874908 0.249784157 + 0.284959108 0.153586492 0.24431093 0.212053075 0.264973968 + 0.327490121 + 0.0988534614 0.098776713 0.0727757663 0.199898034 0.116230272 + 0.098279722 0.112265371 0.108340956 0.120717354 0.215955347 + 0.226751104 0.235314399 0.214943677 0.256823212 0.289969444 + 0.244702235 0.2093537 0.254879653 0.31256035 0.237223893 + 0.20387049 + 0.139298826 0.145909235 0.12150421 0.124372631 0.187882721 + 0.117532 0.104987644 0.118918329 0.138133645 0.142562851 + 0.178121716 0.205802709 0.202609211 0.28778863 0.187682122 + 0.235327229 0.312469393 0.280524164 0.266034663 0.29851681 + 0.252551138 + 0.224071994 0.198005795 0.165503278 0.109477676 0.252912402 + 0.181075722 0.131978855 0.11225567 0.112916186 0.131568551 + 0.147535905 0.15917249 0.205689251 0.222926661 0.212560952 + 0.241081446 0.216444686 0.246860996 0.285242468 0.29791081 + 0.268485755 + 0.151000157 0.142255768 0.121430695 0.0340536349 0.224034354 + 0.0890732333 0.0634098798 0.0915687159 0.100214615 0.0327576362 + 0.0709960163 0.0932066217 0.127520129 0.125957936 0.13272059 + 0.144718289 0.125800669 0.120075032 0.125604168 0.117473818 + 0.0925026163 + 0.0895670652 0.127102807 0.198803708 0.0984849632 0.22176674 + 0.110273436 0.0640301853 0.10513474 0.10643021 0.0499081165 + 0.0738753155 0.151706591 0.122352883 0.144815162 0.159588426 + 0.162506342 0.158837289 0.155204833 0.14099513 0.127172306 + 0.0885632634 + 0.0470332801 0.101496063 0.217549413 0.15424189 0.217923686 + 0.180778012 0.153559148 0.140551642 0.0994326025 0.08838889 + 0.0918927789 0.11741098 0.148269281 0.150793925 0.162767231 + 0.187240273 0.196677282 0.188822433 0.173698485 0.121462695 + 0.0868685097 + 0.0489975922 0.108347125 0.15460977 0.190665051 0.212307125 + 0.215355888 0.204977766 0.175043941 0.143002763 0.110723548 + 0.072818391 0.152648747 0.162151501 0.110244021 0.148730516 + 0.181701258 0.195531264 0.205921531 0.171281487 0.105023138 + 0.108555436 + 0.0687101856 0.0999948606 0.168273747 0.176869228 0.223778307 + 0.206700742 0.25327757 0.231183052 0.183550119 0.169669852 + 0.11656151 0.189583614 0.1451924 0.108360305 0.150690854 + 0.154213682 0.112026408 0.146178991 0.139110953 0.128183097 + 0.141612619 + 0.0783903301 0.138214543 0.174939096 0.20661059 0.164514422 + 0.169286594 0.210733727 0.195041612 0.169092521 0.201920912 + 0.21337004 0.210151985 0.249872714 0.163164139 0.184468955 + 0.170510247 0.161775216 0.229372874 0.213889167 0.228307441 + 0.21455799 + 0.125453815 0.165194273 0.138678625 0.131058753 0.154589131 + 0.181424201 0.153750822 0.151842535 0.217654049 0.240031973 + 0.2962749 0.291608542 0.279761463 0.159503594 0.199898422 + 0.270761818 0.275768429 0.235563055 0.197305486 0.176917076 + 0.217115581 + 0.150126204 0.149823099 0.107447445 0.134893537 0.202029362 + 0.14247781 0.133981481 0.144096807 0.152123556 0.194534153 + 0.290056258 0.271810949 0.245993301 0.173447475 0.203559518 + 0.235589802 0.293905735 0.246281907 0.228832901 0.218463272 + 0.218576014 + 0.11032185 0.0968892425 0.0916784406 0.139324337 0.181872457 + 0.126226246 0.12460041 0.130268365 0.137153581 0.126937538 + 0.105852559 0.213176161 0.244922131 0.191254765 0.219579056 + 0.244786695 0.220979214 0.259198874 0.295143604 0.310205877 + 0.296871811 + 0.186971381 0.122104339 0.0779388696 0.154483125 0.119942039 + 0.137317657 0.121707901 0.138163194 0.142508581 0.135154724 + 0.125236914 0.109932229 0.135002047 0.141032681 0.252745211 + 0.251118004 0.247638837 0.214409605 0.213568613 0.261661589 + 0.271067679 + 0.252973467 0.238540709 0.216046885 0.237519041 0.111284286 + 0.152905151 0.0897441134 0.109189175 0.120302387 0.121966749 + 0.109058499 0.124952182 0.139896214 0.167036295 0.181192607 + 0.233888164 0.241935432 0.260134637 0.207450911 0.251336306 + 0.269834042 + 0.228311226 0.213392824 0.267343849 0.204513758 0.189067006 + 0.115387402 0.117474392 0.0838763267 0.0743941441 0.100187965 + 0.119460419 0.143471539 0.156601667 0.202539027 0.142124549 + 0.150250584 0.199961185 0.291761249 0.283750147 0.262229204 + 0.278450102 + 0.297495812 0.22892648 0.202501342 0.167613238 0.201424494 + 0.207882926 0.215795949 0.142378956 0.0687644705 0.114439905 + 0.157810345 0.125847906 0.0939016268 0.142325193 0.0974029526 + 0.106135666 0.11271178 0.123703934 0.266095221 0.281295896 + 0.294451892 + 0.274747193 0.262304753 0.210560411 0.178513154 0.217475474 + 0.162793919 0.219724238 0.19788368 0.0908304229 0.10839694 + 0.142575502 0.11355821 0.0943074077 0.148067862 0.0899886787 + 0.10039261 0.0748417154 0.0486158095 0.0827791393 0.260926902 + 0.258551151 + 0.228501037 0.229125217 0.219102338 0.21789673 0.207641229 + 0.234806657 0.24913238 0.171925306 0.225641847 0.183392629 + 0.144333005 0.102288336 0.0801094994 0.0494904295 0.0516266599 + 0.0623194166 0.0746915266 0.042865485 0.0248942357 0.058145877 + 0.13531366 + 0.122370914 0.212371945 0.288127244 0.223352045 0.232300654 + 0.297536492 0.313720703 0.245075911 0.201157495 0.256845534 + 0.252402276 0.168694153 0.0966936052 0.127318531 0.0482259914 + 0.052790422 0.0575843081 0.0521442741 0.0475836545 0.0569363274 + 0.0398515612 + 0.0913342759 0.0821920037 0.199716732 0.315180004 0.272976369 + 0.328366995 0.332017362 0.268582016 0.209877148 0.239338785 + 0.286343396 0.224495471 0.267961919 0.245558009 0.0516348705 + 0.0476668924 0.102793828 0.117204748 0.0958878323 0.0788121969 + 0.0664652586 + 0.120297395 0.11095266 0.127884179 0.163885742 0.245565787 + 0.248342171 0.260587752 0.226072162 0.226385742 0.25726065 + 0.263586342 0.242917567 0.279557914 0.292163283 0.244583368 + 0.165478438 0.166864097 0.17638579 0.169895098 0.173509613 + 0.168168813 + 0.11246822 0.120926596 0.14204888 0.128284812 0.15567404 + 0.182158604 0.194037139 0.238110721 0.245891705 0.258264035 + 0.222659826 0.251864076 0.302672923 0.290716559 0.248333618 + 0.242406473 0.238474742 0.255748957 0.321575761 0.251164734 + 0.204443455 + 0.0241278745 0.108888745 0.100702442 0.118086979 0.137449786 + 0.140455827 0.15879862 0.171632856 0.221423596 0.283094823 + 0.203444272 0.233780697 0.221420079 0.262808353 0.208803147 + 0.283167422 0.193927929 0.232817546 0.258304745 0.278648883 + 0.281664044 + 0.0380377099 0.0589510314 0.149573848 0.11447797 0.121261753 + 0.125900373 0.112175152 0.141502127 0.14391607 0.188767731 + 0.175013423 0.255794495 0.217054963 0.213365585 0.205401197 + 0.196578875 0.259976447 0.257584333 0.297582924 0.246743798 + 0.251448154 + 0.0762085021 0.0934094116 0.0860955045 0.127875909 0.118579887 + 0.1051827 0.0846072584 0.129245788 0.12368568 0.133816376 + 0.166765541 0.179360613 0.225298047 0.267959118 0.191650152 + 0.238737509 0.231577531 0.226223737 0.231649444 0.285863757 + 0.265648901 + 0.135967135 0.095876202 0.0762412474 0.0694929585 0.242441908 + 0.12996456 0.11315579 0.111679778 0.0814293325 0.126299664 + 0.153195396 0.19446604 0.187238216 0.228106469 0.234311566 + 0.24306576 0.265592247 0.186018392 0.241408557 0.232561991 + 0.233789146 + 0.00411389349 0.0540671386 0.0832628533 0.0850830227 0.165768728 + 0.108620271 0.0891118869 0.0511962287 0.0366537012 0.0182257891 + 0.0197824035 0.0996365249 0.100686491 0.117003597 0.138598278 + 0.172439143 0.156676963 0.15933831 0.118139543 0.111531153 + 0.130221322 + 0.00454921275 0.0489616506 0.101806141 0.107045732 0.188910708 + 0.0989423841 0.0822598636 0.0460761264 0.0444657281 0.0343815386 + 0.0557772443 0.15210551 0.114927314 0.134622708 0.176734313 + 0.156261489 0.143593311 0.18356882 0.155406162 0.127758384 + 0.154257923 + 0.027328724 0.0789220259 0.127508521 0.166449293 0.18695581 + 0.0945255384 0.105606325 0.112640277 0.0585318692 0.0347544514 + 0.04565119 0.120225869 0.116140112 0.114699416 0.175948218 + 0.156959161 0.164013088 0.176063567 0.15618372 0.144646496 + 0.144092485 + 0.0382877178 0.0926009864 0.129428759 0.184007272 0.161335513 + 0.14028953 0.115603849 0.118651539 0.0932337493 0.0543820933 + 0.0602671131 0.149876669 0.176054358 0.123314641 0.133744568 + 0.151348785 0.118944354 0.143679425 0.116415463 0.0739594251 + 0.13469249 + 0.0429658443 0.0890687779 0.151422739 0.209947526 0.205046296 + 0.198751748 0.163600713 0.120640613 0.0971912518 0.0808694661 + 0.0957581624 0.0980511457 0.177850872 0.135908693 0.131856263 + 0.143094018 0.15806137 0.197723284 0.161933437 0.140534714 + 0.102038302 + 0.0845324323 0.107332185 0.145403817 0.216386452 0.203280792 + 0.174393147 0.249545187 0.212154999 0.144264549 0.0809389725 + 0.0763968453 0.0729317218 0.261534899 0.13535133 0.114986807 + 0.161439806 0.224280417 0.220133066 0.227942839 0.249678463 + 0.25371027 + 0.120468423 0.119938836 0.13872993 0.189509407 0.189375997 + 0.168303058 0.196784407 0.241557419 0.264849722 0.21108669 + 0.150688961 0.07854449 0.250633806 0.111634038 0.102871269 + 0.137743339 0.238288134 0.230424881 0.26793921 0.233551338 + 0.220140636 + 0.138698757 0.126047254 0.138467535 0.138079628 0.204764038 + 0.174544334 0.196315289 0.199786559 0.220928743 0.230059534 + 0.264613479 0.219656646 0.248375744 0.114988707 0.165061682 + 0.133360803 0.209919691 0.273994684 0.292926818 0.232387498 + 0.227656648 + 0.17215088 0.128902063 0.108184427 0.148325205 0.180111066 + 0.151154384 0.185115874 0.196646169 0.181313321 0.173306331 + 0.208023384 0.242903739 0.228915319 0.119601227 0.199673563 + 0.17075403 0.148796469 0.174655586 0.230390176 0.239485532 + 0.254932255 + 0.233746409 0.192049995 0.215502352 0.233383864 0.150327504 + 0.151884392 0.131511599 0.14384447 0.13842383 0.166719034 + 0.204653665 0.169852346 0.150884598 0.118230522 0.165830284 + 0.161834463 0.187758818 0.156367689 0.182064638 0.215680435 + 0.293084383 + 0.280078441 0.238231882 0.239849418 0.261207312 0.0819961429 + 0.161346778 0.111746632 0.0943356082 0.0995754153 0.143210724 + 0.170630887 0.177621126 0.105137296 0.126850203 0.148948804 + 0.207602113 0.212961122 0.201635167 0.231700093 0.26375863 + 0.254045665 + 0.237044469 0.23097454 0.259404302 0.205064163 0.149515808 + 0.119162738 0.189050227 0.0791322067 0.0638675243 0.0713847652 + 0.109045878 0.113257013 0.108367629 0.183985829 0.146409616 + 0.170241073 0.194849223 0.169426665 0.20241949 0.248647317 + 0.148532823 + 0.28216058 0.272269934 0.232588798 0.135377109 0.209203824 + 0.146662995 0.216986462 0.134634942 0.0738258809 0.0629790053 + 0.0983754992 0.0756111145 0.0593393445 0.181648269 0.105059214 + 0.098783955 0.140192732 0.154860601 0.191656098 0.168653771 + 0.177467763 + 0.254449159 0.232199386 0.193679556 0.141524553 0.209037319 + 0.175157264 0.215324581 0.18734479 0.192094237 0.113727398 + 0.0783331916 0.0805054232 0.0730163157 0.126295149 0.115979575 + 0.0915471688 0.102123976 0.113527559 0.0922147706 0.0551442541 + 0.0831590891 + 0.277032256 0.234058321 0.200520545 0.180937037 0.195831448 + 0.241499975 0.236404583 0.125249416 0.223500803 0.214093328 + 0.193164855 0.142351329 0.0837962702 0.109547816 0.109246403 + 0.122476615 0.0974548534 0.0670318827 0.0522466265 0.0345900021 + 0.0100246519 + 0.13684386 0.240694538 0.298093617 0.20152685 0.234943256 + 0.273560673 0.280477464 0.193845004 0.203866914 0.283389926 + 0.260576814 0.277031273 0.183015779 0.119919896 0.0588113479 + 0.0615216419 0.0408108346 0.0444166176 0.051685527 0.0502469502 + 0.0312128719 + 0.114048153 0.0845688656 0.282341838 0.294007957 0.236133099 + 0.338182092 0.302897364 0.296720743 0.223521218 0.235965118 + 0.285944402 0.252192289 0.282632917 0.206359833 0.0461386405 + 0.0678749084 0.0309186708 0.0593244918 0.059852805 0.052556023 + 0.0444482788 + 0.0647427812 0.100616269 0.169820517 0.241544142 0.23913835 + 0.196296483 0.264789969 0.270381838 0.195574194 0.268442184 + 0.269107521 0.22954531 0.27977863 0.284349918 0.253874302 + 0.109527253 0.106802277 0.09812361 0.0686514005 0.0555111729 + 0.0512430891 + 0.190505967 0.0869998038 0.153090894 0.189449936 0.225616932 + 0.208995387 0.147410274 0.276149124 0.24592562 0.261032641 + 0.245738894 0.220337778 0.262369901 0.311576486 0.296538264 + 0.206860781 0.139856935 0.203759566 0.175420761 0.100313909 + 0.0836864635 + 0.093509011 0.182627335 0.116824202 0.169956475 0.179300338 + 0.213684186 0.183770463 0.170876965 0.220992878 0.261544615 + 0.230703533 0.214033157 0.228120789 0.245708123 0.218898401 + 0.260260284 0.237018794 0.239878312 0.231931001 0.203345403 + 0.154752806 + 0.102066167 0.0862979442 0.142916262 0.0845902488 0.140957162 + 0.202874675 0.175982088 0.165738314 0.200050697 0.274081707 + 0.186056957 0.241122007 0.193477869 0.22434184 0.23124966 + 0.264337659 0.294299364 0.265008628 0.313439548 0.306754023 + 0.228563726 + 0.100131303 0.0513970219 0.0839018524 0.105714187 0.0828320533 + 0.099878639 0.117678449 0.138862401 0.15226014 0.175417066 + 0.207404479 0.206188306 0.20905067 0.226810008 0.197761267 + 0.21902284 0.270451725 0.245464399 0.247573808 0.294571906 + 0.257600546 + 0.194745213 0.0848413929 0.0933356658 0.0831907615 0.246747345 + 0.0644962564 0.0687689036 0.119170196 0.0964804739 0.176594242 + 0.183505133 0.234483227 0.185883641 0.249397486 0.218501449 + 0.253051132 0.221028149 0.241368309 0.276830643 0.331429303 + 0.281334609 + 0.0364209451 0.0472939946 0.0585575961 0.0844329894 0.172710732 + 0.126689777 0.142860442 0.096659407 0.0940246135 0.0829101503 + 0.0575691983 0.138353199 0.0968400091 0.107702106 0.0908542052 + 0.107552812 0.140722156 0.105541259 0.0955132023 0.0942002758 + 0.144766495 + 0.0367205366 0.0365821421 0.0716765597 0.074996911 0.181457773 + 0.110231258 0.0908334926 0.080231078 0.0763714761 0.0728784725 + 0.039467562 0.0675492808 0.0848336145 0.110853836 0.112936273 + 0.126214415 0.13244012 0.158042997 0.121067919 0.120831147 + 0.133013397 + 0.0481284037 0.059663143 0.0959314853 0.111193068 0.152011395 + 0.0861456022 0.0513221584 0.0706841648 0.0843058079 0.0639833882 + 0.0673163682 0.130966276 0.135769412 0.0876252949 0.133148819 + 0.127937913 0.113373131 0.118619345 0.102179065 0.120643482 + 0.140467316 + 0.0795118883 0.0635698587 0.109646834 0.158218712 0.149620235 + 0.0691668019 0.085405983 0.0719145387 0.082672514 0.0566804819 + 0.0879893601 0.115265034 0.186093345 0.116733581 0.121597297 + 0.0895287842 0.0998100415 0.102862254 0.0842905492 0.0836528763 + 0.104846686 + 0.170731246 0.0981088057 0.122631282 0.187810093 0.193048507 + 0.122233286 0.077574499 0.0726841912 0.0525443293 0.0583763011 + 0.0967214033 0.088015385 0.184897646 0.11290022 0.111984558 + 0.0916227847 0.141697094 0.15322049 0.122166581 0.119287789 + 0.094793573 + 0.182632104 0.185262069 0.109333888 0.180700168 0.164655536 + 0.16554375 0.15105994 0.121231236 0.0723347664 0.0425536633 + 0.0621819347 0.0831430182 0.227393284 0.130406275 0.126652762 + 0.110395849 0.213050589 0.223612264 0.2253014 0.201828882 + 0.198297486 + 0.114342898 0.131439507 0.170030951 0.175913244 0.161017239 + 0.127959535 0.122997977 0.180826634 0.18989709 0.136336803 + 0.0692953542 0.0973166153 0.173911318 0.0907802582 0.125362977 + 0.108462192 0.145370767 0.187761068 0.225909054 0.185100287 + 0.207113519 + 0.202151552 0.162940308 0.168563962 0.18812944 0.125173256 + 0.117650367 0.139116377 0.164216816 0.165820643 0.179564282 + 0.154856578 0.120402329 0.213698283 0.103967182 0.156960726 + 0.135208875 0.139292374 0.175235838 0.217119768 0.216793954 + 0.242219552 + 0.217542589 0.225113973 0.236684263 0.203938231 0.17937468 + 0.123165406 0.148134917 0.155805185 0.124563128 0.109332576 + 0.137572363 0.171087906 0.22960344 0.116687968 0.143949464 + 0.134107307 0.156617984 0.177703172 0.134716287 0.141201317 + 0.213742822 + 0.242416263 0.191040665 0.260946035 0.201034129 0.178531617 + 0.139058888 0.138261855 0.132587716 0.122655921 0.0926524103 + 0.123760693 0.153132126 0.15772216 0.116163723 0.123578407 + 0.150162548 0.147512287 0.122957885 0.0925162137 0.0813820213 + 0.0628781542 + 0.30077672 0.202222407 0.271314085 0.225019306 0.129607171 + 0.169857904 0.157547474 0.113332152 0.104484953 0.134647653 + 0.127737254 0.12195693 0.108928896 0.163493395 0.155936614 + 0.159047753 0.154961392 0.123124793 0.0954501182 0.102803722 + 0.0635456592 + 0.265928656 0.219936475 0.223427728 0.197662979 0.147827208 + 0.227637604 0.154250205 0.198618099 0.10434489 0.1031093 + 0.0990429521 0.093650125 0.0763463154 0.174203098 0.133806437 + 0.157130241 0.12763904 0.126193881 0.109515354 0.097827062 + 0.0604896545 + 0.274641067 0.254495442 0.220324576 0.164129674 0.228936315 + 0.193707794 0.173972815 0.173273996 0.184680536 0.15752703 + 0.105783693 0.0599053837 0.0609460175 0.108198002 0.102447644 + 0.122993648 0.119771935 0.117562585 0.108912081 0.106135927 + 0.0926870927 + 0.191896677 0.217142835 0.233832896 0.175257146 0.230797991 + 0.164573386 0.205951601 0.158554167 0.216475546 0.203996629 + 0.201921001 0.132767737 0.0967611074 0.136643663 0.116215542 + 0.134556681 0.12136028 0.0885342881 0.053603936 0.0783748925 + 0.0710868761 + 0.182715818 0.232383043 0.229900748 0.174326375 0.206237271 + 0.228316933 0.225168869 0.0858239457 0.20982179 0.194439709 + 0.220614702 0.220244616 0.147883475 0.0926060006 0.111162856 + 0.143701211 0.134672225 0.0840672106 0.0676613227 0.0426048376 + 0.0665336922 + 0.247736454 0.273215532 0.273844332 0.231101632 0.211373627 + 0.26917544 0.240265504 0.132607207 0.211325556 0.269761056 + 0.267041445 0.302609056 0.233133316 0.134340644 0.0588144474 + 0.10200081 0.110965893 0.0897803754 0.0523141213 0.0592943281 + 0.0712258965 + 0.266866565 0.2616207 0.233321577 0.281628162 0.215429381 + 0.305546016 0.258673042 0.292986691 0.194033056 0.238859802 + 0.276023 0.264625043 0.168813542 0.213602602 0.0515106991 + 0.0902410224 0.0920950696 0.0424669683 0.0636621118 0.111338593 + 0.130025223 + 0.172061667 0.271020859 0.194349542 0.264979452 0.273571461 + 0.223038539 0.267780751 0.245346606 0.172143221 0.29136011 + 0.283829659 0.261180818 0.246733144 0.234343424 0.235680357 + 0.0661550313 0.1636765 0.0562227741 0.0759379417 0.102704808 + 0.0872878656 + 0.231137782 0.15658766 0.252663344 0.270477384 0.234076589 + 0.207837269 0.179045692 0.276829898 0.212570712 0.279152721 + 0.266435534 0.240339726 0.255570531 0.261410356 0.262601823 + 0.205450967 0.128605306 0.183722198 0.134379581 0.0925424919 + 0.0643127784 + 0.131983429 0.171076044 0.227086008 0.272895962 0.242892385 + 0.278288841 0.219398603 0.170682162 0.282774568 0.224856898 + 0.261657029 0.229079798 0.231469855 0.247641012 0.238419369 + 0.286848068 0.205600783 0.248711541 0.261418134 0.216333941 + 0.100847639 + 0.10941425 0.171299979 0.143064111 0.199131206 0.279756755 + 0.263641953 0.252072543 0.219861016 0.205407083 0.24397479 + 0.228374064 0.207191095 0.223028854 0.255648285 0.271799296 + 0.287566572 0.284092724 0.244684219 0.272514313 0.300354689 + 0.25129208 + 0.12047977 0.0969657749 0.108257815 0.171675459 0.168916807 + 0.188315421 0.273558557 0.247762233 0.216881827 0.271030366 + 0.207088783 0.213423982 0.189615965 0.250532955 0.284487963 + 0.221884713 0.219918057 0.242226213 0.288692206 0.292007387 + 0.257101715 + 0.160116926 0.100793503 0.094019413 0.122707538 0.196493015 + 0.114265949 0.0933711082 0.141863078 0.144228026 0.179535791 + 0.196439981 0.253827393 0.21876727 0.225688562 0.265185833 + 0.273550302 0.268335342 0.280875891 0.276413113 0.300614536 + 0.240171939 + 0.0498965196 0.0651521608 0.0174004175 0.0426901989 0.185440823 + 0.112047248 0.155275464 0.204687193 0.230206817 0.195860609 + 0.120628215 0.128200427 0.0374653675 0.057437174 0.0368994363 + 0.0314819776 0.0954072699 0.0901112929 0.0870235562 0.115611054 + 0.118192121 + 0.0617310405 0.0578933693 0.0175643153 0.0319213048 0.154475644 + 0.0554931983 0.0461251847 0.121753201 0.195794106 0.220390141 + 0.149375677 0.0643201917 0.0497838072 0.0562178791 0.0553219207 + 0.070725143 0.082058616 0.102956913 0.102603622 0.103796557 + 0.0989373252 + 0.059721332 0.0601015016 0.0596352667 0.0585407615 0.0958050936 + 0.0287144557 0.0156203145 0.0402984656 0.100604512 0.128826097 + 0.13878797 0.121760175 0.18064262 0.124672212 0.098019667 + 0.123635396 0.0861579031 0.0753338486 0.0824828446 0.0860995799 + 0.0980624482 + 0.20797199 0.0492668524 0.0530506074 0.112839788 0.0320694633 + 0.0203673504 0.0203494765 0.0335474089 0.0713488981 0.0734932199 + 0.0713117197 0.0591756739 0.202839106 0.212631509 0.230758309 + 0.174359053 0.169050053 0.0996461064 0.0800749883 0.0635474846 + 0.103747696 + 0.274098486 0.193764195 0.0510453098 0.184352964 0.174637333 + 0.0544045009 0.0284106769 0.0532675497 0.0286555178 0.0361011475 + 0.0464180298 0.0431347638 0.178789333 0.13522619 0.195639089 + 0.181116998 0.246689692 0.20835416 0.142343119 0.0836784244 + 0.0926753134 + 0.250769198 0.289700001 0.160764709 0.167069986 0.0982689038 + 0.192713067 0.159630448 0.0912279189 0.0409390926 0.0292595904 + 0.0408915281 0.0551192686 0.202187598 0.113562502 0.133270368 + 0.145464644 0.182426453 0.202602491 0.191909283 0.126115158 + 0.137275293 + 0.244192809 0.220362082 0.26419422 0.246855035 0.148248881 + 0.089830786 0.153732717 0.180755183 0.156753004 0.0752629787 + 0.0652630031 0.0677705333 0.169083551 0.102491245 0.120417945 + 0.109480977 0.121100195 0.115753241 0.107446209 0.168793395 + 0.165538043 + 0.222589493 0.208581835 0.190905392 0.218535244 0.109638385 + 0.0700069219 0.0770300627 0.114620253 0.193657279 0.187104657 + 0.136062235 0.0434043072 0.0711731464 0.0754402205 0.108837746 + 0.106881291 0.118522488 0.119294882 0.0765830427 0.0795314983 + 0.132594392 + 0.21750474 0.193010584 0.2056925 0.256288946 0.185756147 + 0.0896084458 0.0826750323 0.0895237625 0.0757243633 0.112826131 + 0.170373216 0.151764676 0.146360368 0.0790741891 0.0935143083 + 0.127497077 0.120875686 0.12507768 0.090874441 0.0730779395 + 0.109028123 + 0.25113824 0.23026295 0.258672684 0.211444452 0.223898962 + 0.105745144 0.185673967 0.0686708912 0.0841429532 0.0685240403 + 0.0732220784 0.137724981 0.202800423 0.182795018 0.119376473 + 0.13921313 0.122911744 0.121531583 0.0810540915 0.116251148 + 0.130141094 + 0.305059165 0.197744548 0.259810746 0.224678144 0.193391636 + 0.19249092 0.187950954 0.148131087 0.118506916 0.137614921 + 0.0990888104 0.108730793 0.114722744 0.215597972 0.160663188 + 0.163910151 0.134035587 0.107773773 0.111019976 0.140516788 + 0.160311922 + 0.264866084 0.242871299 0.270979166 0.180254936 0.216072574 + 0.242490217 0.147208035 0.242419899 0.237762302 0.137660637 + 0.11898277 0.121761873 0.12793842 0.176750079 0.127067372 + 0.168869153 0.177289948 0.151748642 0.127443984 0.146641076 + 0.152958766 + 0.288261354 0.280479163 0.222723186 0.132240623 0.262477934 + 0.242092937 0.192175835 0.224837855 0.266541749 0.220637038 + 0.121859148 0.115510225 0.103433415 0.166714117 0.106072322 + 0.130490571 0.156473801 0.148227349 0.118134432 0.143456355 + 0.14881818 + 0.176263526 0.249271214 0.248070627 0.181255847 0.23863405 + 0.196989179 0.17393513 0.198345914 0.263840228 0.225880474 + 0.178579018 0.10192471 0.0769280046 0.119602211 0.125221521 + 0.121968977 0.161133811 0.13176012 0.109635919 0.0940988213 + 0.0958825797 + 0.0704813674 0.156882137 0.245630175 0.154068738 0.221512243 + 0.189739123 0.0976154953 0.0342419222 0.251446843 0.237993404 + 0.210333377 0.133473694 0.113209732 0.162843645 0.098525703 + 0.123215251 0.142930195 0.11558418 0.0985652506 0.0826890171 + 0.0916990042 + 0.20572561 0.188693255 0.24173291 0.251822174 0.229336038 + 0.204124868 0.115133859 0.0805943012 0.224030539 0.236506417 + 0.204153374 0.207622513 0.178849116 0.190672964 0.0958382934 + 0.116676927 0.10327401 0.0955946818 0.0851443559 0.0767612755 + 0.0858152583 + 0.259673148 0.226124302 0.216595083 0.267271787 0.224692136 + 0.249648958 0.194272786 0.138589084 0.222328633 0.237310544 + 0.195527762 0.251938403 0.163701236 0.210266411 0.0592395999 + 0.0473141707 0.0497996323 0.0792127103 0.0528260879 0.0728359893 + 0.115049943 + 0.218536034 0.255309492 0.21761167 0.195734054 0.198711574 + 0.186501652 0.210439801 0.246305242 0.16642943 0.257867247 + 0.235631198 0.248993084 0.194365352 0.18976599 0.230148599 + 0.0369177908 0.108591147 0.0761718228 0.0568458028 0.0800260082 + 0.100495271 + 0.218004405 0.227831408 0.258982241 0.201500371 0.175365165 + 0.117508397 0.169302762 0.228139013 0.183224633 0.263223797 + 0.272596508 0.254635304 0.24187243 0.161964834 0.19083792 + 0.191599891 0.0910838246 0.227112204 0.110473007 0.0674700737 + 0.0999086648 + 0.17630367 0.200084284 0.233921111 0.187059268 0.162374616 + 0.180627733 0.129073143 0.189951062 0.248093501 0.144206539 + 0.229102924 0.222438395 0.222129658 0.197506875 0.190582648 + 0.259938538 0.229821593 0.224581227 0.25740239 0.169411272 + 0.142124504 + 0.141918793 0.154606462 0.242919758 0.194953889 0.173543572 + 0.147983253 0.15532589 0.1651925 0.192948326 0.16423136 + 0.175572574 0.227048725 0.215821087 0.209763005 0.222602352 + 0.219644263 0.255123585 0.206885383 0.278660029 0.3080827 + 0.206279084 + 0.13080807 0.141683355 0.154781625 0.28631106 0.156001553 + 0.160504729 0.134283528 0.148275197 0.136469021 0.121022731 + 0.123892881 0.146392331 0.205116868 0.24280715 0.235279322 + 0.178709567 0.182182878 0.24767676 0.284972757 0.294429749 + 0.29262203 + 0.178608924 0.148211822 0.153691754 0.154676154 0.209054917 + 0.157750145 0.118986674 0.115125448 0.117959008 0.0836329013 + 0.112937704 0.104680143 0.198175997 0.214870587 0.230316132 + 0.208765671 0.197961062 0.270438641 0.267957777 0.271508634 + 0.258446425 + 0.0361381993 0.0290635265 0.0490273088 0.168672994 0.169641092 + 0.238453701 0.277023643 0.241366416 0.23206006 0.260172904 + 0.19575505 0.154028684 0.113422789 0.172362223 0.0932223871 + 0.0508169904 0.0693387166 0.112070255 0.0957702622 0.107502632 + 0.108984768 + 0.0349820405 0.0302943718 0.0588720664 0.188700855 0.17852059 + 0.14345099 0.203769714 0.246808529 0.267283708 0.246559843 + 0.194056511 0.100463621 0.231459841 0.20210804 0.270036727 + 0.186720476 0.126861691 0.135830104 0.0834328532 0.104164608 + 0.0941825435 + 0.2071729 0.110503994 0.0805796683 0.0985708758 0.173253611 + 0.105974793 0.0607316606 0.131861299 0.226518184 0.210408181 + 0.219325319 0.184344128 0.216161758 0.213750392 0.289978087 + 0.300872177 0.248308405 0.181263745 0.0897284746 0.0972149447 + 0.13187249 + 0.241104841 0.194875956 0.128976986 0.145529643 0.10480503 + 0.0776354074 0.0629582256 0.0451112613 0.0299059823 0.129965454 + 0.208199203 0.16362007 0.209003314 0.176275298 0.234888628 + 0.250839591 0.246141598 0.231594533 0.203299046 0.102242514 + 0.133724689 + 0.287110418 0.30608052 0.284779012 0.233280763 0.0430702306 + 0.0695259273 0.0635597482 0.0327319913 0.016948957 0.0574278571 + 0.0795266852 0.12600778 0.242031887 0.200085804 0.194890842 + 0.186734453 0.232691199 0.274421215 0.277381867 0.202588946 + 0.164698035 + 0.216068387 0.25617677 0.283881932 0.272053212 0.0712060705 + 0.088352561 0.069104284 0.0364569984 0.0406238064 0.0578468256 + 0.0806309953 0.0948120877 0.213014185 0.188865066 0.211478055 + 0.232603446 0.261650324 0.236265793 0.251630694 0.247544482 + 0.253788352 + 0.211809501 0.217146143 0.223340988 0.20905906 0.159059837 + 0.10044688 0.0622959659 0.0704566613 0.0687430948 0.0377961062 + 0.0700022578 0.0920439586 0.167002797 0.0781829879 0.0755920634 + 0.154150128 0.215715557 0.202521265 0.229923904 0.226226211 + 0.172703236 + 0.210365593 0.192975953 0.189496949 0.181270078 0.135849074 + 0.143563494 0.101130992 0.0948983952 0.0501345135 0.0120576462 + 0.0141987083 0.0499619246 0.150781736 0.0452653542 0.0973584726 + 0.119664788 0.11373134 0.127046287 0.12457706 0.140983403 + 0.219293401 + 0.174581349 0.136601582 0.190217912 0.22572495 0.236369178 + 0.187613741 0.191740498 0.0900014862 0.0590812638 0.0408019796 + 0.0532306097 0.0362500958 0.0726253316 0.0263871197 0.100254364 + 0.123601206 0.128072321 0.122264214 0.10069643 0.0813654512 + 0.136352167 + 0.246216118 0.231432065 0.26463297 0.248872668 0.21621418 + 0.137325227 0.240858525 0.189581737 0.100756034 0.0600936115 + 0.0204460863 0.0525099821 0.0707754716 0.0874892771 0.0568771325 + 0.117057852 0.135524675 0.157803193 0.126122996 0.147293821 + 0.152504578 + 0.246912077 0.19714871 0.255336225 0.224746957 0.26250872 + 0.227976054 0.256201714 0.235410705 0.162362769 0.129162475 + 0.0810806602 0.116403036 0.11973384 0.205466807 0.114059769 + 0.112558052 0.117693581 0.115494281 0.0985526443 0.124650918 + 0.160352454 + 0.242126882 0.192731023 0.168971017 0.148877695 0.231333256 + 0.205788821 0.211293727 0.261459857 0.292341799 0.178105071 + 0.134184107 0.152212769 0.149263173 0.188715443 0.0831643194 + 0.120452181 0.134779036 0.135518864 0.101164117 0.120258883 + 0.163468108 + 0.279246002 0.257313877 0.227828279 0.149902552 0.236535296 + 0.239173442 0.203305885 0.351595014 0.28179875 0.192204297 + 0.128583565 0.138577223 0.160210714 0.161878511 0.100706287 + 0.0945729911 0.147337273 0.133263409 0.136448711 0.133433297 + 0.136362582 + 0.328490198 0.294320285 0.271416545 0.170596555 0.233940244 + 0.13159816 0.0804464817 0.25356403 0.288735837 0.231752694 + 0.139321074 0.102574028 0.124391437 0.120088175 0.103229828 + 0.108414121 0.14195922 0.146031022 0.141451344 0.13020815 + 0.103887029 + 0.230256483 0.217090279 0.264820695 0.168135077 0.272773743 + 0.0940804482 0.0426988676 0.0945423096 0.203882694 0.181777284 + 0.15075177 0.11719688 0.1153199 0.263817281 0.0987760499 + 0.0970724523 0.132341087 0.131346792 0.103604436 0.0991997644 + 0.0576872304 + 0.258688062 0.216381088 0.23379685 0.247821659 0.277421534 + 0.169898942 0.0575932376 0.105311446 0.159575433 0.128852338 + 0.134726033 0.165409893 0.144102558 0.256497592 0.111184269 + 0.0907430947 0.111479081 0.141842127 0.0959057808 0.0818761513 + 0.0394015871 + 0.27661705 0.235969752 0.224315554 0.221516371 0.215245619 + 0.231494382 0.145901829 0.12120302 0.251373619 0.194081813 + 0.125072345 0.17926693 0.137571916 0.19164674 0.0614199042 + 0.0504225604 0.0990441963 0.147288799 0.116172664 0.0850101039 + 0.0118564181 + 0.205768585 0.293427587 0.312578291 0.301372409 0.226395428 + 0.216808528 0.193815425 0.240222469 0.219353005 0.216497019 + 0.125133589 0.139532447 0.125353619 0.0825755224 0.201209038 + 0.0361390486 0.110744067 0.144086331 0.0891665891 0.0547962487 + 0.0357047953 + 0.212432891 0.243346944 0.303200394 0.30051282 0.280042738 + 0.202978969 0.199627012 0.254664063 0.221310526 0.24760744 + 0.180847734 0.0889946222 0.0920669734 0.0622767992 0.1113149 + 0.252091587 0.138142154 0.200330466 0.112736776 0.0621312633 + 0.0623653904 + 0.228068143 0.232755974 0.288431466 0.288271517 0.281627715 + 0.188393489 0.156037509 0.200518429 0.233669817 0.274894744 + 0.228332281 0.157479122 0.0849543959 0.0709229857 0.0659251809 + 0.124455243 0.225202382 0.227096885 0.209059849 0.071955651 + 0.0707796663 + 0.153804511 0.21726656 0.255712807 0.220216602 0.212847143 + 0.246333092 0.188604295 0.151726082 0.168247074 0.196867988 + 0.166386589 0.264357924 0.135248303 0.10808713 0.103706963 + 0.0894349813 0.182983652 0.167313665 0.300562352 0.202062443 + 0.14105989 + 0.222178891 0.225672767 0.285629421 0.295689076 0.148528159 + 0.15265052 0.118725173 0.138610676 0.112668619 0.102433495 + 0.105226241 0.13091284 0.223187879 0.158321559 0.120023087 + 0.0985506326 0.151522934 0.246763021 0.241030261 0.24221541 + 0.167850837 + 0.205692172 0.210653305 0.213862896 0.218182012 0.190205157 + 0.15918234 0.0703973621 0.0687093288 0.0708893165 0.0757120028 + 0.0909367576 0.176580429 0.201755866 0.235998422 0.133104578 + 0.113689184 0.169381663 0.271347731 0.306618214 0.217310429 + 0.200268283 + 0.0459601581 0.0444858335 0.0396334305 0.198235452 0.161410585 + 0.295930982 0.26835528 0.23611261 0.221608415 0.211088583 + 0.178060904 0.185141832 0.235642448 0.220053613 0.248261705 + 0.246074155 0.18882522 0.147342533 0.117837243 0.135003597 + 0.127136871 + 0.0480895042 0.0226156451 0.0400090888 0.105754115 0.150293991 + 0.161968231 0.22517547 0.215151027 0.220358372 0.202170625 + 0.204285204 0.159371883 0.232767507 0.183054224 0.277379334 + 0.235196978 0.251514345 0.241891354 0.112955563 0.09866409 + 0.0799796432 + 0.159837201 0.0326887295 0.0456291251 0.101686038 0.13085486 + 0.0659851357 0.0257186648 0.158256009 0.171112031 0.196782887 + 0.230206415 0.206289038 0.236953244 0.247088969 0.293201178 + 0.234772369 0.236656785 0.208404392 0.235743836 0.135201216 + 0.15157634 + 0.27394253 0.207172692 0.111503772 0.191645727 0.110064164 + 0.085844174 0.046915181 0.0574021451 0.123022445 0.189661697 + 0.229798317 0.193724126 0.260545939 0.247824714 0.299213409 + 0.238654658 0.213998511 0.254029691 0.24924694 0.2250866 + 0.215336293 + 0.275879532 0.281354129 0.261683673 0.245006204 0.131958425 + 0.112411201 0.0773422718 0.0787006095 0.0898104459 0.0968078002 + 0.144220203 0.198137254 0.24991037 0.175643608 0.21429725 + 0.193946049 0.277389854 0.273682296 0.236571163 0.251983404 + 0.277061015 + 0.269215405 0.262335598 0.258998424 0.267835289 0.154937014 + 0.148070484 0.123588547 0.106176555 0.120624252 0.110952072 + 0.118532971 0.14454028 0.242655769 0.241506636 0.222417474 + 0.244406819 0.250641197 0.23238644 0.211026892 0.266100913 + 0.250747621 + 0.238826498 0.254198104 0.220553845 0.197344765 0.187983349 + 0.193990022 0.156820819 0.117913231 0.114574961 0.102389447 + 0.0997085497 0.108577125 0.20746389 0.101419099 0.0995590538 + 0.181279287 0.246978477 0.225109458 0.244681299 0.250842601 + 0.224776611 + 0.222971752 0.248330012 0.182078004 0.158822462 0.205698341 + 0.212280661 0.195281416 0.152687117 0.121532194 0.108877547 + 0.0831146613 0.0666889697 0.113661684 0.0499667339 0.0635758489 + 0.0511968732 0.0963429585 0.205566108 0.209459081 0.19590722 + 0.261118323 + 0.200376436 0.150437504 0.169277772 0.199540913 0.207366005 + 0.221290573 0.215908274 0.204925805 0.14790298 0.0904593989 + 0.0882775038 0.0758811533 0.0379715711 0.0156380348 0.0414893329 + 0.0829169378 0.114847898 0.104322888 0.118196353 0.10589432 + 0.150461331 + 0.234684914 0.210826814 0.219497338 0.238225549 0.209493056 + 0.174719244 0.243132055 0.259139001 0.245000288 0.130554348 + 0.0585375503 0.0552581735 0.0573848523 0.0849294588 0.0206312221 + 0.0735332444 0.091560699 0.099006936 0.0820794255 0.0954893976 + 0.180991963 + 0.227475062 0.207450077 0.250835836 0.231747657 0.276994318 + 0.185624465 0.241347298 0.275379777 0.284276724 0.220455065 + 0.129259691 0.136893883 0.105113551 0.158992007 0.0663851053 + 0.0938182026 0.0854878724 0.0456906147 0.077748999 0.0588076264 + 0.0847142041 + 0.240312919 0.238306239 0.239222959 0.211053938 0.241940886 + 0.192351952 0.129013836 0.261828035 0.308805168 0.241467521 + 0.169739172 0.18339543 0.14238888 0.168902159 0.097857222 + 0.119162977 0.065107964 0.0399045534 0.083640635 0.0702875033 + 0.0976897255 + 0.267801702 0.310884327 0.248415604 0.127151772 0.266004741 + 0.229570448 0.12130376 0.263990462 0.275722086 0.19239296 + 0.15095605 0.183605 0.133303478 0.179460809 0.141990751 + 0.122766055 0.110765412 0.0738480985 0.0957345366 0.096787639 + 0.0947333798 + 0.305265099 0.270741671 0.262051553 0.137064219 0.249857172 + 0.206013963 0.14579621 0.239824459 0.173849374 0.118388839 + 0.107828297 0.110806711 0.108422756 0.169477269 0.180979401 + 0.127987385 0.126888782 0.100944594 0.071208328 0.0754282176 + 0.055232875 + 0.253561348 0.210840106 0.234968737 0.186754167 0.287668884 + 0.0734047145 0.111162744 0.159180403 0.191334695 0.129523695 + 0.112557419 0.0769028217 0.0721420422 0.134940654 0.107307807 + 0.115704015 0.135861382 0.112829849 0.0938688293 0.0977091566 + 0.0353439748 + 0.266739905 0.224073753 0.195539951 0.229128748 0.249825403 + 0.12730293 0.140362367 0.136303216 0.1697983 0.0901140645 + 0.0665044785 0.0618919209 0.0707518756 0.178617209 0.112906829 + 0.131415233 0.133599743 0.127805427 0.114426747 0.0832252055 + 0.0527516566 + 0.302366674 0.266685218 0.231417462 0.2303022 0.193618283 + 0.227380395 0.132571429 0.0836288482 0.256538212 0.0929341093 + 0.0283616912 0.069831267 0.083801873 0.164289832 0.117628582 + 0.119381852 0.109258801 0.0858387128 0.109367676 0.0955033526 + 0.0464477129 + 0.222298041 0.285646915 0.260033727 0.259091377 0.208107337 + 0.211351335 0.255483627 0.115683123 0.122453056 0.167073324 + 0.0278712865 0.074400112 0.0686317161 0.0690840632 0.152890056 + 0.12127731 0.104842633 0.0926938802 0.12033169 0.106757663 + 0.086539261 + 0.265099883 0.295638144 0.277381331 0.259649962 0.290203214 + 0.229726449 0.233170792 0.267226815 0.215511516 0.324666262 + 0.0708637983 0.025840871 0.0518314205 0.0611580759 0.0950701535 + 0.232494384 0.120357074 0.119468734 0.139968559 0.128380567 + 0.138507366 + 0.300422817 0.268449783 0.276118129 0.24249278 0.3463009 + 0.215587735 0.196735784 0.222619861 0.302948117 0.294513136 + 0.206586018 0.050234776 0.0371774696 0.0600548685 0.128880545 + 0.182199612 0.197613001 0.174649447 0.176960871 0.169219375 + 0.155023307 + 0.23664704 0.238860056 0.228195921 0.261104345 0.258687615 + 0.273847282 0.209625542 0.216880262 0.278631926 0.268323362 + 0.137529984 0.182488173 0.0501541868 0.0749193281 0.132701322 + 0.165848926 0.19340235 0.154067129 0.208152995 0.149849981 + 0.140950307 + 0.285777867 0.249989554 0.315162629 0.251588523 0.207597733 + 0.242363513 0.196090773 0.202761769 0.217084453 0.244376063 + 0.226412803 0.149925232 0.158374876 0.103618681 0.1088643 + 0.116297208 0.14650616 0.196701154 0.243098259 0.161366433 + 0.132448554 + 0.285904825 0.232457295 0.264812917 0.179465279 0.173198834 + 0.209855065 0.187930599 0.149870127 0.173030987 0.198728129 + 0.171143189 0.18938446 0.15110983 0.197248995 0.0997685269 + 0.122627206 0.102263793 0.169003949 0.259013146 0.18095772 + 0.132067636 + 0.0491252802 0.0502403006 0.153018072 0.247165635 0.157692641 + 0.276816785 0.2169929 0.264434189 0.231504947 0.233790353 + 0.217473134 0.187189937 0.210841894 0.17085816 0.184249401 + 0.230963826 0.235189885 0.221828341 0.193598896 0.183674574 + 0.140352532 + 0.0804148987 0.0352456234 0.0652805939 0.0840354189 0.030568596 + 0.28455776 0.239086598 0.202924177 0.217601404 0.220260397 + 0.222041979 0.182186782 0.219450325 0.213628232 0.233306393 + 0.20696421 0.203414008 0.234112605 0.160490066 0.221330479 + 0.209306061 + 0.206468746 0.0958017185 0.0623998046 0.109695189 0.057107497 + 0.0279373787 0.120254405 0.181749836 0.19973664 0.23105295 + 0.239359185 0.208202302 0.244959116 0.246016055 0.240599334 + 0.185043201 0.187106624 0.231608987 0.279860348 0.301505327 + 0.215433896 + 0.247484714 0.233082771 0.137553543 0.264009297 0.0812371597 + 0.0230567213 0.0172283016 0.0760434344 0.199562222 0.213772088 + 0.274415761 0.239828363 0.237397045 0.258379519 0.230800331 + 0.239875317 0.19619444 0.228535533 0.242704824 0.281062543 + 0.237037182 + 0.233266637 0.242992923 0.270828187 0.272593468 0.0957462564 + 0.0537818223 0.0437241457 0.0623642318 0.0869690776 0.14530091 + 0.22542426 0.222184703 0.246803954 0.185823619 0.199951962 + 0.159606978 0.260249794 0.257043064 0.219174996 0.23549141 + 0.290126354 + 0.266940236 0.229646832 0.216432929 0.234509632 0.138233557 + 0.116866067 0.0782154575 0.0739227235 0.0768959001 0.0921581984 + 0.12166357 0.0990236849 0.201143444 0.203769028 0.243510574 + 0.243171558 0.245131731 0.226999626 0.222858697 0.264350146 + 0.246685654 + 0.286905885 0.235400826 0.203560635 0.19315441 0.188587993 + 0.263487726 0.164778858 0.0632941499 0.0680765584 0.114095122 + 0.111624055 0.0886906609 0.170935214 0.147706136 0.150775596 + 0.218887791 0.262879908 0.258005559 0.261423826 0.240613595 + 0.249337956 + 0.203827754 0.201116443 0.239087865 0.214995831 0.174606875 + 0.225012302 0.246431336 0.173115 0.0938543901 0.107975081 + 0.0943470448 0.0965225548 0.126372904 0.0183069892 0.00152801909 + 0.0699391514 0.192091301 0.275174141 0.245954037 0.252956808 + 0.271789581 + 0.211517677 0.221215531 0.226886496 0.255901068 0.254968494 + 0.272729278 0.245266095 0.204528883 0.12064442 0.0955251157 + 0.103210822 0.0990008116 0.0810622275 0.0250372235 0.0323900767 + 0.0468759388 0.0552369393 0.0787045881 0.159120992 0.1922355 + 0.157175198 + 0.203375936 0.263239652 0.263401061 0.203436166 0.1790158 + 0.184687778 0.258712143 0.24872233 0.248989388 0.247410551 + 0.14782232 0.10112749 0.085779421 0.0844102949 0.0260538142 + 0.0462917648 0.051749628 0.0258421768 0.05891864 0.125066221 + 0.219220504 + 0.219422489 0.223963454 0.262384355 0.187188253 0.236902192 + 0.205673754 0.272948295 0.273124009 0.291415453 0.287347823 + 0.276927561 0.232459128 0.128281683 0.173609927 0.100565121 + 0.0617197193 0.0451256223 0.0698340833 0.0790171474 0.100345008 + 0.148088425 + 0.237594441 0.184554175 0.198309764 0.128296167 0.23881416 + 0.164402813 0.148310676 0.252772927 0.283897609 0.264437795 + 0.220527261 0.259321481 0.217249826 0.199037254 0.133415297 + 0.0871256217 0.0539263934 0.0862240121 0.0990180224 0.157440111 + 0.172888905 + 0.214848444 0.227079675 0.187144861 0.10883943 0.233915657 + 0.181881204 0.0455291569 0.213217899 0.270411074 0.237343848 + 0.237537757 0.280376554 0.191766173 0.176529631 0.172190756 + 0.104884095 0.0927464813 0.109359995 0.106419705 0.130994722 + 0.126782387 + 0.246206388 0.24831754 0.237741917 0.127407402 0.207137376 + 0.114616401 0.116419204 0.250922024 0.12399672 0.117156006 + 0.159230232 0.184580624 0.182809547 0.162478402 0.214708924 + 0.0978572518 0.114821777 0.128488809 0.102480039 0.113967717 + 0.112251192 + 0.31018126 0.221807718 0.190884918 0.156604558 0.251955122 + 0.0568541102 0.102041468 0.15914686 0.123221315 0.0782863498 + 0.0852990001 0.0952623785 0.114678711 0.155826539 0.148358583 + 0.0958506018 0.0948904008 0.111940496 0.101581156 0.0971138328 + 0.121444941 + 0.249305069 0.259874344 0.237591118 0.22143811 0.240513891 + 0.0989615619 0.109018311 0.1385995 0.142349437 0.0792679414 + 0.0608331375 0.0727104843 0.0957323611 0.166907445 0.138510972 + 0.116147317 0.0899875462 0.0896714702 0.113589607 0.113383278 + 0.150550291 + 0.250944436 0.271023452 0.257632822 0.247945726 0.247163847 + 0.186346009 0.0823272988 0.0804102868 0.203176349 0.0854657292 + 0.0833939314 0.0612781867 0.0689969137 0.0768947676 0.164141715 + 0.0949886739 0.0549273528 0.0785242245 0.129890203 0.145750344 + 0.132417575 + 0.27594921 0.254433393 0.251111716 0.230399564 0.245927215 + 0.150225133 0.264106005 0.0674557686 0.103335269 0.167589679 + 0.0519188344 0.0442506634 0.0448283292 0.0696489066 0.171485007 + 0.127400815 0.0820206106 0.0872062519 0.127063334 0.121877633 + 0.118984431 + 0.237528518 0.311452538 0.258281559 0.248422861 0.252858162 + 0.25296402 0.218187928 0.246292204 0.116307713 0.284007907 + 0.0342427939 0.028525183 0.038752947 0.0903397575 0.119992882 + 0.233466357 0.144649893 0.142650574 0.142158106 0.115053952 + 0.118006513 + 0.237054855 0.243597373 0.237024114 0.241522282 0.284407318 + 0.30044201 0.292376041 0.254168481 0.283806592 0.173073813 + 0.187314108 0.0316247232 0.0707980543 0.0807956681 0.0811983645 + 0.155541763 0.225081727 0.150838435 0.155355677 0.136191398 + 0.147903845 + 0.228017375 0.239186868 0.199531168 0.236554429 0.247845516 + 0.314640999 0.27890569 0.287158668 0.314226061 0.219901696 + 0.123466566 0.1737829 0.074308157 0.0907077789 0.115149982 + 0.148448616 0.173657939 0.162025332 0.135198325 0.167918712 + 0.157039404 + 0.274353802 0.281018794 0.309389442 0.253766656 0.226504058 + 0.249032453 0.222676903 0.175248742 0.226566717 0.284033805 + 0.274876595 0.159798339 0.135939389 0.0625053793 0.0917695984 + 0.12187168 0.136384889 0.169660151 0.167984352 0.173473954 + 0.161299199 + 0.264575839 0.264467031 0.250933468 0.209522635 0.183320016 + 0.229858413 0.233556539 0.185095593 0.207730219 0.242240235 + 0.219311491 0.214315191 0.142270401 0.118942164 0.096677877 + 0.0838371068 0.105112836 0.164018303 0.150052696 0.167231888 + 0.153366983 + 0.241788685 0.277558714 0.285597056 0.194463894 0.142118827 + 0.2977584 0.237609297 0.255197525 0.210318059 0.228522807 + 0.21633105 0.192573816 0.208555356 0.159679934 0.12708807 + 0.141866595 0.18555145 0.241796851 0.207418099 0.309519321 + 0.177061915 + 0.180194765 0.176947236 0.141797736 0.166695029 0.083387062 + 0.323275179 0.236380726 0.147548154 0.21446684 0.220409423 + 0.220089152 0.189044893 0.225200474 0.173337817 0.168558672 + 0.138349771 0.14951776 0.160871074 0.266851544 0.299437284 + 0.266493618 + 0.179412857 0.200379848 0.101409785 0.156669259 0.0595117249 + 0.195540532 0.19506219 0.166280091 0.214512587 0.236595392 + 0.260898411 0.161425605 0.22200869 0.240308523 0.180164725 + 0.166312844 0.144591257 0.113331363 0.263718665 0.264005035 + 0.299407452 + 0.195800334 0.204138011 0.258593678 0.280411452 0.0764444247 + 0.0633243769 0.124530628 0.180547029 0.217452124 0.268429428 + 0.295664221 0.199179366 0.203280151 0.228377268 0.205270186 + 0.18982479 0.126146242 0.148274854 0.212246507 0.243279353 + 0.296365052 + 0.199011326 0.23606658 0.23388496 0.226363629 0.0484388061 + 0.0232317988 0.0603462234 0.0488052927 0.115932114 0.201479927 + 0.268157452 0.229283735 0.19591704 0.201710075 0.165613994 + 0.200845778 0.174317315 0.156185433 0.202322483 0.271980017 + 0.232346386 + 0.248329133 0.201183826 0.256985754 0.258340091 0.111974999 + 0.0854385868 0.0286394823 0.0415956713 0.0728184357 0.0643079877 + 0.105378777 0.177519798 0.15685463 0.19428958 0.200495631 + 0.224757239 0.217671707 0.1900554 0.166109338 0.234107792 + 0.235552058 + 0.152862146 0.220468655 0.251409769 0.243179664 0.110343792 + 0.251870602 0.166759863 0.064472504 0.104443714 0.105948515 + 0.111751758 0.134780675 0.175881445 0.168155342 0.213874489 + 0.213505462 0.265780151 0.214719817 0.254458487 0.245799854 + 0.280574471 + 0.191763878 0.198030129 0.268624544 0.232337162 0.162495703 + 0.292901218 0.227509081 0.18099305 0.10148003 0.117421649 + 0.106638134 0.117773488 0.139875501 0.0675658733 0.0425771922 + 0.148725793 0.23960413 0.24384509 0.286810726 0.255577534 + 0.20990853 + 0.204249367 0.214957118 0.213461235 0.203698874 0.287053347 + 0.274958014 0.2701509 0.201755434 0.158796072 0.0933441073 + 0.114380941 0.116834939 0.102011889 0.0848375484 0.069771491 + 0.0627767965 0.0561333224 0.127665713 0.164230451 0.184494004 + 0.176581785 + 0.244587094 0.269105881 0.277226597 0.119810395 0.186029658 + 0.192722708 0.280595183 0.269279838 0.265109658 0.224149033 + 0.169344962 0.128765076 0.107656524 0.135189369 0.0824014246 + 0.0785118863 0.090195924 0.064627938 0.0648251474 0.117115244 + 0.189966008 + 0.155106813 0.136856928 0.152840361 0.0694710165 0.271328151 + 0.17035006 0.242462337 0.269209236 0.266303927 0.296141773 + 0.265669882 0.192549348 0.122224443 0.174433276 0.0755989105 + 0.090473257 0.102561928 0.14675802 0.100062199 0.101682879 + 0.0799237564 + 0.121828549 0.068553783 0.036413528 0.0351326168 0.26457262 + 0.171847299 0.1707616 0.215162739 0.297212064 0.290731519 + 0.24516964 0.259863466 0.20259665 0.172928423 0.0882096738 + 0.0764331669 0.0889636129 0.152731448 0.122183442 0.129992336 + 0.0967961624 + 0.170353308 0.0855179429 0.050526347 0.043472264 0.15469566 + 0.0707725435 0.165021285 0.167974159 0.206733808 0.226192608 + 0.23353067 0.191920832 0.221228093 0.140001193 0.13533558 + 0.0887104943 0.0911549851 0.144531623 0.120930016 0.103748076 + 0.0950253829 + 0.241468057 0.207423985 0.0900236294 0.0880058184 0.143358931 + 0.0776973814 0.130558908 0.211240709 0.108253457 0.0842293724 + 0.160999015 0.198110536 0.256152898 0.170162827 0.145021141 + 0.161725402 0.126412913 0.155839652 0.148508042 0.142395943 + 0.132653624 + 0.231508449 0.173968345 0.147686347 0.0939432532 0.17783764 + 0.0967639461 0.11241252 0.125595316 0.0982817188 0.0871535093 + 0.0886954665 0.123183608 0.136764199 0.128262803 0.172187358 + 0.186374888 0.14709194 0.177561209 0.14788419 0.122044645 + 0.12552385 + 0.276539505 0.268931687 0.228751868 0.165812612 0.237091124 + 0.098148115 0.0769227967 0.117918722 0.161004454 0.14205949 + 0.12052533 0.130951509 0.129691571 0.165324107 0.156984344 + 0.157009318 0.128863677 0.117833249 0.14615573 0.11879883 + 0.12003576 + 0.23858583 0.25269258 0.212219343 0.204729244 0.183716044 + 0.220254675 0.0300192535 0.0353153571 0.218584254 0.132459044 + 0.132498503 0.149710774 0.167947158 0.138533905 0.164458767 + 0.147165343 0.107398815 0.0983564183 0.116738215 0.0908292979 + 0.0572860502 + 0.282691568 0.271362036 0.282756388 0.251897901 0.266219109 + 0.175952733 0.212238923 0.0159571264 0.138009802 0.137310088 + 0.109170429 0.130522907 0.125524104 0.126473576 0.158415124 + 0.119430736 0.0903297737 0.122147486 0.104189783 0.0686702356 + 0.071217522 + 0.252311498 0.265310585 0.257985771 0.247064948 0.235396057 + 0.27330631 0.139128909 0.246155828 0.126981273 0.219987527 + 0.117644921 0.120605543 0.117161609 0.0788864121 0.119182669 + 0.240304634 0.113001794 0.11950954 0.0840228125 0.0672099665 + 0.0978513807 + 0.275897413 0.265552163 0.226572022 0.204303354 0.211431116 + 0.246549606 0.218415499 0.163745806 0.245076895 0.161014155 + 0.17147246 0.0772762671 0.0984002948 0.0837266371 0.0940902978 + 0.162068665 0.228098407 0.1512575 0.113331169 0.106700286 + 0.112750724 + 0.232814342 0.245643094 0.21420835 0.176857471 0.210840672 + 0.253470033 0.253099054 0.202945933 0.254943967 0.192915335 + 0.128596842 0.128355876 0.109811313 0.109604917 0.15032427 + 0.17156136 0.188071653 0.168556899 0.155231342 0.144413993 + 0.130552381 + 0.272890776 0.253093094 0.23517023 0.192236155 0.257434607 + 0.277410924 0.248455748 0.211944118 0.244612008 0.282842815 + 0.277223676 0.160506606 0.115804508 0.118045874 0.150109321 + 0.166260555 0.157234266 0.160866007 0.170183241 0.147281393 + 0.146316946 + 0.248008326 0.219049796 0.205645189 0.226127982 0.232057065 + 0.266391844 0.231894031 0.196754709 0.264202505 0.29391098 + 0.249836639 0.214093134 0.196514815 0.180800334 0.137077481 + 0.115400434 0.123865269 0.138878375 0.131814808 0.152138352 + 0.128338486 + / + +EQLNUM + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + / + +FIPNUM + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + 2 2 2 2 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 1 1 1 1 + 1 + / + +ECHO diff --git a/TestModels/reek/reek_box_grid_w_props.roff b/TestModels/reek/reek_box_grid_w_props.roff new file mode 100644 index 0000000000..99f1dacab5 Binary files /dev/null and b/TestModels/reek/reek_box_grid_w_props.roff differ diff --git a/TestModels/reek/reek_box_grid_w_props.roffasc b/TestModels/reek/reek_box_grid_w_props.roffasc new file mode 100644 index 0000000000..94f7dd0cbf --- /dev/null +++ b/TestModels/reek/reek_box_grid_w_props.roffasc @@ -0,0 +1,9915 @@ +roff-asc +#ROFF file# +#Creator: RMS - Reservoir Modeling System, version 13.0.3# +tag filedata +int byteswaptest 1 +char filetype "grid" +char creationDate "12/12/2022 23:11:06" +endtag +tag version +int major 2 +int minor 0 +endtag +tag dimensions +int nX 21 +int nY 23 +int nZ 14 +endtag +tag translate +float xoffset 4.56511063E+05 +float yoffset 5.93568800E+06 +float zoffset 0.00000000E+00 +endtag +tag scale +float xscale 1.00000000E+00 +float yscale 1.00000000E+00 +float zscale -1.00000000E+00 +endtag +tag cornerLines +array float data 3168 + 4.39013574E+03 -1.35617188E+03 -1.67181702E+03 4.30271973E+03 + -1.34624414E+03 -1.62740198E+03 4.46623438E+03 -1.49432422E+03 + -1.67423206E+03 4.37106055E+03 -1.48189111E+03 -1.62760596E+03 + 4.54290967E+03 -1.63284814E+03 -1.67662695E+03 4.45033740E+03 + -1.61857813E+03 -1.63158203E+03 4.61673926E+03 -1.77147998E+03 + -1.67773706E+03 4.53364355E+03 -1.75543896E+03 -1.63516003E+03 + 4.68364648E+03 -1.90932080E+03 -1.67555798E+03 4.61626660E+03 + -1.89101221E+03 -1.63561804E+03 4.75416162E+03 -2.04907617E+03 + -1.67614099E+03 4.70306055E+03 -2.02473584E+03 -1.63450903E+03 + 4.82241650E+03 -2.19188379E+03 -1.67869897E+03 4.79961035E+03 + -2.15630176E+03 -1.63446704E+03 4.88294629E+03 -2.33897021E+03 + -1.68243396E+03 4.90489648E+03 -2.28518994E+03 -1.63616199E+03 + 4.93885156E+03 -2.48777979E+03 -1.68651501E+03 5.00974951E+03 + -2.41476318E+03 -1.63988403E+03 4.99959961E+03 -2.63326221E+03 + -1.69062402E+03 5.10531152E+03 -2.54853613E+03 -1.64517798E+03 + 5.06832129E+03 -2.77451904E+03 -1.69510706E+03 5.19351270E+03 + -2.68450098E+03 -1.65062195E+03 5.13928467E+03 -2.91604199E+03 + -1.70119299E+03 5.27301660E+03 -2.82415820E+03 -1.65670203E+03 + 5.22356934E+03 -3.04977881E+03 -1.70410205E+03 5.35491650E+03 + -2.96075195E+03 -1.65948303E+03 5.30434229E+03 -3.18612500E+03 + -1.70860303E+03 5.42997363E+03 -3.10172021E+03 -1.66214099E+03 + 5.38938330E+03 -3.31866211E+03 -1.71173706E+03 5.50281836E+03 + -3.24475977E+03 -1.66346594E+03 5.48215527E+03 -3.44454590E+03 + -1.71158203E+03 5.57920459E+03 -3.38706592E+03 -1.66161401E+03 + 5.57913428E+03 -3.56762891E+03 -1.70829199E+03 5.65554346E+03 + -3.53209619E+03 -1.65839294E+03 5.66351172E+03 -3.69700879E+03 + -1.71308203E+03 5.72331934E+03 -3.68259912E+03 -1.66012195E+03 + 5.74808350E+03 -3.82455615E+03 -1.71990198E+03 5.79095752E+03 + -3.83326123E+03 -1.66335303E+03 5.83556152E+03 -3.95122021E+03 + -1.72329297E+03 5.85534033E+03 -3.97836182E+03 -1.67822705E+03 + 5.92060059E+03 -4.08082617E+03 -1.72703894E+03 5.92935352E+03 + -4.12216113E+03 -1.68393103E+03 6.00345654E+03 -4.21298779E+03 + -1.73170898E+03 6.00554053E+03 -4.26347900E+03 -1.68885706E+03 + 6.08466748E+03 -4.35032617E+03 -1.73492102E+03 6.08326660E+03 + -4.40362012E+03 -1.69211206E+03 6.16448730E+03 -4.49181396E+03 + -1.73838599E+03 6.16205469E+03 -4.54223486E+03 -1.69440295E+03 + 4.51798730E+03 -1.27394189E+03 -1.67804004E+03 4.43560059E+03 + -1.26407715E+03 -1.62871997E+03 4.59708545E+03 -1.41234521E+03 + -1.68047900E+03 4.51534131E+03 -1.40099609E+03 -1.63108203E+03 + 4.66961133E+03 -1.54992285E+03 -1.67850696E+03 4.59696436E+03 + -1.53817920E+03 -1.63224097E+03 4.73877051E+03 -1.68701611E+03 + -1.67383997E+03 4.67757764E+03 -1.67486279E+03 -1.63021997E+03 + 4.80924561E+03 -1.82467383E+03 -1.66998206E+03 4.76079053E+03 + -1.81053809E+03 -1.62678198E+03 4.88241650E+03 -1.96476318E+03 + -1.67069800E+03 4.85391260E+03 -1.94537988E+03 -1.62668994E+03 + 4.94939453E+03 -2.10824902E+03 -1.67283203E+03 4.95586426E+03 + -2.07712305E+03 -1.62872400E+03 5.00534766E+03 -2.25753906E+03 + -1.67594397E+03 5.06863330E+03 -2.20138184E+03 -1.62957703E+03 + 5.04845947E+03 -2.41473291E+03 -1.68310205E+03 5.18881250E+03 + -2.32045020E+03 -1.62995496E+03 5.09835156E+03 -2.56718408E+03 + -1.69005798E+03 5.28541162E+03 -2.45265723E+03 -1.63595398E+03 + 5.16793750E+03 -2.70893506E+03 -1.69564905E+03 5.35125342E+03 + -2.60032080E+03 -1.64660095E+03 5.24665869E+03 -2.84749023E+03 + -1.70166602E+03 5.41753760E+03 -2.74552979E+03 -1.65480200E+03 + 5.34046143E+03 -2.97867285E+03 -1.70433398E+03 5.48957764E+03 + -2.88641309E+03 -1.65993506E+03 5.43056250E+03 -3.11230811E+03 + -1.70693604E+03 5.56264941E+03 -3.02651611E+03 -1.66321704E+03 + 5.52149854E+03 -3.24454785E+03 -1.70758606E+03 5.64427930E+03 + -3.16120898E+03 -1.66187000E+03 5.61761963E+03 -3.37150391E+03 + -1.70524402E+03 5.72164941E+03 -3.29937891E+03 -1.66060999E+03 + 5.71319434E+03 -3.49699023E+03 -1.70249304E+03 5.79671338E+03 + -3.44055908E+03 -1.65943799E+03 5.80233154E+03 -3.62555078E+03 + -1.70302795E+03 5.86934326E+03 -3.58551611E+03 -1.65865906E+03 + 5.87956543E+03 -3.75850977E+03 -1.71435303E+03 5.93906055E+03 + -3.73472803E+03 -1.65922095E+03 5.96998242E+03 -3.88306885E+03 + -1.71566394E+03 6.00883545E+03 -3.88718994E+03 -1.66008105E+03 + 6.05736035E+03 -4.00932324E+03 -1.71762402E+03 6.07473438E+03 + -4.03630518E+03 -1.67253796E+03 6.14143262E+03 -4.13789209E+03 + -1.72222900E+03 6.14856836E+03 -4.18185010E+03 -1.67801294E+03 + 6.22379346E+03 -4.27225293E+03 -1.72572803E+03 6.22494629E+03 + -4.32473291E+03 -1.68184802E+03 6.30432764E+03 -4.41142383E+03 + -1.73011401E+03 6.30308545E+03 -4.46340918E+03 -1.68577100E+03 + 4.65457227E+03 -1.19246289E+03 -1.69202002E+03 4.58912158E+03 + -1.18450488E+03 -1.64210205E+03 4.73134473E+03 -1.33010889E+03 + -1.69158801E+03 4.67193555E+03 -1.32229785E+03 -1.64327100E+03 + 4.80609668E+03 -1.46723682E+03 -1.68914905E+03 4.75319434E+03 + -1.46018604E+03 -1.64145300E+03 4.87976074E+03 -1.60426709E+03 + -1.68534302E+03 4.83513037E+03 -1.59829004E+03 -1.63835596E+03 + 4.95099756E+03 -1.74190283E+03 -1.68065601E+03 4.91883838E+03 + -1.73614014E+03 -1.63475000E+03 5.01894141E+03 -1.88161279E+03 + -1.67772302E+03 5.00704150E+03 -1.87293896E+03 -1.63299402E+03 + 5.07840332E+03 -2.02617480E+03 -1.67627795E+03 5.10170947E+03 + -2.00663281E+03 -1.63300696E+03 5.12700244E+03 -2.17794922E+03 + -1.67385498E+03 5.20727930E+03 -2.13385303E+03 -1.63252197E+03 + 5.17863672E+03 -2.32950781E+03 -1.67454102E+03 5.31087451E+03 + -2.26111816E+03 -1.63435498E+03 5.22704541E+03 -2.48233496E+03 + -1.68275806E+03 5.40330566E+03 -2.39285986E+03 -1.63670398E+03 + 5.28741846E+03 -2.62986719E+03 -1.69234302E+03 5.47053369E+03 + -2.53622705E+03 -1.64404395E+03 5.36607666E+03 -2.77076709E+03 + -1.69970605E+03 5.53287061E+03 -2.68151807E+03 -1.65256702E+03 + 5.45826367E+03 -2.90679590E+03 -1.70424597E+03 5.60261035E+03 + -2.82299023E+03 -1.65898706E+03 5.54960156E+03 -3.04424121E+03 + -1.70790601E+03 5.67805371E+03 -2.96137109E+03 -1.66280005E+03 + 5.64760840E+03 -3.17657422E+03 -1.70681702E+03 5.76117969E+03 + -3.09444385E+03 -1.66255103E+03 5.74058740E+03 -3.31032178E+03 + -1.70601599E+03 5.84196729E+03 -3.22852979E+03 -1.66230005E+03 + 5.83196533E+03 -3.44219824E+03 -1.70587000E+03 5.92400049E+03 + -3.36131885E+03 -1.66095605E+03 5.92406250E+03 -3.56975684E+03 + -1.70639001E+03 6.00229053E+03 -3.49835791E+03 -1.66030701E+03 + 6.01813672E+03 -3.69226416E+03 -1.70599805E+03 6.07721826E+03 + -3.64084717E+03 -1.65985803E+03 6.10367236E+03 -3.81920215E+03 + -1.71234998E+03 6.15140430E+03 -3.78779883E+03 -1.65797400E+03 + 6.19260449E+03 -3.94183789E+03 -1.71428101E+03 6.22330762E+03 + -3.94070703E+03 -1.65739697E+03 6.27916455E+03 -4.06629102E+03 + -1.71668005E+03 6.29142139E+03 -4.09035596E+03 -1.67074402E+03 + 6.36297754E+03 -4.19673291E+03 -1.71940796E+03 6.36695752E+03 + -4.23677979E+03 -1.67410706E+03 6.44427441E+03 -4.33381592E+03 + -1.72305005E+03 6.44446826E+03 -4.37767188E+03 -1.67855505E+03 + 4.78862744E+03 -1.10990576E+03 -1.70503296E+03 4.74457471E+03 + -1.10549707E+03 -1.65764795E+03 4.86609229E+03 -1.24667920E+03 + -1.70296997E+03 4.82576465E+03 -1.24345508E+03 -1.65579797E+03 + 4.94402930E+03 -1.38271484E+03 -1.70090601E+03 4.90802148E+03 + -1.38167920E+03 -1.65425696E+03 5.01938330E+03 -1.51809180E+03 + -1.69603796E+03 4.98925635E+03 -1.51991113E+03 -1.65092603E+03 + 5.09257227E+03 -1.65364209E+03 -1.69145496E+03 5.07005469E+03 + -1.65819385E+03 -1.64669702E+03 5.16009229E+03 -1.79102979E+03 + -1.68739600E+03 5.15134863E+03 -1.79651611E+03 -1.64250000E+03 + 5.21470752E+03 -1.93492383E+03 -1.68329797E+03 5.23526465E+03 + -1.93398193E+03 -1.63961804E+03 5.24441064E+03 -2.09530078E+03 + -1.67892004E+03 5.32223535E+03 -2.07022412E+03 -1.63795398E+03 + 5.27930371E+03 -2.25629590E+03 -1.67750598E+03 5.40925732E+03 + -2.20484424E+03 -1.63781604E+03 5.34797559E+03 -2.39887207E+03 + -1.68032800E+03 5.49450439E+03 -2.33880322E+03 -1.63852795E+03 + 5.41862451E+03 -2.54142285E+03 -1.68803101E+03 5.56565527E+03 + -2.47892676E+03 -1.64342505E+03 5.48801367E+03 -2.68939697E+03 + -1.69762695E+03 5.63430273E+03 -2.62103418E+03 -1.65000098E+03 + 5.57066553E+03 -2.83595508E+03 -1.70483704E+03 5.70913770E+03 + -2.76105176E+03 -1.65560498E+03 5.66519971E+03 -2.97855518E+03 + -1.70867004E+03 5.79040234E+03 -2.89800488E+03 -1.65902100E+03 + 5.76620459E+03 -3.11638721E+03 -1.70821106E+03 5.87471973E+03 + -3.03247412E+03 -1.66018298E+03 5.86130762E+03 -3.25603711E+03 + -1.70767505E+03 5.95910449E+03 -3.16534277E+03 -1.66041504E+03 + 5.95805664E+03 -3.38855615E+03 -1.70645898E+03 6.04703271E+03 + -3.29212500E+03 -1.65895398E+03 6.05525244E+03 -3.51376123E+03 + -1.70609802E+03 6.13223633E+03 -3.42003906E+03 -1.65800195E+03 + 6.15175049E+03 -3.63406787E+03 -1.70558301E+03 6.21052734E+03 + -3.55628809E+03 -1.65893799E+03 6.24615430E+03 -3.75198877E+03 + -1.70383203E+03 6.28819238E+03 -3.69520020E+03 -1.65728894E+03 + 6.33057959E+03 -3.87945703E+03 -1.71152698E+03 6.36271973E+03 + -3.84201904E+03 -1.65597498E+03 6.41782861E+03 -4.00152490E+03 + -1.71313904E+03 6.43641162E+03 -3.99361377E+03 -1.65487000E+03 + 6.50256250E+03 -4.12731494E+03 -1.71515906E+03 6.50850732E+03 + -4.14290088E+03 -1.66856201E+03 6.58446729E+03 -4.26079004E+03 + -1.71766003E+03 6.58583350E+03 -4.28696191E+03 -1.67142700E+03 + 4.92205273E+03 -1.02516895E+03 -1.71401404E+03 4.87374951E+03 + -1.02592480E+03 -1.63968994E+03 5.00181445E+03 -1.16101514E+03 + -1.71111597E+03 4.95402246E+03 -1.16495117E+03 -1.63454797E+03 + 5.08192041E+03 -1.29561914E+03 -1.70777405E+03 5.03478369E+03 + -1.30479004E+03 -1.62915405E+03 5.15980371E+03 -1.42922021E+03 + -1.70103503E+03 5.11496436E+03 -1.44587500E+03 -1.62200000E+03 + 5.23740869E+03 -1.56102588E+03 -1.69659900E+03 5.19497656E+03 + -1.58905176E+03 -1.61313696E+03 5.31174854E+03 -1.69092383E+03 + -1.69432800E+03 5.27790332E+03 -1.73433496E+03 -1.60515405E+03 + 5.37513965E+03 -1.82288379E+03 -1.69058899E+03 5.37052637E+03 + -1.87856494E+03 -1.59962598E+03 5.41004443E+03 -1.96825293E+03 + -1.68682495E+03 5.48764844E+03 -2.01330420E+03 -1.59480798E+03 + 5.42512646E+03 -2.13839697E+03 -1.68336597E+03 5.63368262E+03 + -2.12276709E+03 -1.58913501E+03 5.48820654E+03 -2.28822510E+03 + -1.68294202E+03 5.64068750E+03 -2.26002686E+03 -1.62434595E+03 + 5.55640771E+03 -2.43756201E+03 -1.68670703E+03 5.74215967E+03 + -2.38991211E+03 -1.61537598E+03 5.62327637E+03 -2.59315820E+03 + -1.69403003E+03 5.84161328E+03 -2.51638086E+03 -1.60779199E+03 + 5.70137744E+03 -2.75031689E+03 -1.70119800E+03 5.93771826E+03 + -2.63750195E+03 -1.60195105E+03 5.79458154E+03 -2.90305811E+03 + -1.70540100E+03 6.02563867E+03 -2.75660498E+03 -1.59865698E+03 + 5.89165771E+03 -3.05297119E+03 -1.70662402E+03 6.10952148E+03 + -2.87342480E+03 -1.59644800E+03 5.98595459E+03 -3.20346924E+03 + -1.70645898E+03 6.19700635E+03 -2.98049023E+03 -1.59341394E+03 + 6.08963232E+03 -3.33629688E+03 -1.70480505E+03 6.27733252E+03 + -3.08867480E+03 -1.59168604E+03 6.19358545E+03 -3.45536523E+03 + -1.70417798E+03 6.25677246E+03 -3.35647021E+03 -1.65782397E+03 + 6.29079346E+03 -3.57601807E+03 -1.70484900E+03 6.33920459E+03 + -3.48591211E+03 -1.65943994E+03 6.38468262E+03 -3.69414209E+03 + -1.70425000E+03 6.42055469E+03 -3.61521924E+03 -1.65815198E+03 + 6.47449756E+03 -3.81259717E+03 -1.70408606E+03 6.49735742E+03 + -3.75525293E+03 -1.65852600E+03 6.55885840E+03 -3.93856787E+03 + -1.71132104E+03 6.57438330E+03 -3.89783887E+03 -1.65453406E+03 + 6.64300342E+03 -4.06149512E+03 -1.71355005E+03 6.65059961E+03 + -4.04620801E+03 -1.65121594E+03 6.72496338E+03 -4.18960986E+03 + -1.71826099E+03 6.72724756E+03 -4.19504688E+03 -1.64905505E+03 + 5.05779736E+03 -9.39201172E+02 -1.72100098E+03 5.02064453E+03 + -9.48437012E+02 -1.64096802E+03 5.12231445E+03 -1.08008984E+03 + -1.68226599E+03 5.10092041E+03 -1.08704102E+03 -1.63644604E+03 + 5.20337842E+03 -1.21625781E+03 -1.67767700E+03 5.18114551E+03 + -1.22642676E+03 -1.63162598E+03 5.28380273E+03 -1.35183398E+03 + -1.67053101E+03 5.25995654E+03 -1.36758203E+03 -1.62388098E+03 + 5.36160156E+03 -1.48873291E+03 -1.65909399E+03 5.33636768E+03 + -1.51270508E+03 -1.61281299E+03 5.43942139E+03 -1.62595020E+03 + -1.64957495E+03 5.41264648E+03 -1.66207520E+03 -1.60348499E+03 + 5.52102734E+03 -1.75736914E+03 -1.64638306E+03 5.49244336E+03 + -1.81294287E+03 -1.59867700E+03 5.59907031E+03 -1.88972217E+03 + -1.64227698E+03 5.58017236E+03 -1.96406299E+03 -1.59395703E+03 + 5.65729541E+03 -1.95794482E+03 -1.68743604E+03 5.68400244E+03 + -2.10233105E+03 -1.58825195E+03 5.70017773E+03 -2.13855615E+03 + -1.67511499E+03 5.80056055E+03 -2.22630322E+03 -1.57679504E+03 + 5.76848828E+03 -2.30740723E+03 -1.66397498E+03 5.91444141E+03 + -2.33922705E+03 -1.56610706E+03 5.85015137E+03 -2.46544922E+03 + -1.65595105E+03 5.93310449E+03 -2.45772900E+03 -1.60751697E+03 + 5.93948828E+03 -2.61544482E+03 -1.65106006E+03 6.02476855E+03 + -2.58637402E+03 -1.60205103E+03 6.03234326E+03 -2.75869287E+03 + -1.64833301E+03 6.11225928E+03 -2.71157422E+03 -1.59969202E+03 + 6.12270947E+03 -2.89883887E+03 -1.64830701E+03 6.19920654E+03 + -2.83199219E+03 -1.59805603E+03 6.20710840E+03 -3.04102197E+03 + -1.65270105E+03 6.28962939E+03 -2.94120215E+03 -1.59448206E+03 + 6.23424854E+03 -3.27387402E+03 -1.70428699E+03 6.37377441E+03 + -3.04774609E+03 -1.59365405E+03 6.33472461E+03 -3.40448584E+03 + -1.70585303E+03 6.44826660E+03 -3.16487012E+03 -1.59549597E+03 + 6.43367871E+03 -3.52529883E+03 -1.70612097E+03 6.47059033E+03 + -3.42143408E+03 -1.65854297E+03 6.52798730E+03 -3.64215576E+03 + -1.70558899E+03 6.55364160E+03 -3.54345117E+03 -1.65804895E+03 + 6.61767871E+03 -3.75717676E+03 -1.70522095E+03 6.63280029E+03 + -3.67526611E+03 -1.65837805E+03 6.70380664E+03 -3.86930811E+03 + -1.70250195E+03 6.71077832E+03 -3.81276514E+03 -1.65638599E+03 + 6.78634229E+03 -3.98704590E+03 -1.69839294E+03 6.78847852E+03 + -3.95494482E+03 -1.65119897E+03 6.86642236E+03 -4.12287012E+03 + -1.71959900E+03 6.86675537E+03 -4.09925391E+03 -1.64685596E+03 + 5.18609229E+03 -8.58026855E+02 -1.69411694E+03 5.16647559E+03 + -8.69708984E+02 -1.64741602E+03 5.26823340E+03 -9.93839844E+02 + -1.69012000E+03 5.24642236E+03 -1.00736914E+03 -1.64339502E+03 + 5.34914453E+03 -1.12962109E+03 -1.68223303E+03 5.32514648E+03 + -1.14648486E+03 -1.63581799E+03 5.42844043E+03 -1.26563379E+03 + -1.67083203E+03 5.40221826E+03 -1.28789697E+03 -1.62502502E+03 + 5.50497266E+03 -1.40376807E+03 -1.65566797E+03 5.47550342E+03 + -1.43501807E+03 -1.60988501E+03 5.58430566E+03 -1.53890381E+03 + -1.64669104E+03 5.55084766E+03 -1.58338086E+03 -1.60107703E+03 + 5.66481836E+03 -1.67127686E+03 -1.64069202E+03 5.62947266E+03 + -1.73156494E+03 -1.59576196E+03 5.74306543E+03 -1.80404883E+03 + -1.63496106E+03 5.71294141E+03 -1.87930176E+03 -1.59026099E+03 + 5.81747656E+03 -1.93992188E+03 -1.63031702E+03 5.80267969E+03 + -2.02311523E+03 -1.58340698E+03 5.89036426E+03 -2.08618311E+03 + -1.62295703E+03 5.89905859E+03 -2.15752100E+03 -1.57536206E+03 + 5.93639160E+03 -2.18343018E+03 -1.66470496E+03 5.99997949E+03 + -2.28375977E+03 -1.56550000E+03 6.00668848E+03 -2.35516797E+03 + -1.65465698E+03 6.09879932E+03 -2.40221484E+03 -1.55700195E+03 + 6.08701563E+03 -2.51728223E+03 -1.64856104E+03 6.18998340E+03 + -2.51574023E+03 -1.55158801E+03 6.17324756E+03 -2.67209619E+03 + -1.64530798E+03 6.21992627E+03 -2.65113184E+03 -1.60092395E+03 + 6.25877051E+03 -2.82346484E+03 -1.64774695E+03 6.30610449E+03 + -2.77990283E+03 -1.59905505E+03 6.34187646E+03 -2.97606592E+03 + -1.65596704E+03 6.39352051E+03 -2.89866113E+03 -1.59594495E+03 + 6.42452441E+03 -3.13072705E+03 -1.66830798E+03 6.47490967E+03 + -3.01557910E+03 -1.59742505E+03 6.49526465E+03 -3.33332910E+03 + -1.70559399E+03 6.55259229E+03 -3.12947314E+03 -1.60036902E+03 + 6.58832471E+03 -3.47088916E+03 -1.70590601E+03 6.62877539E+03 + -3.23670410E+03 -1.60215100E+03 6.68029834E+03 -3.59100391E+03 + -1.70616199E+03 6.68982129E+03 -3.48170605E+03 -1.65847400E+03 + 6.76725244E+03 -3.70426416E+03 -1.70542200E+03 6.76974951E+03 + -3.60612207E+03 -1.65867896E+03 6.84995557E+03 -3.81399219E+03 + -1.70408606E+03 6.84829248E+03 -3.73696777E+03 -1.65723999E+03 + 6.92975342E+03 -3.92175684E+03 -1.69876196E+03 6.92653857E+03 + -3.87379297E+03 -1.65296899E+03 7.00811230E+03 -4.04013477E+03 + -1.69072400E+03 7.00519873E+03 -4.01233984E+03 -1.64426904E+03 + 5.33434131E+03 -7.69230957E+02 -1.69767004E+03 5.30761328E+03 + -7.90181152E+02 -1.65167505E+03 5.41753271E+03 -9.04305176E+02 + -1.69357605E+03 5.38844971E+03 -9.26674805E+02 -1.64748804E+03 + 5.49796143E+03 -1.04047412E+03 -1.68499402E+03 5.46675635E+03 + -1.06568408E+03 -1.63856396E+03 5.57476270E+03 -1.17860303E+03 + -1.67118799E+03 5.54105566E+03 -1.20902490E+03 -1.62371106E+03 + 5.65279150E+03 -1.31499902E+03 -1.65852795E+03 5.61446826E+03 + -1.35535400E+03 -1.60894104E+03 5.73242334E+03 -1.44904590E+03 + -1.64771106E+03 5.68862646E+03 -1.50374023E+03 -1.59806799E+03 + 5.81337646E+03 -1.57985791E+03 -1.64012305E+03 5.76443262E+03 + -1.65388916E+03 -1.58947302E+03 5.89363574E+03 -1.70767383E+03 + -1.63550903E+03 5.84665234E+03 -1.79959717E+03 -1.58403894E+03 + 5.96908838E+03 -1.84077783E+03 -1.63033496E+03 5.93368066E+03 + -1.93869189E+03 -1.57988000E+03 6.04202148E+03 -1.98102393E+03 + -1.62525098E+03 6.02181738E+03 -2.07529199E+03 -1.57389001E+03 + 6.11479834E+03 -2.13028809E+03 -1.61860901E+03 6.11091553E+03 + -2.20848682E+03 -1.56700098E+03 6.19112158E+03 -2.28473584E+03 + -1.60901599E+03 6.19978760E+03 -2.33854688E+03 -1.55847595E+03 + 6.25691162E+03 -2.40618799E+03 -1.64818201E+03 6.28636670E+03 + -2.46013916E+03 -1.55283496E+03 6.33774561E+03 -2.56947705E+03 + -1.64198401E+03 6.36939355E+03 -2.57823291E+03 -1.54929102E+03 + 6.42109766E+03 -2.72536084E+03 -1.64138196E+03 6.44948535E+03 + -2.69285400E+03 -1.54625598E+03 6.50426758E+03 -2.88029590E+03 + -1.64864404E+03 6.51478857E+03 -2.84324023E+03 -1.59972400E+03 + 6.58772559E+03 -3.04034912E+03 -1.66351794E+03 6.59401660E+03 + -2.97251514E+03 -1.60423303E+03 6.67297656E+03 -3.19532813E+03 + -1.67402600E+03 6.67187158E+03 -3.09301221E+03 -1.60685999E+03 + 6.76038135E+03 -3.39089502E+03 -1.70474304E+03 6.74799854E+03 + -3.20354688E+03 -1.60780103E+03 6.84475537E+03 -3.53014697E+03 + -1.70527600E+03 6.82273730E+03 -3.31324219E+03 -1.60862695E+03 + 6.92437549E+03 -3.64702783E+03 -1.70400000E+03 6.91142334E+03 + -3.54441992E+03 -1.65745398E+03 7.00050732E+03 -3.75325977E+03 + -1.70100305E+03 6.98794629E+03 -3.66584424E+03 -1.65462402E+03 + 7.07470850E+03 -3.85317578E+03 -1.69346106E+03 7.06482666E+03 + -3.79270410E+03 -1.64812805E+03 7.14975439E+03 -3.96427588E+03 + -1.68327100E+03 7.14288770E+03 -3.92489111E+03 -1.63656604E+03 + 5.48155029E+03 -6.82663086E+02 -1.69456799E+03 5.44318164E+03 + -7.13219238E+02 -1.64959998E+03 5.56630273E+03 -8.16329102E+02 + -1.69328503E+03 5.52759863E+03 -8.46901855E+02 -1.64831897E+03 + 5.64667041E+03 -9.52498047E+02 -1.68661694E+03 5.60668652E+03 + -9.85216797E+02 -1.64048401E+03 5.72017773E+03 -1.09351221E+03 + -1.67119897E+03 5.67913672E+03 -1.12986523E+03 -1.62481104E+03 + 5.79704053E+03 -1.23124902E+03 -1.65763000E+03 5.75220752E+03 + -1.27581689E+03 -1.61015002E+03 5.87857471E+03 -1.36351123E+03 + -1.64796802E+03 5.82715771E+03 -1.42213818E+03 -1.59906396E+03 + 5.96521729E+03 -1.48731494E+03 -1.64407104E+03 5.90662061E+03 + -1.56528516E+03 -1.59317896E+03 6.04846533E+03 -1.61115381E+03 + -1.64020398E+03 5.98758740E+03 -1.70828516E+03 -1.58789795E+03 + 6.12578467E+03 -1.74168604E+03 -1.63548499E+03 6.06975635E+03 + -1.85051611E+03 -1.58237195E+03 6.19848828E+03 -1.88294385E+03 + -1.62989600E+03 6.15273242E+03 -1.99113379E+03 -1.57620605E+03 + 6.27027246E+03 -2.03211279E+03 -1.62414294E+03 6.23824561E+03 + -2.12306982E+03 -1.57296802E+03 6.34519141E+03 -2.18028320E+03 + -1.62155798E+03 6.32151953E+03 -2.25510889E+03 -1.56840198E+03 + 6.42058740E+03 -2.33416016E+03 -1.61524500E+03 6.40282373E+03 + -2.38579980E+03 -1.56290503E+03 6.49799170E+03 -2.48434717E+03 + -1.60912500E+03 6.48220166E+03 -2.51400195E+03 -1.55753894E+03 + 6.59073438E+03 -2.62164697E+03 -1.64858704E+03 6.55861426E+03 + -2.63906787E+03 -1.55069604E+03 6.67237256E+03 -2.77947217E+03 + -1.64931702E+03 6.63356641E+03 -2.75799023E+03 -1.54855896E+03 + 6.75404443E+03 -2.93255615E+03 -1.65084998E+03 6.70678857E+03 + -2.87363623E+03 -1.55112903E+03 6.83817871E+03 -3.08629590E+03 + -1.65957703E+03 6.77795166E+03 -2.98471094E+03 -1.55487695E+03 + 6.91896045E+03 -3.23591113E+03 -1.66552197E+03 6.88553174E+03 + -3.16529883E+03 -1.61431995E+03 7.01705371E+03 -3.44124023E+03 + -1.70009497E+03 6.95880957E+03 -3.28127686E+03 -1.61476196E+03 + 7.08571729E+03 -3.57561182E+03 -1.69817700E+03 7.03416357E+03 + -3.40013623E+03 -1.61523901E+03 7.15232666E+03 -3.68259717E+03 + -1.69362402E+03 7.12957861E+03 -3.59672803E+03 -1.64920105E+03 + 7.21958936E+03 -3.77729297E+03 -1.68431702E+03 7.20315771E+03 + -3.71440088E+03 -1.64107495E+03 7.29127734E+03 -3.88651123E+03 + -1.67500806E+03 7.27985352E+03 -3.83975293E+03 -1.62868994E+03 + 5.62507861E+03 -6.00204102E+02 -1.69206897E+03 5.57286963E+03 + -6.39879883E+02 -1.64613000E+03 5.71102148E+03 -7.32606934E+02 + -1.69120801E+03 5.66104736E+03 -7.71144043E+02 -1.64545496E+03 + 5.78859668E+03 -8.70853027E+02 -1.68165698E+03 5.74002637E+03 + -9.09751953E+02 -1.63635999E+03 5.86218164E+03 -1.01195313E+03 + -1.66667603E+03 5.81136670E+03 -1.05535205E+03 -1.62000806E+03 + 5.94063037E+03 -1.14863623E+03 -1.65532495E+03 5.88554541E+03 + -1.20005908E+03 -1.60701794E+03 6.02537646E+03 -1.27832178E+03 + -1.64932202E+03 5.96420264E+03 -1.34195313E+03 -1.59918506E+03 + 6.11324170E+03 -1.40225000E+03 -1.64665002E+03 6.04636426E+03 + -1.48094092E+03 -1.59524500E+03 6.19724463E+03 -1.52764111E+03 + -1.64323804E+03 6.12728271E+03 -1.62193604E+03 -1.59097900E+03 + 6.27646240E+03 -1.65820215E+03 -1.63957898E+03 6.20790332E+03 + -1.76355615E+03 -1.58677502E+03 6.35105127E+03 -1.79764209E+03 + -1.63555701E+03 6.28871436E+03 -1.90420703E+03 -1.58256201E+03 + 6.42532764E+03 -1.94158887E+03 -1.63303699E+03 6.37181934E+03 + -2.03877197E+03 -1.58036804E+03 6.50165039E+03 -2.08695020E+03 + -1.63265698E+03 6.45575537E+03 -2.16843896E+03 -1.58002405E+03 + 6.58063867E+03 -2.23266699E+03 -1.63408398E+03 6.53955127E+03 + -2.29612988E+03 -1.58112903E+03 6.66177539E+03 -2.37969922E+03 + -1.63556299E+03 6.61972656E+03 -2.42841113E+03 -1.57891504E+03 + 6.73093164E+03 -2.53818506E+03 -1.61940796E+03 6.68968652E+03 + -2.56726318E+03 -1.56513098E+03 6.80381836E+03 -2.68552881E+03 + -1.61028101E+03 6.76116650E+03 -2.69745410E+03 -1.55844702E+03 + 6.88126465E+03 -2.82668213E+03 -1.61032800E+03 6.83418262E+03 + -2.82294678E+03 -1.55898999E+03 7.01280957E+03 -2.98491504E+03 + -1.66585596E+03 6.90617969E+03 -2.94645313E+03 -1.56223999E+03 + 7.09281836E+03 -3.13796924E+03 -1.66861304E+03 6.97447266E+03 + -3.06410010E+03 -1.56354004E+03 7.16579248E+03 -3.29622119E+03 + -1.66999695E+03 7.04399756E+03 -3.16372119E+03 -1.56303796E+03 + 7.24965674E+03 -3.50045996E+03 -1.69076001E+03 7.18314063E+03 + -3.36148193E+03 -1.62180798E+03 7.30550342E+03 -3.61868604E+03 + -1.68725806E+03 7.27559570E+03 -3.53658887E+03 -1.64594299E+03 + 7.36805273E+03 -3.71093018E+03 -1.68254199E+03 7.34576074E+03 + -3.64912891E+03 -1.63919104E+03 7.43680273E+03 -3.81787012E+03 + -1.67729297E+03 7.42098242E+03 -3.77165918E+03 -1.63064905E+03 + 5.76523340E+03 -5.20337891E+02 -1.69378101E+03 5.70211572E+03 + -5.66136719E+02 -1.64679602E+03 5.84934668E+03 -6.53869141E+02 + -1.68910400E+03 5.79167969E+03 -6.97240234E+02 -1.64339001E+03 + 5.92915430E+03 -7.90296875E+02 -1.68043799E+03 5.87207031E+03 + -8.35099121E+02 -1.63321301E+03 6.00518750E+03 -9.29498047E+02 + -1.66783105E+03 5.94782568E+03 -9.77026855E+02 -1.61968005E+03 + 6.08188428E+03 -1.06806885E+03 -1.65567505E+03 6.02320264E+03 + -1.12014307E+03 -1.60704700E+03 6.16495068E+03 -1.20046289E+03 + -1.64945801E+03 6.10358447E+03 -1.25963086E+03 -1.60031702E+03 + 6.25050537E+03 -1.32916016E+03 -1.64656006E+03 6.18546338E+03 + -1.39806689E+03 -1.59658704E+03 6.33265137E+03 -1.46016992E+03 + -1.64306799E+03 6.26552051E+03 -1.53876318E+03 -1.59303003E+03 + 6.41256641E+03 -1.59355518E+03 -1.64041003E+03 6.34434033E+03 + -1.68107910E+03 -1.58971802E+03 6.48896729E+03 -1.73255176E+03 + -1.63744202E+03 6.42267871E+03 -1.82358789E+03 -1.58649402E+03 + 6.56716748E+03 -1.87112793E+03 -1.63722302E+03 6.50440234E+03 + -1.95991602E+03 -1.58582300E+03 6.65074072E+03 -2.00516992E+03 + -1.64197705E+03 6.58931543E+03 -2.08945508E+03 -1.58777600E+03 + 6.73545947E+03 -2.14224902E+03 -1.64742297E+03 6.67964941E+03 + -2.21098584E+03 -1.59488196E+03 6.81622656E+03 -2.28880615E+03 + -1.64723401E+03 6.76145361E+03 -2.34390381E+03 -1.59397705E+03 + 6.88972168E+03 -2.44316309E+03 -1.63836206E+03 6.83146729E+03 + -2.48597900E+03 -1.58223706E+03 6.96211963E+03 -2.59406104E+03 + -1.62866003E+03 6.90337939E+03 -2.62209180E+03 -1.57492102E+03 + 7.03730957E+03 -2.73894189E+03 -1.62342004E+03 6.97638135E+03 + -2.75516895E+03 -1.57202197E+03 7.11415332E+03 -2.87999805E+03 + -1.62194104E+03 7.04921533E+03 -2.88752002E+03 -1.57215405E+03 + 7.18636035E+03 -3.01859619E+03 -1.61912402E+03 7.11446143E+03 + -3.02095020E+03 -1.56966199E+03 7.35497559E+03 -3.16839404E+03 + -1.67843103E+03 7.17632373E+03 -3.14642676E+03 -1.56665906E+03 + 7.42918164E+03 -3.39393799E+03 -1.68609302E+03 7.25656250E+03 + -3.22204395E+03 -1.56755896E+03 7.46122949E+03 -3.56238477E+03 + -1.68463098E+03 7.42208252E+03 -3.47900391E+03 -1.64116797E+03 + 7.51931836E+03 -3.63649609E+03 -1.68341394E+03 7.49049463E+03 + -3.58265820E+03 -1.63692603E+03 7.58417627E+03 -3.74241016E+03 + -1.68100098E+03 7.56465674E+03 -3.70437500E+03 -1.63288696E+03 + 5.94736670E+03 -4.09982422E+02 -1.72727002E+03 5.82698438E+03 + -4.95724609E+02 -1.64837000E+03 6.02441064E+03 -5.46866211E+02 + -1.71869995E+03 5.91746338E+03 -6.27345215E+02 -1.64190295E+03 + 6.06244629E+03 -7.14942871E+02 -1.67925098E+03 6.00191357E+03 + -7.62478027E+02 -1.63175195E+03 6.13678174E+03 -8.56041992E+02 + -1.66546497E+03 6.08099658E+03 -9.01721191E+02 -1.61882495E+03 + 6.21312549E+03 -9.95702148E+02 -1.65385901E+03 6.15887354E+03 + -1.04229004E+03 -1.60688403E+03 6.29542773E+03 -1.13008594E+03 + -1.64865601E+03 6.23953271E+03 -1.18096387E+03 -1.59985095E+03 + 6.37739063E+03 -1.26433398E+03 -1.64498804E+03 6.32053369E+03 + -1.31969922E+03 -1.59567102E+03 6.45680762E+03 -1.40085693E+03 + -1.64120605E+03 6.39953467E+03 -1.46072803E+03 -1.59214697E+03 + 6.53620947E+03 -1.53755322E+03 -1.63943396E+03 6.47741162E+03 + -1.60309180E+03 -1.58942297E+03 6.61791162E+03 -1.67185986E+03 + -1.64126404E+03 6.55817041E+03 -1.74174316E+03 -1.59004895E+03 + 6.70150439E+03 -1.80438916E+03 -1.64543103E+03 6.64238965E+03 + -1.87507617E+03 -1.59385400E+03 6.78708740E+03 -1.93600586E+03 + -1.65092102E+03 6.73035449E+03 -2.00252783E+03 -1.60056299E+03 + 6.87056445E+03 -2.07276514E+03 -1.65351294E+03 6.81513330E+03 + -2.13302100E+03 -1.60365198E+03 6.95238037E+03 -2.21445410E+03 + -1.65334802E+03 6.89620459E+03 -2.26715088E+03 -1.60258105E+03 + 7.03335254E+03 -2.35918408E+03 -1.65119495E+03 6.97306152E+03 + -2.40421094E+03 -1.59746802E+03 7.11156445E+03 -2.50569482E+03 + -1.64590906E+03 7.04618164E+03 -2.54219580E+03 -1.58989404E+03 + 7.19013330E+03 -2.64954785E+03 -1.64130603E+03 7.11924854E+03 + -2.67870605E+03 -1.58400195E+03 7.26654346E+03 -2.79134277E+03 + -1.63644202E+03 7.19173828E+03 -2.81502197E+03 -1.57961902E+03 + 7.33793262E+03 -2.93157520E+03 -1.62979504E+03 7.26094531E+03 + -2.95310010E+03 -1.57474500E+03 7.40689453E+03 -3.07130713E+03 + -1.62271594E+03 7.33009229E+03 -3.09066699E+03 -1.57133496E+03 + 7.59331348E+03 -3.18923096E+03 -1.68783606E+03 7.40834326E+03 + -3.21995996E+03 -1.57389404E+03 7.62661328E+03 -3.41223682E+03 + -1.68279199E+03 7.50444336E+03 -3.32550391E+03 -1.57854504E+03 + 7.66788135E+03 -3.52130811E+03 -1.68283301E+03 7.63407129E+03 + -3.49506494E+03 -1.63380505E+03 7.72921338E+03 -3.64712793E+03 + -1.68252197E+03 7.70722656E+03 -3.62519824E+03 -1.63227698E+03 + 6.08113037E+03 -3.34801758E+02 -1.73184302E+03 6.01196240E+03 + -3.82931641E+02 -1.68664001E+03 6.15928564E+03 -4.70703125E+02 + -1.72247595E+03 6.04545752E+03 -5.55118164E+02 -1.64191504E+03 + 6.23889258E+03 -6.05573242E+02 -1.71428601E+03 6.13045068E+03 + -6.90882813E+02 -1.63160303E+03 6.31930762E+03 -7.40169922E+02 + -1.70778503E+03 6.21124268E+03 -8.29416016E+02 -1.61992297E+03 + 6.39980371E+03 -8.75287109E+02 -1.70322205E+03 6.29103564E+03 + -9.68170898E+02 -1.60919397E+03 6.48023633E+03 -1.01057324E+03 + -1.70051794E+03 6.37193359E+03 -1.10589209E+03 -1.60154797E+03 + 6.50557031E+03 -1.19574414E+03 -1.64687695E+03 6.45272266E+03 + -1.24402686E+03 -1.59641699E+03 6.58374951E+03 -1.33452979E+03 + -1.64352600E+03 6.53247559E+03 -1.38344092E+03 -1.59331799E+03 + 6.66285840E+03 -1.47256592E+03 -1.64287598E+03 6.61222363E+03 + -1.52296289E+03 -1.59236499E+03 6.74419531E+03 -1.60833008E+03 + -1.64612402E+03 6.69472266E+03 -1.65937988E+03 -1.59545203E+03 + 6.82563232E+03 -1.74401318E+03 -1.65003796E+03 6.77708740E+03 + -1.79518799E+03 -1.59897900E+03 6.90835742E+03 -1.87875586E+03 + -1.65378101E+03 6.86070557E+03 -1.92870313E+03 -1.60353796E+03 + 6.99182959E+03 -2.01365479E+03 -1.65669995E+03 6.94372266E+03 + -2.06179004E+03 -1.60646301E+03 7.07511230E+03 -2.15033398E+03 + -1.65820300E+03 7.02611230E+03 -2.19457617E+03 -1.60759900E+03 + 7.15887061E+03 -2.28850488E+03 -1.65889294E+03 7.10792041E+03 + -2.32737207E+03 -1.60727502E+03 7.24408350E+03 -2.42724316E+03 + -1.65959595E+03 7.18898535E+03 -2.46087012E+03 -1.60584998E+03 + 7.32890869E+03 -2.56641113E+03 -1.65899402E+03 7.26939258E+03 + -2.59549512E+03 -1.60387402E+03 7.41173730E+03 -2.70518896E+03 + -1.65701404E+03 7.34760840E+03 -2.73193213E+03 -1.60042297E+03 + 7.48903760E+03 -2.84576221E+03 -1.65242297E+03 7.42207227E+03 + -2.86986719E+03 -1.59443506E+03 7.55784473E+03 -2.98818506E+03 + -1.64260400E+03 7.49215234E+03 -3.00826221E+03 -1.58505701E+03 + 7.63151270E+03 -3.13069189E+03 -1.63945203E+03 7.57427344E+03 + -3.13947705E+03 -1.58553296E+03 7.74778369E+03 -3.26456885E+03 + -1.68735095E+03 7.65988232E+03 -3.27073486E+03 -1.58827795E+03 + 7.80262451E+03 -3.41178223E+03 -1.68323804E+03 7.74652051E+03 + -3.40242920E+03 -1.59091602E+03 7.86826563E+03 -3.55139600E+03 + -1.68340796E+03 7.84763037E+03 -3.54283496E+03 -1.63267505E+03 + 6.20828564E+03 -2.63183594E+02 -1.73046899E+03 6.13683643E+03 + -3.12655273E+02 -1.68509302E+03 6.29061133E+03 -3.96983398E+02 + -1.72324402E+03 6.22223926E+03 -4.46913086E+02 -1.67597205E+03 + 6.36936768E+03 -5.33286133E+02 -1.71526697E+03 6.30621436E+03 + -5.81814453E+02 -1.66732397E+03 6.44804443E+03 -6.69867188E+02 + -1.70880005E+03 6.38834668E+03 -7.17821777E+02 -1.65936597E+03 + 6.52777539E+03 -8.05837891E+02 -1.70461499E+03 6.47185352E+03 + -8.52483887E+02 -1.65509302E+03 6.60770752E+03 -9.41915039E+02 + -1.70210803E+03 6.50444336E+03 -1.03070020E+03 -1.60622998E+03 + 6.68761865E+03 -1.07844482E+03 -1.70137695E+03 6.58297461E+03 + -1.17029395E+03 -1.60089197E+03 6.76772461E+03 -1.21498096E+03 + -1.70284802E+03 6.66168164E+03 -1.30957324E+03 -1.59793201E+03 + 6.85054053E+03 -1.34885986E+03 -1.70842395E+03 6.74168066E+03 + -1.44792480E+03 -1.59764197E+03 6.93449268E+03 -1.48124219E+03 + -1.71687805E+03 6.82330957E+03 -1.58499512E+03 -1.60040295E+03 + 7.01565039E+03 -1.61643213E+03 -1.72298706E+03 6.90516162E+03 + -1.72158496E+03 -1.60394495E+03 7.09584570E+03 -1.75350684E+03 + -1.72621997E+03 6.98905469E+03 -1.85562109E+03 -1.60840405E+03 + 7.17397559E+03 -1.89414795E+03 -1.72530603E+03 7.07251563E+03 + -1.98908594E+03 -1.61139404E+03 7.20048438E+03 -2.08233301E+03 + -1.66394604E+03 7.15656641E+03 -2.12110693E+03 -1.61397705E+03 + 7.28353369E+03 -2.21840381E+03 -1.66487805E+03 7.24027637E+03 + -2.25290381E+03 -1.61518103E+03 7.36792334E+03 -2.35445020E+03 + -1.66567603E+03 7.32393945E+03 -2.38477588E+03 -1.61553699E+03 + 7.45346973E+03 -2.49044287E+03 -1.66641199E+03 7.40721533E+03 + -2.51775293E+03 -1.61513306E+03 7.53998828E+03 -2.62581201E+03 + -1.66802502E+03 7.49192139E+03 -2.65124805E+03 -1.61626697E+03 + 7.62110352E+03 -2.76433594E+03 -1.66512903E+03 7.57227539E+03 + -2.78754590E+03 -1.61286206E+03 7.69383740E+03 -2.90716797E+03 + -1.65595300E+03 7.64695654E+03 -2.92571094E+03 -1.60363403E+03 + 7.76642139E+03 -3.04829590E+03 -1.64897095E+03 7.72488135E+03 + -3.06112207E+03 -1.59781604E+03 7.84108447E+03 -3.18589600E+03 + -1.64684497E+03 7.80618164E+03 -3.19498096E+03 -1.59550903E+03 + 7.93766748E+03 -3.32202979E+03 -1.68943298E+03 7.89032227E+03 + -3.32776904E+03 -1.59697302E+03 8.00644238E+03 -3.46359277E+03 + -1.68793799E+03 7.97511426E+03 -3.46139502E+03 -1.60172205E+03 + 6.34691748E+03 -1.82936523E+02 -1.73405603E+03 6.26380664E+03 + -2.41226563E+02 -1.68206799E+03 6.42526465E+03 -3.19896484E+02 + -1.72365198E+03 6.35253760E+03 -3.73368164E+02 -1.67487097E+03 + 6.50469141E+03 -4.56090820E+02 -1.71635596E+03 6.43699658E+03 + -5.08153320E+02 -1.66722302E+03 6.58160059E+03 -5.94467773E+02 + -1.70965198E+03 6.51945752E+03 -6.44134766E+02 -1.66062305E+03 + 6.65962256E+03 -7.32291992E+02 -1.70608997E+03 6.60264355E+03 + -7.79271973E+02 -1.65726794E+03 6.73736230E+03 -8.70609863E+02 + -1.70438196E+03 6.68457373E+03 -9.15251953E+02 -1.65556897E+03 + 6.81508643E+03 -1.00917578E+03 -1.70438599E+03 6.76495459E+03 + -1.05244678E+03 -1.65494702E+03 6.89354932E+03 -1.14727490E+03 + -1.70618396E+03 6.84431055E+03 -1.19051318E+03 -1.65508606E+03 + 6.97642529E+03 -1.28151611E+03 -1.71293298E+03 6.92616260E+03 + -1.32636084E+03 -1.65886096E+03 7.06365039E+03 -1.41168311E+03 + -1.72441602E+03 7.01097559E+03 -1.45943213E+03 -1.66717297E+03 + 7.14684229E+03 -1.54551514E+03 -1.73123596E+03 7.09434033E+03 + -1.59371680E+03 -1.67379004E+03 7.22856543E+03 -1.68117188E+03 + -1.73553894E+03 7.17770850E+03 -1.72804395E+03 -1.67910095E+03 + 7.30570947E+03 -1.82185498E+03 -1.73354504E+03 7.20292236E+03 + -1.91550391E+03 -1.61742798E+03 7.38143750E+03 -1.96470605E+03 + -1.72819995E+03 7.28747070E+03 -2.04768604E+03 -1.62032300E+03 + 7.45888232E+03 -2.10658301E+03 -1.72301599E+03 7.37206445E+03 + -2.17961816E+03 -1.62241003E+03 7.54001367E+03 -2.24574707E+03 + -1.72073596E+03 7.45674463E+03 -2.31177881E+03 -1.62345398E+03 + 7.62122949E+03 -2.38495605E+03 -1.71847595E+03 7.54149170E+03 + -2.44425000E+03 -1.62334204E+03 7.70101758E+03 -2.52549316E+03 + -1.71530103E+03 7.62485742E+03 -2.57787988E+03 -1.62093799E+03 + 7.74628271E+03 -2.68767090E+03 -1.66758105E+03 7.70800635E+03 + -2.71174219E+03 -1.61841504E+03 7.82565674E+03 -2.82653906E+03 + -1.66339502E+03 7.78739648E+03 -2.84792578E+03 -1.61143994E+03 + 7.90030469E+03 -2.96727783E+03 -1.65517297E+03 7.86596973E+03 + -2.98392480E+03 -1.60346301E+03 7.97735352E+03 -3.10535693E+03 + -1.65288098E+03 7.94803564E+03 -3.11782910E+03 -1.60082703E+03 + 8.05574463E+03 -3.24282910E+03 -1.65584900E+03 8.03257861E+03 + -3.25060205E+03 -1.60376904E+03 8.14607666E+03 -3.37809521E+03 + -1.69758801E+03 8.11620361E+03 -3.38447803E+03 -1.60730200E+03 + 6.48033154E+03 -1.06245117E+02 -1.73401294E+03 6.40716260E+03 + -1.58539063E+02 -1.68492004E+03 6.55804932E+03 -2.43992188E+02 + -1.72263306E+03 6.49055469E+03 -2.94398438E+02 -1.67503406E+03 + 6.63648926E+03 -3.81279297E+02 -1.71443005E+03 6.57216064E+03 + -4.31378906E+02 -1.66713501E+03 6.71580273E+03 -5.18067383E+02 + -1.70970398E+03 6.65262158E+03 -5.69044922E+02 -1.66111804E+03 + 6.79603662E+03 -6.54313965E+02 -1.70854895E+03 6.73367871E+03 + -7.06024902E+02 -1.65802197E+03 6.87321240E+03 -7.93310059E+02 + -1.70742798E+03 6.81439453E+03 -8.43120117E+02 -1.65707495E+03 + 6.95219238E+03 -9.30964844E+02 -1.70984998E+03 6.89508447E+03 + -9.80120117E+02 -1.65839099E+03 7.03249854E+03 -1.06756787E+03 + -1.71484595E+03 6.97809131E+03 -1.11502197E+03 -1.66364001E+03 + 7.11616260E+03 -1.20123682E+03 -1.72346106E+03 7.06261768E+03 + -1.24848877E+03 -1.67133398E+03 7.20111768E+03 -1.33365381E+03 + -1.73293506E+03 7.14973926E+03 -1.37952197E+03 -1.68171106E+03 + 7.28449365E+03 -1.46741602E+03 -1.74039905E+03 7.23413428E+03 + -1.51287598E+03 -1.68879199E+03 7.36434326E+03 -1.60450293E+03 + -1.74347900E+03 7.31534570E+03 -1.64910400E+03 -1.69134998E+03 + 7.44176953E+03 -1.74417090E+03 -1.74278601E+03 7.39434229E+03 + -1.78741992E+03 -1.68999304E+03 7.51733350E+03 -1.88609180E+03 + -1.73836694E+03 7.47123438E+03 -1.92772314E+03 -1.68458203E+03 + 7.59189160E+03 -2.02936084E+03 -1.73091199E+03 7.54758545E+03 + -2.06847803E+03 -1.67695398E+03 7.67233447E+03 -2.16763721E+03 + -1.72883496E+03 7.62735156E+03 -2.20620605E+03 -1.67242102E+03 + 7.75286768E+03 -2.30544092E+03 -1.72577795E+03 7.70904541E+03 + -2.34244092E+03 -1.66983606E+03 7.83359131E+03 -2.44226709E+03 + -1.72286401E+03 7.76006250E+03 -2.50475586E+03 -1.62670898E+03 + 7.91201270E+03 -2.58191895E+03 -1.71859900E+03 7.84357568E+03 + -2.63849512E+03 -1.62294800E+03 7.95889746E+03 -2.74711719E+03 + -1.66819397E+03 7.92675537E+03 -2.77135596E+03 -1.61847705E+03 + 8.03790771E+03 -2.88528223E+03 -1.66460901E+03 8.00829053E+03 + -2.90564600E+03 -1.61300000E+03 8.11497656E+03 -3.02409424E+03 + -1.65998206E+03 8.08976465E+03 -3.03989697E+03 -1.60866602E+03 + 8.19372168E+03 -3.16153076E+03 -1.66107300E+03 8.17324268E+03 + -3.17297412E+03 -1.60990198E+03 8.27302539E+03 -3.29896582E+03 + -1.66666101E+03 8.25672949E+03 -3.30658203E+03 -1.61393799E+03 + 6.60865234E+03 -3.34560547E+01 -1.73255701E+03 6.54319043E+03 + -8.11113281E+01 -1.68347205E+03 6.68650537E+03 -1.71534180E+02 + -1.72052502E+03 6.62310449E+03 -2.19658203E+02 -1.67164502E+03 + 6.76758447E+03 -3.07156250E+02 -1.71375000E+03 6.70401367E+03 + -3.57365234E+02 -1.66398706E+03 6.84952344E+03 -4.42092773E+02 + -1.71060706E+03 6.78754736E+03 -4.92699219E+02 -1.66142200E+03 + 6.93125830E+03 -5.77264648E+02 -1.71023999E+03 6.87058740E+03 + -6.28071777E+02 -1.66107703E+03 7.01096240E+03 -7.14261230E+02 + -1.71097400E+03 6.95126465E+03 -7.65182129E+02 -1.66132300E+03 + 7.09253564E+03 -8.49770020E+02 -1.71568701E+03 7.03323828E+03 + -9.01023926E+02 -1.66512805E+03 7.17211865E+03 -9.87064941E+02 + -1.72052600E+03 7.11356836E+03 -1.03817920E+03 -1.66958301E+03 + 7.25243066E+03 -1.12375684E+03 -1.72680798E+03 7.19558252E+03 + -1.17380078E+03 -1.67637097E+03 7.33681250E+03 -1.25681201E+03 + -1.73664197E+03 7.28171143E+03 -1.30572412E+03 -1.68645898E+03 + 7.41840332E+03 -1.39227197E+03 -1.74326294E+03 7.36510254E+03 + -1.44001611E+03 -1.69292395E+03 7.49854541E+03 -1.52902490E+03 + -1.74726196E+03 7.44727148E+03 -1.57539014E+03 -1.69651794E+03 + 7.57746826E+03 -1.66698486E+03 -1.74850098E+03 7.52775049E+03 + -1.71231982E+03 -1.69652100E+03 7.65580566E+03 -1.80572314E+03 + -1.74756201E+03 7.60823926E+03 -1.84927686E+03 -1.69481006E+03 + 7.73443457E+03 -1.94447900E+03 -1.74559204E+03 7.68776367E+03 + -1.98716016E+03 -1.69065906E+03 7.81494434E+03 -2.08173291E+03 + -1.74468396E+03 7.77032129E+03 -2.12233789E+03 -1.68924597E+03 + 7.89236963E+03 -2.22172900E+03 -1.73904102E+03 7.85038672E+03 + -2.25985791E+03 -1.68418994E+03 7.96905273E+03 -2.36197705E+03 + -1.73179297E+03 7.93075146E+03 -2.39708203E+03 -1.67896704E+03 + 8.04727051E+03 -2.50020605E+03 -1.72653699E+03 7.98118555E+03 + -2.56263623E+03 -1.63009595E+03 8.12070166E+03 -2.64356299E+03 + -1.71559998E+03 8.06530371E+03 -2.69597021E+03 -1.62728601E+03 + 8.17639648E+03 -2.80374902E+03 -1.67419702E+03 8.14804834E+03 + -2.82872900E+03 -1.62229602E+03 8.25461621E+03 -2.94219482E+03 + -1.67051904E+03 8.23001855E+03 -2.96227295E+03 -1.61745605E+03 + 8.33388672E+03 -3.07955908E+03 -1.67181006E+03 8.31373535E+03 + -3.09477197E+03 -1.61905200E+03 8.41385547E+03 -3.21659619E+03 + -1.67890002E+03 8.39798633E+03 -3.22759180E+03 -1.62673901E+03 + 6.74509131E+03 4.49580078E+01 -1.73914905E+03 6.68208936E+03 + -1.59082031E+00 -1.68797998E+03 6.82410059E+03 -9.23828125E+01 + -1.72764294E+03 6.75950146E+03 -1.42055664E+02 -1.67459399E+03 + 6.90255273E+03 -2.30198242E+02 -1.71831201E+03 6.83887354E+03 + -2.81041992E+02 -1.66547803E+03 6.98333838E+03 -3.66232422E+02 + -1.71366296E+03 6.92115137E+03 -4.17473633E+02 -1.66140796E+03 + 7.06225439E+03 -5.03918945E+02 -1.71019202E+03 7.00173438E+03 + -5.54994141E+02 -1.65843103E+03 7.14302441E+03 -6.40149902E+02 + -1.71101196E+03 7.08523926E+03 -6.89770020E+02 -1.66052502E+03 + 7.22638574E+03 -7.74191895E+02 -1.71691504E+03 7.16946143E+03 + -8.23675781E+02 -1.66641504E+03 7.30843848E+03 -9.09379883E+02 + -1.72436902E+03 7.25072070E+03 -9.60001953E+02 -1.67292603E+03 + 7.38938770E+03 -1.04554297E+03 -1.73245801E+03 7.33250244E+03 + -1.09579004E+03 -1.68137097E+03 7.46907373E+03 -1.18280176E+03 + -1.73977197E+03 7.41441064E+03 -1.23142920E+03 -1.68953503E+03 + 7.54872559E+03 -1.32006006E+03 -1.74616003E+03 7.49505371E+03 + -1.36819678E+03 -1.69494299E+03 7.62957959E+03 -1.45619482E+03 + -1.75181897E+03 7.57724658E+03 -1.50360596E+03 -1.69954102E+03 + 7.70897754E+03 -1.59363379E+03 -1.75375195E+03 7.65871240E+03 + -1.63970020E+03 -1.70100098E+03 7.78893066E+03 -1.73062305E+03 + -1.75421106E+03 7.74110254E+03 -1.77496094E+03 -1.70137097E+03 + 7.87236963E+03 -1.86442578E+03 -1.75715503E+03 7.82575732E+03 + -1.90810596E+03 -1.70289099E+03 7.94927539E+03 -2.00443506E+03 + -1.75128796E+03 7.91147949E+03 -2.04021094E+03 -1.70500098E+03 + 8.02472363E+03 -2.14595020E+03 -1.74243701E+03 7.99223047E+03 + -2.17700391E+03 -1.70052405E+03 8.10505371E+03 -2.28274121E+03 + -1.73949902E+03 8.07063672E+03 -2.31603223E+03 -1.69238696E+03 + 8.18245459E+03 -2.42217578E+03 -1.73291504E+03 8.15215234E+03 + -2.45198779E+03 -1.68844495E+03 8.25520703E+03 -2.56589307E+03 + -1.71964795E+03 8.20477832E+03 -2.61681982E+03 -1.63942896E+03 + 8.32378613E+03 -2.71415723E+03 -1.69921497E+03 8.28934375E+03 + -2.74971094E+03 -1.63874304E+03 8.39515625E+03 -2.85987402E+03 + -1.68293799E+03 8.37490137E+03 -2.87943701E+03 -1.64017004E+03 + 8.47380469E+03 -2.99797803E+03 -1.68221301E+03 8.45680762E+03 + -3.01357422E+03 -1.63872302E+03 8.55454688E+03 -3.13418408E+03 + -1.69083899E+03 8.53908008E+03 -3.14793506E+03 -1.64236304E+03 + 6.88428564E+03 1.25274414E+02 -1.74920496E+03 6.83338672E+03 + 8.72626953E+01 -1.70580103E+03 6.96509131E+03 -1.07246094E+01 + -1.73926599E+03 6.90550732E+03 -5.69541016E+01 -1.68771399E+03 + 7.04431836E+03 -1.47925781E+02 -1.73046704E+03 6.98381543E+03 + -1.96576172E+02 -1.67738000E+03 7.12102734E+03 -2.87310547E+02 + -1.72198999E+03 7.05999658E+03 -3.37887695E+02 -1.66752600E+03 + 7.20213672E+03 -4.23190430E+02 -1.72006995E+03 7.14185254E+03 + -4.74332031E+02 -1.66512000E+03 7.28654541E+03 -5.56263672E+02 + -1.72406396E+03 7.22674561E+03 -6.07893555E+02 -1.66816699E+03 + 7.36929346E+03 -6.90761230E+02 -1.72963000E+03 7.31144531E+03 + -7.41354004E+02 -1.67456104E+03 7.44982568E+03 -8.27224121E+02 + -1.73606995E+03 7.39224951E+03 -8.78065918E+02 -1.68112402E+03 + 7.52978467E+03 -9.64219238E+02 -1.74426501E+03 7.47312646E+03 + -1.01464307E+03 -1.68962195E+03 7.60641260E+03 -1.10419580E+03 + -1.75031799E+03 7.55226465E+03 -1.15275000E+03 -1.69637000E+03 + 7.68300635E+03 -1.24421924E+03 -1.75553406E+03 7.63180859E+03 + -1.29052490E+03 -1.70203198E+03 7.76444434E+03 -1.37982422E+03 + -1.76315405E+03 7.71217236E+03 -1.42762207E+03 -1.70605396E+03 + 7.85195166E+03 -1.50973193E+03 -1.77453406E+03 7.79919727E+03 + -1.55862012E+03 -1.71480603E+03 7.93053467E+03 -1.64781494E+03 + -1.77342896E+03 7.89443848E+03 -1.68177100E+03 -1.73115002E+03 + 8.00939258E+03 -1.78567676E+03 -1.77040295E+03 7.97041553E+03 + -1.82294385E+03 -1.72323499E+03 8.08459473E+03 -1.92714111E+03 + -1.76087903E+03 8.05152930E+03 -1.95930420E+03 -1.71972400E+03 + 8.16099072E+03 -2.06760205E+03 -1.75148901E+03 8.13133545E+03 + -2.09695117E+03 -1.71347205E+03 8.24026172E+03 -2.20528223E+03 + -1.74556006E+03 8.20928613E+03 -2.23645020E+03 -1.70417505E+03 + 8.31750293E+03 -2.34498389E+03 -1.73746802E+03 8.28914453E+03 + -2.37397412E+03 -1.69728503E+03 8.39059570E+03 -2.48889795E+03 + -1.72407800E+03 8.36843359E+03 -2.51191309E+03 -1.69007202E+03 + 8.46192871E+03 -2.63463721E+03 -1.70792102E+03 8.44214551E+03 + -2.65546924E+03 -1.67425195E+03 8.53618945E+03 -2.77742480E+03 + -1.69683997E+03 8.51753320E+03 -2.79692676E+03 -1.66013196E+03 + 8.61402832E+03 -2.91639893E+03 -1.69381006E+03 8.59849902E+03 + -2.93252295E+03 -1.65753003E+03 8.69406250E+03 -3.05308398E+03 + -1.69870703E+03 8.67954492E+03 -3.06828320E+03 -1.65755396E+03 + 7.02435352E+03 2.06154297E+02 -1.76056104E+03 6.97645947E+03 + 1.70153320E+02 -1.71654395E+03 7.10329248E+03 6.86826172E+01 + -1.74937000E+03 7.05298242E+03 2.94580078E+01 -1.70261206E+03 + 7.18447266E+03 -6.70185547E+01 -1.74264697E+03 7.13407227E+03 + -1.07679688E+02 -1.69526904E+03 7.26436426E+03 -2.03772461E+02 + -1.73715295E+03 7.21238672E+03 -2.46959961E+02 -1.68769702E+03 + 7.34108545E+03 -3.43301758E+02 -1.73114502E+03 7.29324268E+03 + -3.84012695E+02 -1.68509998E+03 7.42363574E+03 -4.77958008E+02 + -1.73346497E+03 7.37515430E+03 -5.19993164E+02 -1.68632800E+03 + 7.50534766E+03 -6.13334961E+02 -1.73789099E+03 7.45484473E+03 + -6.57774902E+02 -1.68835999E+03 7.58601074E+03 -7.49653809E+02 + -1.74418994E+03 7.53399170E+03 -7.95965820E+02 -1.69259595E+03 + 7.66330859E+03 -8.89012207E+02 -1.74963196E+03 7.61432666E+03 + -9.33050781E+02 -1.69984399E+03 7.74186572E+03 -1.02727295E+03 + -1.75782202E+03 7.69100928E+03 -1.07342480E+03 -1.70383704E+03 + 7.81697461E+03 -1.16869824E+03 -1.76193994E+03 7.78159766E+03 + -1.20112695E+03 -1.72226196E+03 7.90301953E+03 -1.30003906E+03 + -1.77579102E+03 7.87357666E+03 -1.32735791E+03 -1.74115002E+03 + 7.99385547E+03 -1.42666699E+03 -1.79245703E+03 7.95368457E+03 + -1.46449316E+03 -1.74356897E+03 8.07045752E+03 -1.56654102E+03 + -1.78893298E+03 8.03828174E+03 -1.59735889E+03 -1.74877405E+03 + 8.14353174E+03 -1.70993604E+03 -1.77789502E+03 8.11347070E+03 + -1.73927588E+03 -1.73971594E+03 8.22031152E+03 -1.84988623E+03 + -1.76891895E+03 8.18951270E+03 -1.88056494E+03 -1.72944995E+03 + 8.29836230E+03 -1.98865479E+03 -1.76021204E+03 8.26756152E+03 + -2.01999023E+03 -1.72038904E+03 8.37644531E+03 -2.12743701E+03 + -1.75145398E+03 8.34578027E+03 -2.15928418E+03 -1.71097705E+03 + 8.45295508E+03 -2.26790723E+03 -1.74132397E+03 8.42361035E+03 + -2.29895801E+03 -1.70097400E+03 8.52697949E+03 -2.41108105E+03 + -1.72871204E+03 8.50066504E+03 -2.43937109E+03 -1.69002502E+03 + 8.60319629E+03 -2.55188818E+03 -1.72033801E+03 8.57966504E+03 + -2.57755811E+03 -1.68230200E+03 8.67969434E+03 -2.69235889E+03 + -1.71376196E+03 8.65896680E+03 -2.71529688E+03 -1.67579395E+03 + 8.75762988E+03 -2.83121924E+03 -1.71148499E+03 8.73930469E+03 + -2.85191602E+03 -1.67229199E+03 8.83651855E+03 -2.96900391E+03 + -1.71359900E+03 8.82052441E+03 -2.98766113E+03 -1.67241797E+03 + 7.16202344E+03 2.85148438E+02 -1.77094104E+03 7.11707959E+03 + 2.51291992E+02 -1.72454504E+03 7.23970850E+03 1.46619141E+02 + -1.75891895E+03 7.19505566E+03 1.11769531E+02 -1.71275500E+03 + 7.31911963E+03 9.38183594E+00 -1.75093799E+03 7.27549658E+03 + -2.58193359E+01 -1.70585400E+03 7.39847559E+03 -1.27942383E+02 + -1.74514001E+03 7.35751953E+03 -1.61982422E+02 -1.70292200E+03 + 7.47803467E+03 -2.65154297E+02 -1.74181201E+03 7.44079443E+03 + -2.96888672E+02 -1.70367200E+03 7.55929932E+03 -4.00931641E+02 + -1.74267004E+03 7.52176465E+03 -4.33588867E+02 -1.70462305E+03 + 7.64036670E+03 -5.36876953E+02 -1.74572900E+03 7.59902344E+03 + -5.73470703E+02 -1.70412598E+03 7.72009570E+03 -6.74021973E+02 + -1.74982397E+03 7.67737256E+03 -7.12388184E+02 -1.70666797E+03 + 7.79805371E+03 -8.12799805E+02 -1.75425000E+03 7.75858545E+03 + -8.48690918E+02 -1.71358997E+03 7.87898340E+03 -9.48889160E+02 + -1.76321899E+03 7.83254150E+03 -9.91623047E+02 -1.71365405E+03 + 7.95951563E+03 -1.08531299E+03 -1.77213098E+03 7.91755762E+03 + -1.12439600E+03 -1.72515002E+03 8.04246143E+03 -1.21940918E+03 + -1.78275098E+03 8.01395068E+03 -1.24633789E+03 -1.74903796E+03 + 8.12508447E+03 -1.35367920E+03 -1.79065198E+03 8.09497168E+03 + -1.38258398E+03 -1.75328406E+03 8.20343262E+03 -1.49198584E+03 + -1.78936499E+03 8.17271143E+03 -1.52202393E+03 -1.75021106E+03 + 8.28013867E+03 -1.63194482E+03 -1.78218298E+03 8.24957129E+03 + -1.66245508E+03 -1.74296204E+03 8.35780078E+03 -1.77102979E+03 + -1.77390796E+03 8.32650781E+03 -1.80297412E+03 -1.73371204E+03 + 8.43610156E+03 -1.90951221E+03 -1.76542102E+03 8.40419238E+03 + -1.94285693E+03 -1.72418005E+03 8.51363672E+03 -2.04883301E+03 + -1.75596204E+03 8.48161133E+03 -2.08309521E+03 -1.71381995E+03 + 8.58972266E+03 -2.18978516E+03 -1.74536597E+03 8.55905469E+03 + -2.22333887E+03 -1.70358105E+03 8.66664844E+03 -2.32987988E+03 + -1.73706396E+03 8.63787695E+03 -2.36201709E+03 -1.69548499E+03 + 8.74459766E+03 -2.46880811E+03 -1.73172803E+03 8.71870605E+03 + -2.49833594E+03 -1.69097302E+03 8.82201074E+03 -2.60828223E+03 + -1.72714197E+03 8.79894824E+03 -2.63525488E+03 -1.68642395E+03 + 8.89999414E+03 -2.74706006E+03 -1.72523901E+03 8.87985840E+03 + -2.77141113E+03 -1.68405200E+03 8.97852930E+03 -2.88515723E+03 + -1.72654199E+03 8.96125488E+03 -2.90703418E+03 -1.68431201E+03 + 7.29059766E+03 3.57237305E+02 -1.77363501E+03 7.25149463E+03 + 3.27860352E+02 -1.73062695E+03 7.36808154E+03 2.18247070E+02 + -1.76163904E+03 7.32991846E+03 1.88542969E+02 -1.71962305E+03 + 7.44679150E+03 8.01386719E+01 -1.75340503E+03 7.40947949E+03 + 5.01025391E+01 -1.71292200E+03 7.52561133E+03 -5.79228516E+01 + -1.74755396E+03 7.48998535E+03 -8.74921875E+01 -1.70989001E+03 + 7.60537354E+03 -1.95221680E+02 -1.74461499E+03 7.57139453E+03 + -2.24190430E+02 -1.70970703E+03 7.68684131E+03 -3.31031250E+02 + -1.74529602E+03 7.65182568E+03 -3.61581055E+02 -1.71045300E+03 + 7.76866553E+03 -4.66460938E+02 -1.74795898E+03 7.73100244E+03 + -4.99985352E+02 -1.71131299E+03 7.84986865E+03 -6.02390625E+02 + -1.75159399E+03 7.81145361E+03 -6.37186035E+02 -1.71441797E+03 + 7.93088037E+03 -7.38460938E+02 -1.75654700E+03 7.89182129E+03 + -7.74393066E+02 -1.71827197E+03 8.01397852E+03 -8.72551758E+02 + -1.76482605E+03 7.97045459E+03 -9.13182129E+02 -1.72100000E+03 + 8.09668652E+03 -1.00691309E+03 -1.77354504E+03 8.05575146E+03 + -1.04569678E+03 -1.73048596E+03 8.18021533E+03 -1.14037695E+03 + -1.78334094E+03 8.14771240E+03 -1.17167090E+03 -1.74702795E+03 + 8.26214063E+03 -1.27525000E+03 -1.79019995E+03 8.23092285E+03 + -1.30585400E+03 -1.75310498E+03 8.34085449E+03 -1.41320410E+03 + -1.78921802E+03 8.30873535E+03 -1.44533398E+03 -1.74992603E+03 + 8.41816992E+03 -1.55258105E+03 -1.78266797E+03 8.38582227E+03 + -1.58567822E+03 -1.74311597E+03 8.49554785E+03 -1.69196191E+03 + -1.77469702E+03 8.46271484E+03 -1.72639697E+03 -1.73455896E+03 + 8.57293457E+03 -1.83140479E+03 -1.76626697E+03 8.53959082E+03 + -1.86730176E+03 -1.72504700E+03 8.64934277E+03 -1.97200000E+03 + -1.75675195E+03 8.61579102E+03 -2.00909717E+03 -1.71423596E+03 + 8.72466113E+03 -2.11395117E+03 -1.74636401E+03 8.69342480E+03 + -2.14941797E+03 -1.70522705E+03 8.80217188E+03 -2.25351904E+03 + -1.73961206E+03 8.77394434E+03 -2.28641406E+03 -1.70004395E+03 + 8.88040723E+03 -2.39223877E+03 -1.73488196E+03 8.85509375E+03 + -2.42256201E+03 -1.69601196E+03 8.95848535E+03 -2.53113086E+03 + -1.73094800E+03 8.93614551E+03 -2.55877393E+03 -1.69207300E+03 + 9.03718652E+03 -2.66923584E+03 -1.72934094E+03 9.01776563E+03 + -2.69428711E+03 -1.68983899E+03 9.11635352E+03 -2.80669385E+03 + -1.73056006E+03 9.09946582E+03 -2.82971191E+03 -1.68988098E+03 +endtag +tag zvalues +array byte splitEnz 7920 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 + 4 4 4 4 4 4 4 4 4 4 4 4 +array float data 15570 + -1.67181702E+03 -1.67181702E+03 -1.67181702E+03 -1.67181702E+03 + -1.66983398E+03 -1.66983398E+03 -1.66983398E+03 -1.66983398E+03 + -1.66784998E+03 -1.66784998E+03 -1.66784998E+03 -1.66784998E+03 + -1.66586694E+03 -1.66586694E+03 -1.66586694E+03 -1.66586694E+03 + -1.66388306E+03 -1.66388306E+03 -1.66388306E+03 -1.66388306E+03 + -1.66097595E+03 -1.66097595E+03 -1.66097595E+03 -1.66097595E+03 + -1.65806995E+03 -1.65806995E+03 -1.65806995E+03 -1.65806995E+03 + -1.65516296E+03 -1.65516296E+03 -1.65516296E+03 -1.65516296E+03 + -1.65225598E+03 -1.65225598E+03 -1.65225598E+03 -1.65225598E+03 + -1.64934900E+03 -1.64934900E+03 -1.64934900E+03 -1.64934900E+03 + -1.64495996E+03 -1.64495996E+03 -1.64495996E+03 -1.64495996E+03 + -1.64056995E+03 -1.64056995E+03 -1.64056995E+03 -1.64056995E+03 + -1.63618103E+03 -1.63618103E+03 -1.63618103E+03 -1.63618103E+03 + -1.63179199E+03 -1.63179199E+03 -1.63179199E+03 -1.63179199E+03 + -1.62740198E+03 -1.62740198E+03 -1.62740198E+03 -1.62740198E+03 + -1.67423206E+03 -1.67423206E+03 -1.67423206E+03 -1.67423206E+03 + -1.67213098E+03 -1.67213098E+03 -1.67213098E+03 -1.67213098E+03 + -1.67003101E+03 -1.67003101E+03 -1.67003101E+03 -1.67003101E+03 + -1.66793005E+03 -1.66793005E+03 -1.66793005E+03 -1.66793005E+03 + -1.66582898E+03 -1.66582898E+03 -1.66582898E+03 -1.66582898E+03 + -1.66275598E+03 -1.66275598E+03 -1.66275598E+03 -1.66275598E+03 + -1.65968298E+03 -1.65968298E+03 -1.65968298E+03 -1.65968298E+03 + -1.65660999E+03 -1.65660999E+03 -1.65660999E+03 -1.65660999E+03 + -1.65353699E+03 -1.65353699E+03 -1.65353699E+03 -1.65353699E+03 + -1.65046399E+03 -1.65046399E+03 -1.65046399E+03 -1.65046399E+03 + -1.64589197E+03 -1.64589197E+03 -1.64589197E+03 -1.64589197E+03 + -1.64132104E+03 -1.64132104E+03 -1.64132104E+03 -1.64132104E+03 + -1.63674902E+03 -1.63674902E+03 -1.63674902E+03 -1.63674902E+03 + -1.63217798E+03 -1.63217798E+03 -1.63217798E+03 -1.63217798E+03 + -1.62760596E+03 -1.62760596E+03 -1.62760596E+03 -1.62760596E+03 + -1.67662695E+03 -1.67662695E+03 -1.67662695E+03 -1.67662695E+03 + -1.67460803E+03 -1.67460803E+03 -1.67460803E+03 -1.67460803E+03 + -1.67258801E+03 -1.67258801E+03 -1.67258801E+03 -1.67258801E+03 + -1.67056897E+03 -1.67056897E+03 -1.67056897E+03 -1.67056897E+03 + -1.66855005E+03 -1.66855005E+03 -1.66855005E+03 -1.66855005E+03 + -1.66557703E+03 -1.66557703E+03 -1.66557703E+03 -1.66557703E+03 + -1.66260400E+03 -1.66260400E+03 -1.66260400E+03 -1.66260400E+03 + -1.65963000E+03 -1.65963000E+03 -1.65963000E+03 -1.65963000E+03 + -1.65665698E+03 -1.65665698E+03 -1.65665698E+03 -1.65665698E+03 + -1.65368396E+03 -1.65368396E+03 -1.65368396E+03 -1.65368396E+03 + -1.64926294E+03 -1.64926294E+03 -1.64926294E+03 -1.64926294E+03 + -1.64484302E+03 -1.64484302E+03 -1.64484302E+03 -1.64484302E+03 + -1.64042200E+03 -1.64042200E+03 -1.64042200E+03 -1.64042200E+03 + -1.63600195E+03 -1.63600195E+03 -1.63600195E+03 -1.63600195E+03 + -1.63158203E+03 -1.63158203E+03 -1.63158203E+03 -1.63158203E+03 + -1.67773706E+03 -1.67773706E+03 -1.67773706E+03 -1.67773706E+03 + -1.67590906E+03 -1.67590906E+03 -1.67590906E+03 -1.67590906E+03 + -1.67407996E+03 -1.67407996E+03 -1.67407996E+03 -1.67407996E+03 + -1.67225195E+03 -1.67225195E+03 -1.67225195E+03 -1.67225195E+03 + -1.67042395E+03 -1.67042395E+03 -1.67042395E+03 -1.67042395E+03 + -1.66763000E+03 -1.66763000E+03 -1.66763000E+03 -1.66763000E+03 + -1.66483801E+03 -1.66483801E+03 -1.66483801E+03 -1.66483801E+03 + -1.66204504E+03 -1.66204504E+03 -1.66204504E+03 -1.66204504E+03 + -1.65925195E+03 -1.65925195E+03 -1.65925195E+03 -1.65925195E+03 + -1.65645898E+03 -1.65645898E+03 -1.65645898E+03 -1.65645898E+03 + -1.65219897E+03 -1.65219897E+03 -1.65219897E+03 -1.65219897E+03 + -1.64793896E+03 -1.64793896E+03 -1.64793896E+03 -1.64793896E+03 + -1.64368005E+03 -1.64368005E+03 -1.64368005E+03 -1.64368005E+03 + -1.63942004E+03 -1.63942004E+03 -1.63942004E+03 -1.63942004E+03 + -1.63516003E+03 -1.63516003E+03 -1.63516003E+03 -1.63516003E+03 + -1.67555798E+03 -1.67555798E+03 -1.67555798E+03 -1.67555798E+03 + -1.67376794E+03 -1.67376794E+03 -1.67376794E+03 -1.67376794E+03 + -1.67197705E+03 -1.67197705E+03 -1.67197705E+03 -1.67197705E+03 + -1.67018701E+03 -1.67018701E+03 -1.67018701E+03 -1.67018701E+03 + -1.66839697E+03 -1.66839697E+03 -1.66839697E+03 -1.66839697E+03 + -1.66577100E+03 -1.66577100E+03 -1.66577100E+03 -1.66577100E+03 + -1.66314404E+03 -1.66314404E+03 -1.66314404E+03 -1.66314404E+03 + -1.66051697E+03 -1.66051697E+03 -1.66051697E+03 -1.66051697E+03 + -1.65789099E+03 -1.65789099E+03 -1.65789099E+03 -1.65789099E+03 + -1.65526404E+03 -1.65526404E+03 -1.65526404E+03 -1.65526404E+03 + -1.65133496E+03 -1.65133496E+03 -1.65133496E+03 -1.65133496E+03 + -1.64740601E+03 -1.64740601E+03 -1.64740601E+03 -1.64740601E+03 + -1.64347705E+03 -1.64347705E+03 -1.64347705E+03 -1.64347705E+03 + -1.63954700E+03 -1.63954700E+03 -1.63954700E+03 -1.63954700E+03 + -1.63561804E+03 -1.63561804E+03 -1.63561804E+03 -1.63561804E+03 + -1.67614099E+03 -1.67614099E+03 -1.67614099E+03 -1.67614099E+03 + -1.67418994E+03 -1.67418994E+03 -1.67418994E+03 -1.67418994E+03 + -1.67223901E+03 -1.67223901E+03 -1.67223901E+03 -1.67223901E+03 + -1.67028796E+03 -1.67028796E+03 -1.67028796E+03 -1.67028796E+03 + -1.66833704E+03 -1.66833704E+03 -1.66833704E+03 -1.66833704E+03 + -1.66560303E+03 -1.66560303E+03 -1.66560303E+03 -1.66560303E+03 + -1.66286902E+03 -1.66286902E+03 -1.66286902E+03 -1.66286902E+03 + -1.66013501E+03 -1.66013501E+03 -1.66013501E+03 -1.66013501E+03 + -1.65740100E+03 -1.65740100E+03 -1.65740100E+03 -1.65740100E+03 + -1.65466699E+03 -1.65466699E+03 -1.65466699E+03 -1.65466699E+03 + -1.65063501E+03 -1.65063501E+03 -1.65063501E+03 -1.65063501E+03 + -1.64660400E+03 -1.64660400E+03 -1.64660400E+03 -1.64660400E+03 + -1.64257202E+03 -1.64257202E+03 -1.64257202E+03 -1.64257202E+03 + -1.63854102E+03 -1.63854102E+03 -1.63854102E+03 -1.63854102E+03 + -1.63450903E+03 -1.63450903E+03 -1.63450903E+03 -1.63450903E+03 + -1.67869897E+03 -1.67869897E+03 -1.67869897E+03 -1.67869897E+03 + -1.67666101E+03 -1.67666101E+03 -1.67666101E+03 -1.67666101E+03 + -1.67462195E+03 -1.67462195E+03 -1.67462195E+03 -1.67462195E+03 + -1.67258398E+03 -1.67258398E+03 -1.67258398E+03 -1.67258398E+03 + -1.67054504E+03 -1.67054504E+03 -1.67054504E+03 -1.67054504E+03 + -1.66761401E+03 -1.66761401E+03 -1.66761401E+03 -1.66761401E+03 + -1.66468298E+03 -1.66468298E+03 -1.66468298E+03 -1.66468298E+03 + -1.66175195E+03 -1.66175195E+03 -1.66175195E+03 -1.66175195E+03 + -1.65882104E+03 -1.65882104E+03 -1.65882104E+03 -1.65882104E+03 + -1.65589001E+03 -1.65589001E+03 -1.65589001E+03 -1.65589001E+03 + -1.65160596E+03 -1.65160596E+03 -1.65160596E+03 -1.65160596E+03 + -1.64732104E+03 -1.64732104E+03 -1.64732104E+03 -1.64732104E+03 + -1.64303601E+03 -1.64303601E+03 -1.64303601E+03 -1.64303601E+03 + -1.63875195E+03 -1.63875195E+03 -1.63875195E+03 -1.63875195E+03 + -1.63446704E+03 -1.63446704E+03 -1.63446704E+03 -1.63446704E+03 + -1.68243396E+03 -1.68243396E+03 -1.68243396E+03 -1.68243396E+03 + -1.68037695E+03 -1.68037695E+03 -1.68037695E+03 -1.68037695E+03 + -1.67831897E+03 -1.67831897E+03 -1.67831897E+03 -1.67831897E+03 + -1.67626196E+03 -1.67626196E+03 -1.67626196E+03 -1.67626196E+03 + -1.67420398E+03 -1.67420398E+03 -1.67420398E+03 -1.67420398E+03 + -1.67113501E+03 -1.67113501E+03 -1.67113501E+03 -1.67113501E+03 + -1.66806494E+03 -1.66806494E+03 -1.66806494E+03 -1.66806494E+03 + -1.66499597E+03 -1.66499597E+03 -1.66499597E+03 -1.66499597E+03 + -1.66192700E+03 -1.66192700E+03 -1.66192700E+03 -1.66192700E+03 + -1.65885706E+03 -1.65885706E+03 -1.65885706E+03 -1.65885706E+03 + -1.65431799E+03 -1.65431799E+03 -1.65431799E+03 -1.65431799E+03 + -1.64977905E+03 -1.64977905E+03 -1.64977905E+03 -1.64977905E+03 + -1.64523999E+03 -1.64523999E+03 -1.64523999E+03 -1.64523999E+03 + -1.64070105E+03 -1.64070105E+03 -1.64070105E+03 -1.64070105E+03 + -1.63616199E+03 -1.63616199E+03 -1.63616199E+03 -1.63616199E+03 + -1.68651501E+03 -1.68651501E+03 -1.68651501E+03 -1.68651501E+03 + -1.68447998E+03 -1.68447998E+03 -1.68447998E+03 -1.68447998E+03 + -1.68244604E+03 -1.68244604E+03 -1.68244604E+03 -1.68244604E+03 + -1.68041199E+03 -1.68041199E+03 -1.68041199E+03 -1.68041199E+03 + -1.67837805E+03 -1.67837805E+03 -1.67837805E+03 -1.67837805E+03 + -1.67533301E+03 -1.67533301E+03 -1.67533301E+03 -1.67533301E+03 + -1.67228796E+03 -1.67228796E+03 -1.67228796E+03 -1.67228796E+03 + -1.66924304E+03 -1.66924304E+03 -1.66924304E+03 -1.66924304E+03 + -1.66619800E+03 -1.66619800E+03 -1.66619800E+03 -1.66619800E+03 + -1.66315405E+03 -1.66315405E+03 -1.66315405E+03 -1.66315405E+03 + -1.65850000E+03 -1.65850000E+03 -1.65850000E+03 -1.65850000E+03 + -1.65384595E+03 -1.65384595E+03 -1.65384595E+03 -1.65384595E+03 + -1.64919202E+03 -1.64919202E+03 -1.64919202E+03 -1.64919202E+03 + -1.64453796E+03 -1.64453796E+03 -1.64453796E+03 -1.64453796E+03 + -1.63988403E+03 -1.63988403E+03 -1.63988403E+03 -1.63988403E+03 + -1.69062402E+03 -1.69062402E+03 -1.69062402E+03 -1.69062402E+03 + -1.68879395E+03 -1.68879395E+03 -1.68879395E+03 -1.68879395E+03 + -1.68696399E+03 -1.68696399E+03 -1.68696399E+03 -1.68696399E+03 + -1.68513501E+03 -1.68513501E+03 -1.68513501E+03 -1.68513501E+03 + -1.68330603E+03 -1.68330603E+03 -1.68330603E+03 -1.68330603E+03 + -1.68038501E+03 -1.68038501E+03 -1.68038501E+03 -1.68038501E+03 + -1.67746399E+03 -1.67746399E+03 -1.67746399E+03 -1.67746399E+03 + -1.67454297E+03 -1.67454297E+03 -1.67454297E+03 -1.67454297E+03 + -1.67162195E+03 -1.67162195E+03 -1.67162195E+03 -1.67162195E+03 + -1.66870105E+03 -1.66870105E+03 -1.66870105E+03 -1.66870105E+03 + -1.66399695E+03 -1.66399695E+03 -1.66399695E+03 -1.66399695E+03 + -1.65929199E+03 -1.65929199E+03 -1.65929199E+03 -1.65929199E+03 + -1.65458704E+03 -1.65458704E+03 -1.65458704E+03 -1.65458704E+03 + -1.64988306E+03 -1.64988306E+03 -1.64988306E+03 -1.64988306E+03 + -1.64517798E+03 -1.64517798E+03 -1.64517798E+03 -1.64517798E+03 + -1.69510706E+03 -1.69510706E+03 -1.69510706E+03 -1.69510706E+03 + -1.69338098E+03 -1.69338098E+03 -1.69338098E+03 -1.69338098E+03 + -1.69165601E+03 -1.69165601E+03 -1.69165601E+03 -1.69165601E+03 + -1.68993103E+03 -1.68993103E+03 -1.68993103E+03 -1.68993103E+03 + -1.68820496E+03 -1.68820496E+03 -1.68820496E+03 -1.68820496E+03 + -1.68534705E+03 -1.68534705E+03 -1.68534705E+03 -1.68534705E+03 + -1.68248804E+03 -1.68248804E+03 -1.68248804E+03 -1.68248804E+03 + -1.67963000E+03 -1.67963000E+03 -1.67963000E+03 -1.67963000E+03 + -1.67677100E+03 -1.67677100E+03 -1.67677100E+03 -1.67677100E+03 + -1.67391296E+03 -1.67391296E+03 -1.67391296E+03 -1.67391296E+03 + -1.66925500E+03 -1.66925500E+03 -1.66925500E+03 -1.66925500E+03 + -1.66459595E+03 -1.66459595E+03 -1.66459595E+03 -1.66459595E+03 + -1.65993799E+03 -1.65993799E+03 -1.65993799E+03 -1.65993799E+03 + -1.65528003E+03 -1.65528003E+03 -1.65528003E+03 -1.65528003E+03 + -1.65062195E+03 -1.65062195E+03 -1.65062195E+03 -1.65062195E+03 + -1.70119299E+03 -1.70119299E+03 -1.70119299E+03 -1.70119299E+03 + -1.69942896E+03 -1.69942896E+03 -1.69942896E+03 -1.69942896E+03 + -1.69766504E+03 -1.69766504E+03 -1.69766504E+03 -1.69766504E+03 + -1.69590002E+03 -1.69590002E+03 -1.69590002E+03 -1.69590002E+03 + -1.69413599E+03 -1.69413599E+03 -1.69413599E+03 -1.69413599E+03 + -1.69128101E+03 -1.69128101E+03 -1.69128101E+03 -1.69128101E+03 + -1.68842505E+03 -1.68842505E+03 -1.68842505E+03 -1.68842505E+03 + -1.68556995E+03 -1.68556995E+03 -1.68556995E+03 -1.68556995E+03 + -1.68271399E+03 -1.68271399E+03 -1.68271399E+03 -1.68271399E+03 + -1.67985901E+03 -1.67985901E+03 -1.67985901E+03 -1.67985901E+03 + -1.67522803E+03 -1.67522803E+03 -1.67522803E+03 -1.67522803E+03 + -1.67059595E+03 -1.67059595E+03 -1.67059595E+03 -1.67059595E+03 + -1.66596497E+03 -1.66596497E+03 -1.66596497E+03 -1.66596497E+03 + -1.66133301E+03 -1.66133301E+03 -1.66133301E+03 -1.66133301E+03 + -1.65670203E+03 -1.65670203E+03 -1.65670203E+03 -1.65670203E+03 + -1.70410205E+03 -1.70410205E+03 -1.70410205E+03 -1.70410205E+03 + -1.70229395E+03 -1.70229395E+03 -1.70229395E+03 -1.70229395E+03 + -1.70048499E+03 -1.70048499E+03 -1.70048499E+03 -1.70048499E+03 + -1.69867700E+03 -1.69867700E+03 -1.69867700E+03 -1.69867700E+03 + -1.69686804E+03 -1.69686804E+03 -1.69686804E+03 -1.69686804E+03 + -1.69397705E+03 -1.69397705E+03 -1.69397705E+03 -1.69397705E+03 + -1.69108496E+03 -1.69108496E+03 -1.69108496E+03 -1.69108496E+03 + -1.68819299E+03 -1.68819299E+03 -1.68819299E+03 -1.68819299E+03 + -1.68530103E+03 -1.68530103E+03 -1.68530103E+03 -1.68530103E+03 + -1.68241003E+03 -1.68241003E+03 -1.68241003E+03 -1.68241003E+03 + -1.67782397E+03 -1.67782397E+03 -1.67782397E+03 -1.67782397E+03 + -1.67323901E+03 -1.67323901E+03 -1.67323901E+03 -1.67323901E+03 + -1.66865405E+03 -1.66865405E+03 -1.66865405E+03 -1.66865405E+03 + -1.66406799E+03 -1.66406799E+03 -1.66406799E+03 -1.66406799E+03 + -1.65948303E+03 -1.65948303E+03 -1.65948303E+03 -1.65948303E+03 + -1.70860303E+03 -1.70860303E+03 -1.70860303E+03 -1.70860303E+03 + -1.70666699E+03 -1.70666699E+03 -1.70666699E+03 -1.70666699E+03 + -1.70473096E+03 -1.70473096E+03 -1.70473096E+03 -1.70473096E+03 + -1.70279602E+03 -1.70279602E+03 -1.70279602E+03 -1.70279602E+03 + -1.70085999E+03 -1.70085999E+03 -1.70085999E+03 -1.70085999E+03 + -1.69781494E+03 -1.69781494E+03 -1.69781494E+03 -1.69781494E+03 + -1.69477002E+03 -1.69477002E+03 -1.69477002E+03 -1.69477002E+03 + -1.69172595E+03 -1.69172595E+03 -1.69172595E+03 -1.69172595E+03 + -1.68868103E+03 -1.68868103E+03 -1.68868103E+03 -1.68868103E+03 + -1.68563599E+03 -1.68563599E+03 -1.68563599E+03 -1.68563599E+03 + -1.68093701E+03 -1.68093701E+03 -1.68093701E+03 -1.68093701E+03 + -1.67623804E+03 -1.67623804E+03 -1.67623804E+03 -1.67623804E+03 + -1.67153894E+03 -1.67153894E+03 -1.67153894E+03 -1.67153894E+03 + -1.66683997E+03 -1.66683997E+03 -1.66683997E+03 -1.66683997E+03 + -1.66214099E+03 -1.66214099E+03 -1.66214099E+03 -1.66214099E+03 + -1.71173706E+03 -1.71173706E+03 -1.71173706E+03 -1.71173706E+03 + -1.70963098E+03 -1.70963098E+03 -1.70963098E+03 -1.70963098E+03 + -1.70752405E+03 -1.70752405E+03 -1.70752405E+03 -1.70752405E+03 + -1.70541797E+03 -1.70541797E+03 -1.70541797E+03 -1.70541797E+03 + -1.70331201E+03 -1.70331201E+03 -1.70331201E+03 -1.70331201E+03 + -1.70015100E+03 -1.70015100E+03 -1.70015100E+03 -1.70015100E+03 + -1.69699194E+03 -1.69699194E+03 -1.69699194E+03 -1.69699194E+03 + -1.69383203E+03 -1.69383203E+03 -1.69383203E+03 -1.69383203E+03 + -1.69067200E+03 -1.69067200E+03 -1.69067200E+03 -1.69067200E+03 + -1.68751099E+03 -1.68751099E+03 -1.68751099E+03 -1.68751099E+03 + -1.68270300E+03 -1.68270300E+03 -1.68270300E+03 -1.68270300E+03 + -1.67789294E+03 -1.67789294E+03 -1.67789294E+03 -1.67789294E+03 + -1.67308398E+03 -1.67308398E+03 -1.67308398E+03 -1.67308398E+03 + -1.66827502E+03 -1.66827502E+03 -1.66827502E+03 -1.66827502E+03 + -1.66346594E+03 -1.66346594E+03 -1.66346594E+03 -1.66346594E+03 + -1.71158203E+03 -1.71158203E+03 -1.71158203E+03 -1.71158203E+03 + -1.70940295E+03 -1.70940295E+03 -1.70940295E+03 -1.70940295E+03 + -1.70722498E+03 -1.70722498E+03 -1.70722498E+03 -1.70722498E+03 + -1.70504602E+03 -1.70504602E+03 -1.70504602E+03 -1.70504602E+03 + -1.70286694E+03 -1.70286694E+03 -1.70286694E+03 -1.70286694E+03 + -1.69956799E+03 -1.69956799E+03 -1.69956799E+03 -1.69956799E+03 + -1.69627002E+03 -1.69627002E+03 -1.69627002E+03 -1.69627002E+03 + -1.69297095E+03 -1.69297095E+03 -1.69297095E+03 -1.69297095E+03 + -1.68967200E+03 -1.68967200E+03 -1.68967200E+03 -1.68967200E+03 + -1.68637305E+03 -1.68637305E+03 -1.68637305E+03 -1.68637305E+03 + -1.68142102E+03 -1.68142102E+03 -1.68142102E+03 -1.68142102E+03 + -1.67646899E+03 -1.67646899E+03 -1.67646899E+03 -1.67646899E+03 + -1.67151697E+03 -1.67151697E+03 -1.67151697E+03 -1.67151697E+03 + -1.66656494E+03 -1.66656494E+03 -1.66656494E+03 -1.66656494E+03 + -1.66161401E+03 -1.66161401E+03 -1.66161401E+03 -1.66161401E+03 + -1.70829199E+03 -1.70829199E+03 -1.70829199E+03 -1.70829199E+03 + -1.70605298E+03 -1.70605298E+03 -1.70605298E+03 -1.70605298E+03 + -1.70381396E+03 -1.70381396E+03 -1.70381396E+03 -1.70381396E+03 + -1.70157495E+03 -1.70157495E+03 -1.70157495E+03 -1.70157495E+03 + -1.69933606E+03 -1.69933606E+03 -1.69933606E+03 -1.69933606E+03 + -1.69602905E+03 -1.69602905E+03 -1.69602905E+03 -1.69602905E+03 + -1.69272095E+03 -1.69272095E+03 -1.69272095E+03 -1.69272095E+03 + -1.68941394E+03 -1.68941394E+03 -1.68941394E+03 -1.68941394E+03 + -1.68610706E+03 -1.68610706E+03 -1.68610706E+03 -1.68610706E+03 + -1.68280005E+03 -1.68280005E+03 -1.68280005E+03 -1.68280005E+03 + -1.67791797E+03 -1.67791797E+03 -1.67791797E+03 -1.67791797E+03 + -1.67303699E+03 -1.67303699E+03 -1.67303699E+03 -1.67303699E+03 + -1.66815601E+03 -1.66815601E+03 -1.66815601E+03 -1.66815601E+03 + -1.66327502E+03 -1.66327502E+03 -1.66327502E+03 -1.66327502E+03 + -1.65839294E+03 -1.65839294E+03 -1.65839294E+03 -1.65839294E+03 + -1.70816199E+03 -1.70816199E+03 -1.70816199E+03 -1.70816199E+03 + -1.70602698E+03 -1.70602698E+03 -1.70602698E+03 -1.70602698E+03 + -1.70389197E+03 -1.70389197E+03 -1.70389197E+03 -1.70389197E+03 + -1.70175696E+03 -1.70175696E+03 -1.70175696E+03 -1.70175696E+03 + -1.69962195E+03 -1.69962195E+03 -1.69962195E+03 -1.69962195E+03 + -1.69647400E+03 -1.69647400E+03 -1.69647400E+03 -1.69647400E+03 + -1.69332495E+03 -1.69332495E+03 -1.69332495E+03 -1.69332495E+03 + -1.69017700E+03 -1.69017700E+03 -1.69017700E+03 -1.69017700E+03 + -1.68702905E+03 -1.68702905E+03 -1.68702905E+03 -1.68702905E+03 + -1.68388000E+03 -1.68388000E+03 -1.68388000E+03 -1.68388000E+03 + -1.67912903E+03 -1.67912903E+03 -1.67912903E+03 -1.67912903E+03 + -1.67437695E+03 -1.67437695E+03 -1.67437695E+03 -1.67437695E+03 + -1.66962500E+03 -1.66962500E+03 -1.66962500E+03 -1.66962500E+03 + -1.66487402E+03 -1.66487402E+03 -1.66487402E+03 -1.66487402E+03 + -1.66012195E+03 -1.66012195E+03 -1.66012195E+03 -1.66012195E+03 + -1.71990198E+03 -1.70911597E+03 -1.71990198E+03 -1.71990198E+03 + -1.71781995E+03 -1.70706897E+03 -1.71781995E+03 -1.71781995E+03 + -1.71573706E+03 -1.70502197E+03 -1.71573706E+03 -1.71573706E+03 + -1.71365503E+03 -1.70297498E+03 -1.71365503E+03 -1.71365503E+03 + -1.71157202E+03 -1.70092798E+03 -1.71157202E+03 -1.71157202E+03 + -1.70855200E+03 -1.69801794E+03 -1.70855200E+03 -1.70855200E+03 + -1.70553101E+03 -1.69510803E+03 -1.70553101E+03 -1.70553101E+03 + -1.70251099E+03 -1.69219897E+03 -1.70251099E+03 -1.70251099E+03 + -1.69948999E+03 -1.68928894E+03 -1.69948999E+03 -1.69948999E+03 + -1.69646997E+03 -1.68637903E+03 -1.69646997E+03 -1.69646997E+03 + -1.69188599E+03 -1.68177405E+03 -1.69188599E+03 -1.69188599E+03 + -1.68730200E+03 -1.67716895E+03 -1.68730200E+03 -1.68730200E+03 + -1.68271704E+03 -1.67256396E+03 -1.68271704E+03 -1.68271704E+03 + -1.67813306E+03 -1.66795801E+03 -1.67813306E+03 -1.67813306E+03 + -1.67354895E+03 -1.66335303E+03 -1.67354895E+03 -1.67354895E+03 + -1.72329297E+03 -1.72329297E+03 -1.72329297E+03 -1.72329297E+03 + -1.72126794E+03 -1.72126794E+03 -1.72126794E+03 -1.72126794E+03 + -1.71924304E+03 -1.71924304E+03 -1.71924304E+03 -1.71924304E+03 + -1.71721899E+03 -1.71721899E+03 -1.71721899E+03 -1.71721899E+03 + -1.71519299E+03 -1.71519299E+03 -1.71519299E+03 -1.71519299E+03 + -1.71223901E+03 -1.71223901E+03 -1.71223901E+03 -1.71223901E+03 + -1.70928406E+03 -1.70928406E+03 -1.70928406E+03 -1.70928406E+03 + -1.70632898E+03 -1.70632898E+03 -1.70632898E+03 -1.70632898E+03 + -1.70337402E+03 -1.70337402E+03 -1.70337402E+03 -1.70337402E+03 + -1.70042004E+03 -1.70042004E+03 -1.70042004E+03 -1.70042004E+03 + -1.69598096E+03 -1.69598096E+03 -1.69598096E+03 -1.69598096E+03 + -1.69154297E+03 -1.69154297E+03 -1.69154297E+03 -1.69154297E+03 + -1.68710400E+03 -1.68710400E+03 -1.68710400E+03 -1.68710400E+03 + -1.68266602E+03 -1.68266602E+03 -1.68266602E+03 -1.68266602E+03 + -1.67822705E+03 -1.67822705E+03 -1.67822705E+03 -1.67822705E+03 + -1.72703894E+03 -1.72703894E+03 -1.72703894E+03 -1.72703894E+03 + -1.72510400E+03 -1.72510400E+03 -1.72510400E+03 -1.72510400E+03 + -1.72316895E+03 -1.72316895E+03 -1.72316895E+03 -1.72316895E+03 + -1.72123401E+03 -1.72123401E+03 -1.72123401E+03 -1.72123401E+03 + -1.71929797E+03 -1.71929797E+03 -1.71929797E+03 -1.71929797E+03 + -1.71647400E+03 -1.71647400E+03 -1.71647400E+03 -1.71647400E+03 + -1.71364905E+03 -1.71364905E+03 -1.71364905E+03 -1.71364905E+03 + -1.71082495E+03 -1.71082495E+03 -1.71082495E+03 -1.71082495E+03 + -1.70800098E+03 -1.70800098E+03 -1.70800098E+03 -1.70800098E+03 + -1.70517603E+03 -1.70517603E+03 -1.70517603E+03 -1.70517603E+03 + -1.70092700E+03 -1.70092700E+03 -1.70092700E+03 -1.70092700E+03 + -1.69667798E+03 -1.69667798E+03 -1.69667798E+03 -1.69667798E+03 + -1.69242896E+03 -1.69242896E+03 -1.69242896E+03 -1.69242896E+03 + -1.68818005E+03 -1.68818005E+03 -1.68818005E+03 -1.68818005E+03 + -1.68393103E+03 -1.68393103E+03 -1.68393103E+03 -1.68393103E+03 + -1.73170898E+03 -1.73170898E+03 -1.73170898E+03 -1.73170898E+03 + -1.72979700E+03 -1.72979700E+03 -1.72979700E+03 -1.72979700E+03 + -1.72788403E+03 -1.72788403E+03 -1.72788403E+03 -1.72788403E+03 + -1.72597205E+03 -1.72597205E+03 -1.72597205E+03 -1.72597205E+03 + -1.72406006E+03 -1.72406006E+03 -1.72406006E+03 -1.72406006E+03 + -1.72125305E+03 -1.72125305E+03 -1.72125305E+03 -1.72125305E+03 + -1.71844604E+03 -1.71844604E+03 -1.71844604E+03 -1.71844604E+03 + -1.71563904E+03 -1.71563904E+03 -1.71563904E+03 -1.71563904E+03 + -1.71283203E+03 -1.71283203E+03 -1.71283203E+03 -1.71283203E+03 + -1.71002502E+03 -1.71002502E+03 -1.71002502E+03 -1.71002502E+03 + -1.70579102E+03 -1.70579102E+03 -1.70579102E+03 -1.70579102E+03 + -1.70155798E+03 -1.70155798E+03 -1.70155798E+03 -1.70155798E+03 + -1.69732397E+03 -1.69732397E+03 -1.69732397E+03 -1.69732397E+03 + -1.69309094E+03 -1.69309094E+03 -1.69309094E+03 -1.69309094E+03 + -1.68885706E+03 -1.68885706E+03 -1.68885706E+03 -1.68885706E+03 + -1.73492102E+03 -1.73492102E+03 -1.73492102E+03 -1.73492102E+03 + -1.73300305E+03 -1.73300305E+03 -1.73300305E+03 -1.73300305E+03 + -1.73108606E+03 -1.73108606E+03 -1.73108606E+03 -1.73108606E+03 + -1.72916797E+03 -1.72916797E+03 -1.72916797E+03 -1.72916797E+03 + -1.72725000E+03 -1.72725000E+03 -1.72725000E+03 -1.72725000E+03 + -1.72444397E+03 -1.72444397E+03 -1.72444397E+03 -1.72444397E+03 + -1.72163794E+03 -1.72163794E+03 -1.72163794E+03 -1.72163794E+03 + -1.71883105E+03 -1.71883105E+03 -1.71883105E+03 -1.71883105E+03 + -1.71602502E+03 -1.71602502E+03 -1.71602502E+03 -1.71602502E+03 + -1.71321802E+03 -1.71321802E+03 -1.71321802E+03 -1.71321802E+03 + -1.70899695E+03 -1.70899695E+03 -1.70899695E+03 -1.70899695E+03 + -1.70477600E+03 -1.70477600E+03 -1.70477600E+03 -1.70477600E+03 + -1.70055396E+03 -1.70055396E+03 -1.70055396E+03 -1.70055396E+03 + -1.69633301E+03 -1.69633301E+03 -1.69633301E+03 -1.69633301E+03 + -1.69211206E+03 -1.69211206E+03 -1.69211206E+03 -1.69211206E+03 + -1.73838599E+03 -1.73838599E+03 -1.73838599E+03 -1.73838599E+03 + -1.73641296E+03 -1.73641296E+03 -1.73641296E+03 -1.73641296E+03 + -1.73444104E+03 -1.73444104E+03 -1.73444104E+03 -1.73444104E+03 + -1.73246802E+03 -1.73246802E+03 -1.73246802E+03 -1.73246802E+03 + -1.73049597E+03 -1.73049597E+03 -1.73049597E+03 -1.73049597E+03 + -1.72761401E+03 -1.72761401E+03 -1.72761401E+03 -1.72761401E+03 + -1.72473206E+03 -1.72473206E+03 -1.72473206E+03 -1.72473206E+03 + -1.72184900E+03 -1.72184900E+03 -1.72184900E+03 -1.72184900E+03 + -1.71896704E+03 -1.71896704E+03 -1.71896704E+03 -1.71896704E+03 + -1.71608496E+03 -1.71608496E+03 -1.71608496E+03 -1.71608496E+03 + -1.71174902E+03 -1.71174902E+03 -1.71174902E+03 -1.71174902E+03 + -1.70741199E+03 -1.70741199E+03 -1.70741199E+03 -1.70741199E+03 + -1.70307605E+03 -1.70307605E+03 -1.70307605E+03 -1.70307605E+03 + -1.69873999E+03 -1.69873999E+03 -1.69873999E+03 -1.69873999E+03 + -1.69440295E+03 -1.69440295E+03 -1.69440295E+03 -1.69440295E+03 + -1.67804004E+03 -1.67804004E+03 -1.67804004E+03 -1.67804004E+03 + -1.67571399E+03 -1.67571399E+03 -1.67571399E+03 -1.67571399E+03 + -1.67338794E+03 -1.67338794E+03 -1.67338794E+03 -1.67338794E+03 + -1.67106299E+03 -1.67106299E+03 -1.67106299E+03 -1.67106299E+03 + -1.66873706E+03 -1.66873706E+03 -1.66873706E+03 -1.66873706E+03 + -1.66542395E+03 -1.66542395E+03 -1.66542395E+03 -1.66542395E+03 + -1.66211096E+03 -1.66211096E+03 -1.66211096E+03 -1.66211096E+03 + -1.65879797E+03 -1.65879797E+03 -1.65879797E+03 -1.65879797E+03 + -1.65548596E+03 -1.65548596E+03 -1.65548596E+03 -1.65548596E+03 + -1.65217297E+03 -1.65217297E+03 -1.65217297E+03 -1.65217297E+03 + -1.64748206E+03 -1.64748206E+03 -1.64748206E+03 -1.64748206E+03 + -1.64279199E+03 -1.64279199E+03 -1.64279199E+03 -1.64279199E+03 + -1.63810095E+03 -1.63810095E+03 -1.63810095E+03 -1.63810095E+03 + -1.63341101E+03 -1.63341101E+03 -1.63341101E+03 -1.63341101E+03 + -1.62871997E+03 -1.62871997E+03 -1.62871997E+03 -1.62871997E+03 + -1.68047900E+03 -1.67829504E+03 -1.67611096E+03 -1.67392700E+03 + -1.67174304E+03 -1.66850598E+03 -1.66526904E+03 -1.66203101E+03 + -1.65879395E+03 -1.65555701E+03 -1.65066199E+03 -1.64576697E+03 + -1.64087195E+03 -1.63597705E+03 -1.63108203E+03 -1.67850696E+03 + -1.67643396E+03 -1.67436206E+03 -1.67228894E+03 -1.67021594E+03 + -1.66716003E+03 -1.66410400E+03 -1.66104895E+03 -1.65799304E+03 + -1.65493701E+03 -1.65039795E+03 -1.64585901E+03 -1.64131897E+03 + -1.63678003E+03 -1.63224097E+03 -1.67383997E+03 -1.67183496E+03 + -1.66982996E+03 -1.66782397E+03 -1.66581897E+03 -1.66292505E+03 + -1.66003101E+03 -1.65713696E+03 -1.65424402E+03 -1.65134998E+03 + -1.64712402E+03 -1.64289795E+03 -1.63867200E+03 -1.63444604E+03 + -1.63021997E+03 -1.66998206E+03 -1.66803198E+03 -1.66608203E+03 + -1.66413196E+03 -1.66218298E+03 -1.65932397E+03 -1.65646497E+03 + -1.65360596E+03 -1.65074695E+03 -1.64788794E+03 -1.64366699E+03 + -1.63944604E+03 -1.63522498E+03 -1.63100305E+03 -1.62678198E+03 + -1.67069800E+03 -1.66871802E+03 -1.66673804E+03 -1.66475806E+03 + -1.66277905E+03 -1.65987097E+03 -1.65696301E+03 -1.65405505E+03 + -1.65114697E+03 -1.64823901E+03 -1.64392896E+03 -1.63961902E+03 + -1.63530896E+03 -1.63100000E+03 -1.62668994E+03 -1.67283203E+03 + -1.67084204E+03 -1.66885205E+03 -1.66686304E+03 -1.66487305E+03 + -1.66195703E+03 -1.65904004E+03 -1.65612402E+03 -1.65320801E+03 + -1.65029199E+03 -1.64597803E+03 -1.64166504E+03 -1.63735095E+03 + -1.63303796E+03 -1.62872400E+03 -1.67594397E+03 -1.67379102E+03 + -1.67163794E+03 -1.66948401E+03 -1.66733105E+03 -1.66423999E+03 + -1.66114905E+03 -1.65805896E+03 -1.65496802E+03 -1.65187695E+03 + -1.64741699E+03 -1.64295703E+03 -1.63849695E+03 -1.63403699E+03 + -1.62957703E+03 -1.68310205E+03 -1.68065503E+03 -1.67820801E+03 + -1.67576099E+03 -1.67331396E+03 -1.66973804E+03 -1.66616199E+03 + -1.66258606E+03 -1.65901099E+03 -1.65543506E+03 -1.65033899E+03 + -1.64524304E+03 -1.64014697E+03 -1.63505103E+03 -1.62995496E+03 + -1.69005798E+03 -1.68778003E+03 -1.68550195E+03 -1.68322400E+03 + -1.68094604E+03 -1.67732397E+03 -1.67370300E+03 -1.67008105E+03 + -1.66645898E+03 -1.66283801E+03 -1.65746106E+03 -1.65208398E+03 + -1.64670703E+03 -1.64132996E+03 -1.63595398E+03 -1.69564905E+03 + -1.69354797E+03 -1.69144800E+03 -1.68934802E+03 -1.68724805E+03 + -1.68400403E+03 -1.68076001E+03 -1.67751501E+03 -1.67427100E+03 + -1.67102698E+03 -1.66614197E+03 -1.66125696E+03 -1.65637097E+03 + -1.65148596E+03 -1.64660095E+03 -1.70166602E+03 -1.69959094E+03 + -1.69751599E+03 -1.69544202E+03 -1.69336694E+03 -1.69020898E+03 + -1.68705103E+03 -1.68389294E+03 -1.68073499E+03 -1.67757703E+03 + -1.67302197E+03 -1.66846704E+03 -1.66391199E+03 -1.65935706E+03 + -1.65480200E+03 -1.70433398E+03 -1.70229199E+03 -1.70024805E+03 + -1.69820496E+03 -1.69616199E+03 -1.69311304E+03 -1.69006299E+03 + -1.68701294E+03 -1.68396301E+03 -1.68091296E+03 -1.67671802E+03 + -1.67252197E+03 -1.66832703E+03 -1.66413098E+03 -1.65993506E+03 + -1.70693604E+03 -1.70490405E+03 -1.70287195E+03 -1.70083997E+03 + -1.69880701E+03 -1.69585498E+03 -1.69290198E+03 -1.68994897E+03 + -1.68699597E+03 -1.68404395E+03 -1.67987805E+03 -1.67571301E+03 + -1.67154797E+03 -1.66738196E+03 -1.66321704E+03 -1.70758606E+03 + -1.70543506E+03 -1.70328296E+03 -1.70113098E+03 -1.69897998E+03 + -1.69587195E+03 -1.69276294E+03 -1.68965503E+03 -1.68654700E+03 + -1.68343799E+03 -1.67912500E+03 -1.67481104E+03 -1.67049695E+03 + -1.66618298E+03 -1.66187000E+03 -1.70524402E+03 -1.70313696E+03 + -1.70103101E+03 -1.69892505E+03 -1.69681799E+03 -1.69379297E+03 + -1.69076794E+03 -1.68774402E+03 -1.68471899E+03 -1.68169299E+03 + -1.67747705E+03 -1.67326001E+03 -1.66904297E+03 -1.66482605E+03 + -1.66060999E+03 -1.70249304E+03 -1.70047803E+03 -1.69846204E+03 + -1.69644604E+03 -1.69443005E+03 -1.69152698E+03 -1.68862500E+03 + -1.68572205E+03 -1.68281995E+03 -1.67991699E+03 -1.67582104E+03 + -1.67172595E+03 -1.66763000E+03 -1.66353406E+03 -1.65943799E+03 + -1.70302795E+03 -1.70093604E+03 -1.69884399E+03 -1.69675305E+03 + -1.69466101E+03 -1.69167896E+03 -1.68869702E+03 -1.68571497E+03 + -1.68273206E+03 -1.67975000E+03 -1.67553198E+03 -1.67131396E+03 + -1.66709497E+03 -1.66287695E+03 -1.65865906E+03 -1.70469299E+03 + -1.70469299E+03 -1.71435303E+03 -1.70469299E+03 -1.70263000E+03 + -1.70263000E+03 -1.71215796E+03 -1.70263000E+03 -1.70056702E+03 + -1.70056702E+03 -1.70996399E+03 -1.70056702E+03 -1.69850403E+03 + -1.69850403E+03 -1.70776904E+03 -1.69850403E+03 -1.69644104E+03 + -1.69644104E+03 -1.70557397E+03 -1.69644104E+03 -1.69353796E+03 + -1.69353796E+03 -1.70253503E+03 -1.69353796E+03 -1.69063501E+03 + -1.69063501E+03 -1.69949597E+03 -1.69063501E+03 -1.68773303E+03 + -1.68773303E+03 -1.69645703E+03 -1.68773303E+03 -1.68482996E+03 + -1.68482996E+03 -1.69341895E+03 -1.68482996E+03 -1.68192700E+03 + -1.68192700E+03 -1.69038000E+03 -1.68192700E+03 -1.67738599E+03 + -1.67738599E+03 -1.68556995E+03 -1.67738599E+03 -1.67284399E+03 + -1.67284399E+03 -1.68076001E+03 -1.67284399E+03 -1.66830298E+03 + -1.66830298E+03 -1.67594995E+03 -1.66830298E+03 -1.66376196E+03 + -1.66376196E+03 -1.67114099E+03 -1.66376196E+03 -1.65922095E+03 + -1.65922095E+03 -1.66633105E+03 -1.65922095E+03 -1.71566394E+03 + -1.70485803E+03 -1.71566394E+03 -1.71566394E+03 -1.71349695E+03 + -1.70285596E+03 -1.71349695E+03 -1.71349695E+03 -1.71132996E+03 + -1.70085303E+03 -1.71132996E+03 -1.71132996E+03 -1.70916199E+03 + -1.69885095E+03 -1.70916199E+03 -1.70916199E+03 -1.70699500E+03 + -1.69684900E+03 -1.70699500E+03 -1.70699500E+03 -1.70396106E+03 + -1.69406396E+03 -1.70396106E+03 -1.70396106E+03 -1.70092700E+03 + -1.69127795E+03 -1.70092700E+03 -1.70092700E+03 -1.69789404E+03 + -1.68849304E+03 -1.69789404E+03 -1.69789404E+03 -1.69485999E+03 + -1.68570801E+03 -1.69485999E+03 -1.69485999E+03 -1.69182605E+03 + -1.68292297E+03 -1.69182605E+03 -1.69182605E+03 -1.68716296E+03 + -1.67835400E+03 -1.68716296E+03 -1.68716296E+03 -1.68249902E+03 + -1.67378601E+03 -1.68249902E+03 -1.68249902E+03 -1.67783496E+03 + -1.66921802E+03 -1.67783496E+03 -1.67783496E+03 -1.67317200E+03 + -1.66465002E+03 -1.67317200E+03 -1.67317200E+03 -1.66850806E+03 + -1.66008105E+03 -1.66850806E+03 -1.66850806E+03 -1.71762402E+03 + -1.71557104E+03 -1.71351794E+03 -1.71146497E+03 -1.70941199E+03 + -1.70646594E+03 -1.70352002E+03 -1.70057300E+03 -1.69762695E+03 + -1.69468103E+03 -1.69025305E+03 -1.68582397E+03 -1.68139600E+03 + -1.67696704E+03 -1.67253796E+03 -1.72222900E+03 -1.72022998E+03 + -1.71822998E+03 -1.71623096E+03 -1.71423096E+03 -1.71132996E+03 + -1.70842896E+03 -1.70552795E+03 -1.70262598E+03 -1.69972498E+03 + -1.69538306E+03 -1.69104102E+03 -1.68669800E+03 -1.68235596E+03 + -1.67801294E+03 -1.72572803E+03 -1.72373999E+03 -1.72175098E+03 + -1.71976196E+03 -1.71777405E+03 -1.71488904E+03 -1.71200500E+03 + -1.70912000E+03 -1.70623596E+03 -1.70335095E+03 -1.69905005E+03 + -1.69475000E+03 -1.69044897E+03 -1.68614795E+03 -1.68184802E+03 + -1.73011401E+03 -1.73011401E+03 -1.73011401E+03 -1.73011401E+03 + -1.72812500E+03 -1.72812500E+03 -1.72812500E+03 -1.72812500E+03 + -1.72613501E+03 -1.72613501E+03 -1.72613501E+03 -1.72613501E+03 + -1.72414600E+03 -1.72414600E+03 -1.72414600E+03 -1.72414600E+03 + -1.72215601E+03 -1.72215601E+03 -1.72215601E+03 -1.72215601E+03 + -1.71925098E+03 -1.71925098E+03 -1.71925098E+03 -1.71925098E+03 + -1.71634595E+03 -1.71634595E+03 -1.71634595E+03 -1.71634595E+03 + -1.71343994E+03 -1.71343994E+03 -1.71343994E+03 -1.71343994E+03 + -1.71053503E+03 -1.71053503E+03 -1.71053503E+03 -1.71053503E+03 + -1.70763000E+03 -1.70763000E+03 -1.70763000E+03 -1.70763000E+03 + -1.70325806E+03 -1.70325806E+03 -1.70325806E+03 -1.70325806E+03 + -1.69888599E+03 -1.69888599E+03 -1.69888599E+03 -1.69888599E+03 + -1.69451501E+03 -1.69451501E+03 -1.69451501E+03 -1.69451501E+03 + -1.69014294E+03 -1.69014294E+03 -1.69014294E+03 -1.69014294E+03 + -1.68577100E+03 -1.68577100E+03 -1.68577100E+03 -1.68577100E+03 + -1.69202002E+03 -1.69202002E+03 -1.69202002E+03 -1.69202002E+03 + -1.68977197E+03 -1.68977197E+03 -1.68977197E+03 -1.68977197E+03 + -1.68752502E+03 -1.68752502E+03 -1.68752502E+03 -1.68752502E+03 + -1.68527795E+03 -1.68527795E+03 -1.68527795E+03 -1.68527795E+03 + -1.68303101E+03 -1.68303101E+03 -1.68303101E+03 -1.68303101E+03 + -1.67973401E+03 -1.67973401E+03 -1.67973401E+03 -1.67973401E+03 + -1.67643799E+03 -1.67643799E+03 -1.67643799E+03 -1.67643799E+03 + -1.67314099E+03 -1.67314099E+03 -1.67314099E+03 -1.67314099E+03 + -1.66984497E+03 -1.66984497E+03 -1.66984497E+03 -1.66984497E+03 + -1.66654797E+03 -1.66654797E+03 -1.66654797E+03 -1.66654797E+03 + -1.66165906E+03 -1.66165906E+03 -1.66165906E+03 -1.66165906E+03 + -1.65677002E+03 -1.65677002E+03 -1.65677002E+03 -1.65677002E+03 + -1.65188098E+03 -1.65188098E+03 -1.65188098E+03 -1.65188098E+03 + -1.64699097E+03 -1.64699097E+03 -1.64699097E+03 -1.64699097E+03 + -1.64210205E+03 -1.64210205E+03 -1.64210205E+03 -1.64210205E+03 + -1.69158801E+03 -1.68943506E+03 -1.68728101E+03 -1.68512805E+03 + -1.68297498E+03 -1.67981702E+03 -1.67665906E+03 -1.67350098E+03 + -1.67034302E+03 -1.66718396E+03 -1.66240198E+03 -1.65761902E+03 + -1.65283704E+03 -1.64805396E+03 -1.64327100E+03 -1.68914905E+03 + -1.68703796E+03 -1.68492700E+03 -1.68281604E+03 -1.68070496E+03 + -1.67757898E+03 -1.67445398E+03 -1.67132800E+03 -1.66820203E+03 + -1.66507605E+03 -1.66035095E+03 -1.65562695E+03 -1.65090198E+03 + -1.64617798E+03 -1.64145300E+03 -1.68534302E+03 -1.68325195E+03 + -1.68116199E+03 -1.67907104E+03 -1.67697998E+03 -1.67389404E+03 + -1.67080798E+03 -1.66772205E+03 -1.66463599E+03 -1.66154895E+03 + -1.65691101E+03 -1.65227197E+03 -1.64763403E+03 -1.64299500E+03 + -1.63835596E+03 -1.68065601E+03 -1.67861304E+03 -1.67657104E+03 + -1.67452795E+03 -1.67248596E+03 -1.66946204E+03 -1.66643799E+03 + -1.66341504E+03 -1.66039099E+03 -1.65736694E+03 -1.65284399E+03 + -1.64831995E+03 -1.64379700E+03 -1.63927405E+03 -1.63475000E+03 + -1.67772302E+03 -1.67571204E+03 -1.67370105E+03 -1.67168994E+03 + -1.66968005E+03 -1.66673303E+03 -1.66378601E+03 -1.66083899E+03 + -1.65789294E+03 -1.65494604E+03 -1.65055603E+03 -1.64616504E+03 + -1.64177502E+03 -1.63738403E+03 -1.63299402E+03 -1.67627795E+03 + -1.67432703E+03 -1.67237598E+03 -1.67042505E+03 -1.66847400E+03 + -1.66562402E+03 -1.66277295E+03 -1.65992297E+03 -1.65707300E+03 + -1.65422205E+03 -1.64997900E+03 -1.64573596E+03 -1.64149304E+03 + -1.63725000E+03 -1.63300696E+03 -1.67385498E+03 -1.67195300E+03 + -1.67005103E+03 -1.66814905E+03 -1.66624597E+03 -1.66351904E+03 + -1.66079199E+03 -1.65806396E+03 -1.65533704E+03 -1.65260999E+03 + -1.64859204E+03 -1.64457495E+03 -1.64055701E+03 -1.63654004E+03 + -1.63252197E+03 -1.67454102E+03 -1.67247705E+03 -1.67041296E+03 + -1.66834998E+03 -1.66628601E+03 -1.66367297E+03 -1.66106006E+03 + -1.65844702E+03 -1.65583301E+03 -1.65321997E+03 -1.64944702E+03 + -1.64567395E+03 -1.64190100E+03 -1.63812805E+03 -1.63435498E+03 + -1.68275806E+03 -1.68032605E+03 -1.67789404E+03 -1.67546204E+03 + -1.67303003E+03 -1.66998804E+03 -1.66694495E+03 -1.66390295E+03 + -1.66086096E+03 -1.65781799E+03 -1.65359497E+03 -1.64937195E+03 + -1.64514905E+03 -1.64092700E+03 -1.63670398E+03 -1.69234302E+03 + -1.69015405E+03 -1.68796497E+03 -1.68577600E+03 -1.68358704E+03 + -1.68041394E+03 -1.67724097E+03 -1.67406799E+03 -1.67089404E+03 + -1.66772095E+03 -1.66298596E+03 -1.65825098E+03 -1.65351501E+03 + -1.64878003E+03 -1.64404395E+03 -1.69970605E+03 -1.69768799E+03 + -1.69566895E+03 -1.69365100E+03 -1.69163196E+03 -1.68862598E+03 + -1.68562000E+03 -1.68261401E+03 -1.67960706E+03 -1.67660095E+03 + -1.67179395E+03 -1.66698804E+03 -1.66218103E+03 -1.65737402E+03 + -1.65256702E+03 -1.70424597E+03 -1.70240100E+03 -1.70055701E+03 + -1.69871204E+03 -1.69686694E+03 -1.69404700E+03 -1.69122595E+03 + -1.68840503E+03 -1.68558398E+03 -1.68276294E+03 -1.67800806E+03 + -1.67325195E+03 -1.66849695E+03 -1.66374194E+03 -1.65898706E+03 + -1.70790601E+03 -1.70605798E+03 -1.70420996E+03 -1.70236206E+03 + -1.70051404E+03 -1.69768103E+03 -1.69484802E+03 -1.69201404E+03 + -1.68918103E+03 -1.68634802E+03 -1.68163794E+03 -1.67692896E+03 + -1.67221899E+03 -1.66751001E+03 -1.66280005E+03 -1.70681702E+03 + -1.70492505E+03 -1.70303198E+03 -1.70113904E+03 -1.69924597E+03 + -1.69639099E+03 -1.69353601E+03 -1.69068005E+03 -1.68782495E+03 + -1.68496899E+03 -1.68048596E+03 -1.67600195E+03 -1.67151794E+03 + -1.66703503E+03 -1.66255103E+03 -1.70601599E+03 -1.70413098E+03 + -1.70224500E+03 -1.70035999E+03 -1.69847498E+03 -1.69566699E+03 + -1.69285803E+03 -1.69004895E+03 -1.68724097E+03 -1.68443201E+03 + -1.68000598E+03 -1.67557996E+03 -1.67115295E+03 -1.66672705E+03 + -1.66230005E+03 -1.70587000E+03 -1.70396704E+03 -1.70206494E+03 + -1.70016296E+03 -1.69826001E+03 -1.69537305E+03 -1.69248706E+03 + -1.68959998E+03 -1.68671301E+03 -1.68382605E+03 -1.67925195E+03 + -1.67467798E+03 -1.67010400E+03 -1.66553003E+03 -1.66095605E+03 + -1.70639001E+03 -1.70440100E+03 -1.70241296E+03 -1.70042505E+03 + -1.69843701E+03 -1.69544702E+03 -1.69245703E+03 -1.68946704E+03 + -1.68647705E+03 -1.68348706E+03 -1.67885095E+03 -1.67421497E+03 + -1.66957898E+03 -1.66494299E+03 -1.66030701E+03 -1.70599805E+03 + -1.70390100E+03 -1.70180396E+03 -1.69970703E+03 -1.69760999E+03 + -1.69458801E+03 -1.69156494E+03 -1.68854199E+03 -1.68551904E+03 + -1.68249695E+03 -1.67796899E+03 -1.67344104E+03 -1.66891296E+03 + -1.66438501E+03 -1.65985803E+03 -1.70438403E+03 -1.70438403E+03 + -1.71234998E+03 -1.70438403E+03 -1.70230103E+03 -1.70230103E+03 + -1.71006604E+03 -1.70230103E+03 -1.70021802E+03 -1.70021802E+03 + -1.70778101E+03 -1.70021802E+03 -1.69813501E+03 -1.69813501E+03 + -1.70549695E+03 -1.69813501E+03 -1.69605200E+03 -1.69605200E+03 + -1.70321204E+03 -1.69605200E+03 -1.69303406E+03 -1.69303406E+03 + -1.70022302E+03 -1.69303406E+03 -1.69001501E+03 -1.69001501E+03 + -1.69723401E+03 -1.69001501E+03 -1.68699695E+03 -1.68699695E+03 + -1.69424402E+03 -1.68699695E+03 -1.68397900E+03 -1.68397900E+03 + -1.69125500E+03 -1.68397900E+03 -1.68096106E+03 -1.68096106E+03 + -1.68826599E+03 -1.68096106E+03 -1.67636304E+03 -1.67636304E+03 + -1.68339502E+03 -1.67636304E+03 -1.67176599E+03 -1.67176599E+03 + -1.67852502E+03 -1.67176599E+03 -1.66716895E+03 -1.66716895E+03 + -1.67365405E+03 -1.66716895E+03 -1.66257104E+03 -1.66257104E+03 + -1.66878296E+03 -1.66257104E+03 -1.65797400E+03 -1.65797400E+03 + -1.66391296E+03 -1.65797400E+03 -1.71428101E+03 -1.70331104E+03 + -1.71428101E+03 -1.71428101E+03 -1.71207800E+03 -1.70124902E+03 + -1.71207800E+03 -1.71207800E+03 -1.70987500E+03 -1.69918701E+03 + -1.70987500E+03 -1.70987500E+03 -1.70767200E+03 -1.69712500E+03 + -1.70767200E+03 -1.70767200E+03 -1.70546997E+03 -1.69506201E+03 + -1.70546997E+03 -1.70546997E+03 -1.70242603E+03 -1.69213501E+03 + -1.70242603E+03 -1.70242603E+03 -1.69938098E+03 -1.68920801E+03 + -1.69938098E+03 -1.69938098E+03 -1.69633704E+03 -1.68628101E+03 + -1.69633704E+03 -1.69633704E+03 -1.69329297E+03 -1.68335400E+03 + -1.69329297E+03 -1.69329297E+03 -1.69024902E+03 -1.68042700E+03 + -1.69024902E+03 -1.69024902E+03 -1.68561096E+03 -1.67582104E+03 + -1.68561096E+03 -1.68561096E+03 -1.68097302E+03 -1.67121497E+03 + -1.68097302E+03 -1.68097302E+03 -1.67633496E+03 -1.66660901E+03 + -1.67633496E+03 -1.67633496E+03 -1.67169702E+03 -1.66200305E+03 + -1.67169702E+03 -1.67169702E+03 -1.66705896E+03 -1.65739697E+03 + -1.66705896E+03 -1.66705896E+03 -1.71668005E+03 -1.71458496E+03 + -1.71248999E+03 -1.71039502E+03 -1.70830005E+03 -1.70528894E+03 + -1.70227795E+03 -1.69926599E+03 -1.69625500E+03 -1.69324402E+03 + -1.68874402E+03 -1.68424402E+03 -1.67974402E+03 -1.67524402E+03 + -1.67074402E+03 -1.71940796E+03 -1.71733801E+03 -1.71526794E+03 + -1.71319897E+03 -1.71112903E+03 -1.70815405E+03 -1.70517896E+03 + -1.70220398E+03 -1.69922900E+03 -1.69625403E+03 -1.69182397E+03 + -1.68739502E+03 -1.68296594E+03 -1.67853601E+03 -1.67410706E+03 + -1.72305005E+03 -1.72305005E+03 -1.72305005E+03 -1.72305005E+03 + -1.72102100E+03 -1.72102100E+03 -1.72102100E+03 -1.72102100E+03 + -1.71899097E+03 -1.71899097E+03 -1.71899097E+03 -1.71899097E+03 + -1.71696204E+03 -1.71696204E+03 -1.71696204E+03 -1.71696204E+03 + -1.71493298E+03 -1.71493298E+03 -1.71493298E+03 -1.71493298E+03 + -1.71200696E+03 -1.71200696E+03 -1.71200696E+03 -1.71200696E+03 + -1.70908105E+03 -1.70908105E+03 -1.70908105E+03 -1.70908105E+03 + -1.70615405E+03 -1.70615405E+03 -1.70615405E+03 -1.70615405E+03 + -1.70322803E+03 -1.70322803E+03 -1.70322803E+03 -1.70322803E+03 + -1.70030200E+03 -1.70030200E+03 -1.70030200E+03 -1.70030200E+03 + -1.69595300E+03 -1.69595300E+03 -1.69595300E+03 -1.69595300E+03 + -1.69160303E+03 -1.69160303E+03 -1.69160303E+03 -1.69160303E+03 + -1.68725403E+03 -1.68725403E+03 -1.68725403E+03 -1.68725403E+03 + -1.68290405E+03 -1.68290405E+03 -1.68290405E+03 -1.68290405E+03 + -1.67855505E+03 -1.67855505E+03 -1.67855505E+03 -1.67855505E+03 + -1.70503296E+03 -1.70503296E+03 -1.70503296E+03 -1.70503296E+03 + -1.70289905E+03 -1.70289905E+03 -1.70289905E+03 -1.70289905E+03 + -1.70076404E+03 -1.70076404E+03 -1.70076404E+03 -1.70076404E+03 + -1.69862903E+03 -1.69862903E+03 -1.69862903E+03 -1.69862903E+03 + -1.69649500E+03 -1.69649500E+03 -1.69649500E+03 -1.69649500E+03 + -1.69338403E+03 -1.69338403E+03 -1.69338403E+03 -1.69338403E+03 + -1.69027295E+03 -1.69027295E+03 -1.69027295E+03 -1.69027295E+03 + -1.68716199E+03 -1.68716199E+03 -1.68716199E+03 -1.68716199E+03 + -1.68405103E+03 -1.68405103E+03 -1.68405103E+03 -1.68405103E+03 + -1.68093994E+03 -1.68093994E+03 -1.68093994E+03 -1.68093994E+03 + -1.67628198E+03 -1.67628198E+03 -1.67628198E+03 -1.67628198E+03 + -1.67162402E+03 -1.67162402E+03 -1.67162402E+03 -1.67162402E+03 + -1.66696497E+03 -1.66696497E+03 -1.66696497E+03 -1.66696497E+03 + -1.66230701E+03 -1.66230701E+03 -1.66230701E+03 -1.66230701E+03 + -1.65764795E+03 -1.65764795E+03 -1.65764795E+03 -1.65764795E+03 + -1.70296997E+03 -1.70086206E+03 -1.69875403E+03 -1.69664502E+03 + -1.69453699E+03 -1.69144800E+03 -1.68835901E+03 -1.68526904E+03 + -1.68218005E+03 -1.67909094E+03 -1.67443201E+03 -1.66977405E+03 + -1.66511499E+03 -1.66045703E+03 -1.65579797E+03 -1.70090601E+03 + -1.69879602E+03 -1.69668604E+03 -1.69457703E+03 -1.69246704E+03 + -1.68941504E+03 -1.68636206E+03 -1.68331006E+03 -1.68025696E+03 + -1.67720496E+03 -1.67261499E+03 -1.66802600E+03 -1.66343604E+03 + -1.65884705E+03 -1.65425696E+03 -1.69603796E+03 -1.69413196E+03 + -1.69222498E+03 -1.69031799E+03 -1.68841199E+03 -1.68542603E+03 + -1.68244104E+03 -1.67945496E+03 -1.67646997E+03 -1.67348499E+03 + -1.66897302E+03 -1.66446106E+03 -1.65994897E+03 -1.65543799E+03 + -1.65092603E+03 -1.69145496E+03 -1.68950696E+03 -1.68756006E+03 + -1.68561206E+03 -1.68366394E+03 -1.68072095E+03 -1.67777698E+03 + -1.67483301E+03 -1.67188904E+03 -1.66894495E+03 -1.66449597E+03 + -1.66004602E+03 -1.65559595E+03 -1.65114600E+03 -1.64669702E+03 + -1.68739600E+03 -1.68539099E+03 -1.68338599E+03 -1.68138098E+03 + -1.67937598E+03 -1.67643298E+03 -1.67348901E+03 -1.67054602E+03 + -1.66760205E+03 -1.66465796E+03 -1.66022705E+03 -1.65579504E+03 + -1.65136401E+03 -1.64693201E+03 -1.64250000E+03 -1.68329797E+03 + -1.68135498E+03 -1.67941101E+03 -1.67746704E+03 -1.67552405E+03 + -1.67265002E+03 -1.66977600E+03 -1.66690198E+03 -1.66402795E+03 + -1.66115405E+03 -1.65684705E+03 -1.65254004E+03 -1.64823303E+03 + -1.64392505E+03 -1.63961804E+03 -1.67892004E+03 -1.67709399E+03 + -1.67526904E+03 -1.67344397E+03 -1.67161804E+03 -1.66892297E+03 + -1.66622803E+03 -1.66353296E+03 -1.66083801E+03 -1.65814294E+03 + -1.65410498E+03 -1.65006799E+03 -1.64603003E+03 -1.64199194E+03 + -1.63795398E+03 -1.67750598E+03 -1.67576599E+03 -1.67402600E+03 + -1.67228601E+03 -1.67054602E+03 -1.66799695E+03 -1.66544800E+03 + -1.66290002E+03 -1.66035095E+03 -1.65780298E+03 -1.65380505E+03 + -1.64980798E+03 -1.64581006E+03 -1.64181299E+03 -1.63781604E+03 + -1.68032800E+03 -1.67844202E+03 -1.67655701E+03 -1.67467102E+03 + -1.67278503E+03 -1.67009497E+03 -1.66740601E+03 -1.66471594E+03 + -1.66202600E+03 -1.65933704E+03 -1.65517505E+03 -1.65101294E+03 + -1.64685205E+03 -1.64268994E+03 -1.63852795E+03 -1.68803101E+03 + -1.68599805E+03 -1.68396399E+03 -1.68193103E+03 -1.67989795E+03 + -1.67703198E+03 -1.67416699E+03 -1.67130200E+03 -1.66843701E+03 + -1.66557202E+03 -1.66114197E+03 -1.65671301E+03 -1.65228406E+03 + -1.64785400E+03 -1.64342505E+03 -1.69762695E+03 -1.69550598E+03 + -1.69338403E+03 -1.69126196E+03 -1.68914099E+03 -1.68609595E+03 + -1.68305200E+03 -1.68000696E+03 -1.67696301E+03 -1.67391797E+03 + -1.66913501E+03 -1.66435095E+03 -1.65956799E+03 -1.65478406E+03 + -1.65000098E+03 -1.70483704E+03 -1.70268604E+03 -1.70053503E+03 + -1.69838501E+03 -1.69623401E+03 -1.69311804E+03 -1.69000195E+03 + -1.68688599E+03 -1.68377100E+03 -1.68065503E+03 -1.67564502E+03 + -1.67063501E+03 -1.66562500E+03 -1.66061499E+03 -1.65560498E+03 + -1.70867004E+03 -1.70653296E+03 -1.70439502E+03 -1.70225806E+03 + -1.70012097E+03 -1.69698096E+03 -1.69384204E+03 -1.69070203E+03 + -1.68756299E+03 -1.68442297E+03 -1.67934302E+03 -1.67426196E+03 + -1.66918201E+03 -1.66410095E+03 -1.65902100E+03 -1.70821106E+03 + -1.70613306E+03 -1.70405505E+03 -1.70197705E+03 -1.69989905E+03 + -1.69684705E+03 -1.69379504E+03 -1.69074304E+03 -1.68769104E+03 + -1.68463904E+03 -1.67974805E+03 -1.67485596E+03 -1.66996497E+03 + -1.66507397E+03 -1.66018298E+03 -1.70767505E+03 -1.70561304E+03 + -1.70355103E+03 -1.70148901E+03 -1.69942700E+03 -1.69641504E+03 + -1.69340295E+03 -1.69039099E+03 -1.68737903E+03 -1.68436804E+03 + -1.67957703E+03 -1.67478601E+03 -1.66999597E+03 -1.66520496E+03 + -1.66041504E+03 -1.70645898E+03 -1.70432898E+03 -1.70219995E+03 + -1.70007104E+03 -1.69794202E+03 -1.69488196E+03 -1.69182300E+03 + -1.68876404E+03 -1.68570398E+03 -1.68264502E+03 -1.67790698E+03 + -1.67316797E+03 -1.66843005E+03 -1.66369202E+03 -1.65895398E+03 + -1.70609802E+03 -1.70391504E+03 -1.70173096E+03 -1.69954700E+03 + -1.69736304E+03 -1.69420496E+03 -1.69104700E+03 -1.68788904E+03 + -1.68473206E+03 -1.68157397E+03 -1.67685901E+03 -1.67214502E+03 + -1.66743103E+03 -1.66271704E+03 -1.65800195E+03 -1.70558301E+03 + -1.70347205E+03 -1.70136206E+03 -1.69925098E+03 -1.69714001E+03 + -1.69409302E+03 -1.69104602E+03 -1.68799902E+03 -1.68495203E+03 + -1.68190503E+03 -1.67731201E+03 -1.67271899E+03 -1.66812500E+03 + -1.66353198E+03 -1.65893799E+03 -1.70383203E+03 -1.70171997E+03 + -1.69960706E+03 -1.69749402E+03 -1.69538196E+03 -1.69232202E+03 + -1.68926294E+03 -1.68620398E+03 -1.68314404E+03 -1.68008496E+03 + -1.67552600E+03 -1.67096594E+03 -1.66640698E+03 -1.66184802E+03 + -1.65728894E+03 -1.70303198E+03 -1.70303198E+03 -1.71152698E+03 + -1.70303198E+03 -1.70088904E+03 -1.70088904E+03 -1.70917200E+03 + -1.70088904E+03 -1.69874695E+03 -1.69874695E+03 -1.70681702E+03 + -1.69874695E+03 -1.69660400E+03 -1.69660400E+03 -1.70446301E+03 + -1.69660400E+03 -1.69446204E+03 -1.69446204E+03 -1.70210803E+03 + -1.69446204E+03 -1.69137195E+03 -1.69137195E+03 -1.69913794E+03 + -1.69137195E+03 -1.68828198E+03 -1.68828198E+03 -1.69616797E+03 + -1.68828198E+03 -1.68519299E+03 -1.68519299E+03 -1.69319800E+03 + -1.68519299E+03 -1.68210303E+03 -1.68210303E+03 -1.69022803E+03 + -1.68210303E+03 -1.67901294E+03 -1.67901294E+03 -1.68725696E+03 + -1.67901294E+03 -1.67440601E+03 -1.67440601E+03 -1.68226904E+03 + -1.67440601E+03 -1.66979797E+03 -1.66979797E+03 -1.67728101E+03 + -1.66979797E+03 -1.66518994E+03 -1.66518994E+03 -1.67229199E+03 + -1.66518994E+03 -1.66058301E+03 -1.66058301E+03 -1.66730396E+03 + -1.66058301E+03 -1.65597498E+03 -1.65597498E+03 -1.66231494E+03 + -1.65597498E+03 -1.71313904E+03 -1.70045300E+03 -1.71313904E+03 + -1.71313904E+03 -1.71094104E+03 -1.69830798E+03 -1.71094104E+03 + -1.71094104E+03 -1.70874304E+03 -1.69616199E+03 -1.70874304E+03 + -1.70874304E+03 -1.70654395E+03 -1.69401697E+03 -1.70654395E+03 + -1.70654395E+03 -1.70434595E+03 -1.69187195E+03 -1.70434595E+03 + -1.70434595E+03 -1.70129004E+03 -1.68883398E+03 -1.70129004E+03 + -1.70129004E+03 -1.69823401E+03 -1.68579700E+03 -1.69823401E+03 + -1.69823401E+03 -1.69517798E+03 -1.68275903E+03 -1.69517798E+03 + -1.69517798E+03 -1.69212195E+03 -1.67972095E+03 -1.69212195E+03 + -1.69212195E+03 -1.68906604E+03 -1.67668396E+03 -1.68906604E+03 + -1.68906604E+03 -1.68430103E+03 -1.67232104E+03 -1.68430103E+03 + -1.68430103E+03 -1.67953601E+03 -1.66795801E+03 -1.67953601E+03 + -1.67953601E+03 -1.67477197E+03 -1.66359497E+03 -1.67477197E+03 + -1.67477197E+03 -1.67000696E+03 -1.65923303E+03 -1.67000696E+03 + -1.67000696E+03 -1.66524304E+03 -1.65487000E+03 -1.66524304E+03 + -1.66524304E+03 -1.71515906E+03 -1.71309802E+03 -1.71103699E+03 + -1.70897595E+03 -1.70691602E+03 -1.70382898E+03 -1.70074304E+03 + -1.69765601E+03 -1.69456995E+03 -1.69148401E+03 -1.68689905E+03 + -1.68231494E+03 -1.67773096E+03 -1.67314600E+03 -1.66856201E+03 + -1.71766003E+03 -1.71766003E+03 -1.71766003E+03 -1.71766003E+03 + -1.71552698E+03 -1.71552698E+03 -1.71552698E+03 -1.71552698E+03 + -1.71339294E+03 -1.71339294E+03 -1.71339294E+03 -1.71339294E+03 + -1.71126001E+03 -1.71126001E+03 -1.71126001E+03 -1.71126001E+03 + -1.70912695E+03 -1.70912695E+03 -1.70912695E+03 -1.70912695E+03 + -1.70609802E+03 -1.70609802E+03 -1.70609802E+03 -1.70609802E+03 + -1.70306897E+03 -1.70306897E+03 -1.70306897E+03 -1.70306897E+03 + -1.70003894E+03 -1.70003894E+03 -1.70003894E+03 -1.70003894E+03 + -1.69701001E+03 -1.69701001E+03 -1.69701001E+03 -1.69701001E+03 + -1.69398096E+03 -1.69398096E+03 -1.69398096E+03 -1.69398096E+03 + -1.68946997E+03 -1.68946997E+03 -1.68946997E+03 -1.68946997E+03 + -1.68495898E+03 -1.68495898E+03 -1.68495898E+03 -1.68495898E+03 + -1.68044897E+03 -1.68044897E+03 -1.68044897E+03 -1.68044897E+03 + -1.67593799E+03 -1.67593799E+03 -1.67593799E+03 -1.67593799E+03 + -1.67142700E+03 -1.67142700E+03 -1.67142700E+03 -1.67142700E+03 + -1.68423303E+03 -1.68423303E+03 -1.71401404E+03 -1.68423303E+03 + -1.68219104E+03 -1.68219104E+03 -1.71200195E+03 -1.68219104E+03 + -1.68014905E+03 -1.68014905E+03 -1.70998999E+03 -1.68014905E+03 + -1.67810706E+03 -1.67810706E+03 -1.70797803E+03 -1.67810706E+03 + -1.67606494E+03 -1.67606494E+03 -1.70596594E+03 -1.67606494E+03 + -1.67307703E+03 -1.67307703E+03 -1.70288696E+03 -1.67307703E+03 + -1.67008899E+03 -1.67008899E+03 -1.69980896E+03 -1.67008899E+03 + -1.66710205E+03 -1.66710205E+03 -1.69673096E+03 -1.66710205E+03 + -1.66411401E+03 -1.66411401E+03 -1.69365198E+03 -1.66411401E+03 + -1.66112598E+03 -1.66112598E+03 -1.69057397E+03 -1.66112598E+03 + -1.65683899E+03 -1.65683899E+03 -1.68594604E+03 -1.65683899E+03 + -1.65255200E+03 -1.65255200E+03 -1.68131799E+03 -1.65255200E+03 + -1.64826501E+03 -1.64826501E+03 -1.67669104E+03 -1.64826501E+03 + -1.64397803E+03 -1.64397803E+03 -1.67206299E+03 -1.64397803E+03 + -1.63968994E+03 -1.63968994E+03 -1.66743506E+03 -1.63968994E+03 + -1.71111597E+03 -1.67969604E+03 -1.71111597E+03 -1.67969604E+03 + -1.70913000E+03 -1.67765198E+03 -1.70913000E+03 -1.67765198E+03 + -1.70714404E+03 -1.67560706E+03 -1.70714404E+03 -1.67560706E+03 + -1.70515796E+03 -1.67356299E+03 -1.70515796E+03 -1.67356299E+03 + -1.70317200E+03 -1.67151904E+03 -1.70317200E+03 -1.67151904E+03 + -1.70009705E+03 -1.66854102E+03 -1.70009705E+03 -1.66854102E+03 + -1.69702197E+03 -1.66556396E+03 -1.69702197E+03 -1.66556396E+03 + -1.69394702E+03 -1.66258704E+03 -1.69394702E+03 -1.66258704E+03 + -1.69087195E+03 -1.65960901E+03 -1.69087195E+03 -1.65960901E+03 + -1.68779700E+03 -1.65663196E+03 -1.68779700E+03 -1.65663196E+03 + -1.68315405E+03 -1.65221497E+03 -1.68315405E+03 -1.65221497E+03 + -1.67851099E+03 -1.64779895E+03 -1.67851099E+03 -1.64779895E+03 + -1.67386804E+03 -1.64338196E+03 -1.67386804E+03 -1.64338196E+03 + -1.66922498E+03 -1.63896497E+03 -1.66922498E+03 -1.63896497E+03 + -1.66458203E+03 -1.63454797E+03 -1.66458203E+03 -1.63454797E+03 + -1.70777405E+03 -1.67463000E+03 -1.70777405E+03 -1.67463000E+03 + -1.70591394E+03 -1.67247400E+03 -1.70591394E+03 -1.67247400E+03 + -1.70405505E+03 -1.67031897E+03 -1.70405505E+03 -1.67031897E+03 + -1.70219495E+03 -1.66816394E+03 -1.70219495E+03 -1.66816394E+03 + -1.70033496E+03 -1.66600903E+03 -1.70033496E+03 -1.66600903E+03 + -1.69729297E+03 -1.66304004E+03 -1.69729297E+03 -1.66304004E+03 + -1.69425195E+03 -1.66007104E+03 -1.69425195E+03 -1.66007104E+03 + -1.69120996E+03 -1.65710205E+03 -1.69120996E+03 -1.65710205E+03 + -1.68816797E+03 -1.65413306E+03 -1.68816797E+03 -1.65413306E+03 + -1.68512598E+03 -1.65116394E+03 -1.68512598E+03 -1.65116394E+03 + -1.68036902E+03 -1.64676196E+03 -1.68036902E+03 -1.64676196E+03 + -1.67561206E+03 -1.64235999E+03 -1.67561206E+03 -1.64235999E+03 + -1.67085498E+03 -1.63795801E+03 -1.67085498E+03 -1.63795801E+03 + -1.66609802E+03 -1.63355603E+03 -1.66609802E+03 -1.63355603E+03 + -1.66133997E+03 -1.62915405E+03 -1.66133997E+03 -1.62915405E+03 + -1.70103503E+03 -1.66739404E+03 -1.70103503E+03 -1.66739404E+03 + -1.69993005E+03 -1.66518896E+03 -1.69993005E+03 -1.66518896E+03 + -1.69882495E+03 -1.66298401E+03 -1.69882495E+03 -1.66298401E+03 + -1.69771997E+03 -1.66077905E+03 -1.69771997E+03 -1.66077905E+03 + -1.69661499E+03 -1.65857397E+03 -1.69661499E+03 -1.65857397E+03 + -1.69359094E+03 -1.65560999E+03 -1.69359094E+03 -1.65560999E+03 + -1.69056799E+03 -1.65264697E+03 -1.69056799E+03 -1.65264697E+03 + -1.68754395E+03 -1.64968396E+03 -1.68754395E+03 -1.64968396E+03 + -1.68452002E+03 -1.64672095E+03 -1.68452002E+03 -1.64672095E+03 + -1.68149695E+03 -1.64375806E+03 -1.68149695E+03 -1.64375806E+03 + -1.67671704E+03 -1.63940601E+03 -1.67671704E+03 -1.63940601E+03 + -1.67193799E+03 -1.63505505E+03 -1.67193799E+03 -1.63505505E+03 + -1.66715796E+03 -1.63070300E+03 -1.66715796E+03 -1.63070300E+03 + -1.66237903E+03 -1.62635095E+03 -1.66237903E+03 -1.62635095E+03 + -1.65759900E+03 -1.62200000E+03 -1.65759900E+03 -1.62200000E+03 + -1.69659900E+03 -1.65772498E+03 -1.69659900E+03 -1.65772498E+03 + -1.69543201E+03 -1.65571802E+03 -1.69543201E+03 -1.65571802E+03 + -1.69426599E+03 -1.65370996E+03 -1.69426599E+03 -1.65370996E+03 + -1.69309998E+03 -1.65170300E+03 -1.69309998E+03 -1.65170300E+03 + -1.69193298E+03 -1.64969604E+03 -1.69193298E+03 -1.64969604E+03 + -1.68892505E+03 -1.64674304E+03 -1.68892505E+03 -1.64674304E+03 + -1.68591699E+03 -1.64379004E+03 -1.68591699E+03 -1.64379004E+03 + -1.68290906E+03 -1.64083801E+03 -1.68290906E+03 -1.64083801E+03 + -1.67990100E+03 -1.63788501E+03 -1.67990100E+03 -1.63788501E+03 + -1.67689294E+03 -1.63493201E+03 -1.67689294E+03 -1.63493201E+03 + -1.67213000E+03 -1.63057300E+03 -1.67213000E+03 -1.63057300E+03 + -1.66736804E+03 -1.62621399E+03 -1.66736804E+03 -1.62621399E+03 + -1.66260498E+03 -1.62185498E+03 -1.66260498E+03 -1.62185498E+03 + -1.65784204E+03 -1.61749597E+03 -1.65784204E+03 -1.61749597E+03 + -1.65307996E+03 -1.61313696E+03 -1.65307996E+03 -1.61313696E+03 + -1.69432800E+03 -1.65018396E+03 -1.69432800E+03 -1.65018396E+03 + -1.69265601E+03 -1.64818799E+03 -1.69265601E+03 -1.64818799E+03 + -1.69098401E+03 -1.64619104E+03 -1.69098401E+03 -1.64619104E+03 + -1.68931104E+03 -1.64419495E+03 -1.68931104E+03 -1.64419495E+03 + -1.68763904E+03 -1.64219800E+03 -1.68763904E+03 -1.64219800E+03 + -1.68466199E+03 -1.63922400E+03 -1.68466199E+03 -1.63922400E+03 + -1.68168506E+03 -1.63624902E+03 -1.68168506E+03 -1.63624902E+03 + -1.67870703E+03 -1.63327405E+03 -1.67870703E+03 -1.63327405E+03 + -1.67572998E+03 -1.63029895E+03 -1.67572998E+03 -1.63029895E+03 + -1.67275305E+03 -1.62732397E+03 -1.67275305E+03 -1.62732397E+03 + -1.66800806E+03 -1.62289001E+03 -1.66800806E+03 -1.62289001E+03 + -1.66326294E+03 -1.61845605E+03 -1.66326294E+03 -1.61845605E+03 + -1.65851794E+03 -1.61402197E+03 -1.65851794E+03 -1.61402197E+03 + -1.65377405E+03 -1.60958801E+03 -1.65377405E+03 -1.60958801E+03 + -1.64902905E+03 -1.60515405E+03 -1.64902905E+03 -1.60515405E+03 + -1.69058899E+03 -1.64629395E+03 -1.69058899E+03 -1.64629395E+03 + -1.68881201E+03 -1.64404102E+03 -1.68881201E+03 -1.64404102E+03 + -1.68703406E+03 -1.64178894E+03 -1.68703406E+03 -1.64178894E+03 + -1.68525598E+03 -1.63953601E+03 -1.68525598E+03 -1.63953601E+03 + -1.68347803E+03 -1.63728296E+03 -1.68347803E+03 -1.63728296E+03 + -1.68055603E+03 -1.63424402E+03 -1.68055603E+03 -1.63424402E+03 + -1.67763403E+03 -1.63120605E+03 -1.67763403E+03 -1.63120605E+03 + -1.67471106E+03 -1.62816699E+03 -1.67471106E+03 -1.62816699E+03 + -1.67178894E+03 -1.62512805E+03 -1.67178894E+03 -1.62512805E+03 + -1.66886694E+03 -1.62208899E+03 -1.66886694E+03 -1.62208899E+03 + -1.66423596E+03 -1.61759705E+03 -1.66423596E+03 -1.61759705E+03 + -1.65960498E+03 -1.61310400E+03 -1.65960498E+03 -1.61310400E+03 + -1.65497400E+03 -1.60861096E+03 -1.65497400E+03 -1.60861096E+03 + -1.65034302E+03 -1.60411902E+03 -1.65034302E+03 -1.60411902E+03 + -1.64571204E+03 -1.59962598E+03 -1.64571204E+03 -1.59962598E+03 + -1.68682495E+03 -1.64165601E+03 -1.68682495E+03 -1.64165601E+03 + -1.68496106E+03 -1.63939099E+03 -1.68496106E+03 -1.63939099E+03 + -1.68309595E+03 -1.63712500E+03 -1.68309595E+03 -1.63712500E+03 + -1.68123206E+03 -1.63485901E+03 -1.68123206E+03 -1.63485901E+03 + -1.67936694E+03 -1.63259399E+03 -1.67936694E+03 -1.63259399E+03 + -1.67652502E+03 -1.62948596E+03 -1.67652502E+03 -1.62948596E+03 + -1.67368298E+03 -1.62637903E+03 -1.67368298E+03 -1.62637903E+03 + -1.67084204E+03 -1.62327197E+03 -1.67084204E+03 -1.62327197E+03 + -1.66800000E+03 -1.62016504E+03 -1.66800000E+03 -1.62016504E+03 + -1.66515796E+03 -1.61705701E+03 -1.66515796E+03 -1.61705701E+03 + -1.66073999E+03 -1.61260803E+03 -1.66073999E+03 -1.61260803E+03 + -1.65632202E+03 -1.60815796E+03 -1.65632202E+03 -1.60815796E+03 + -1.65190295E+03 -1.60370801E+03 -1.65190295E+03 -1.60370801E+03 + -1.64748499E+03 -1.59925806E+03 -1.64748499E+03 -1.59925806E+03 + -1.64306702E+03 -1.59480798E+03 -1.64306702E+03 -1.59480798E+03 + -1.68336597E+03 -1.63417004E+03 -1.68336597E+03 -1.68145300E+03 + -1.68148999E+03 -1.63195203E+03 -1.68148999E+03 -1.67953101E+03 + -1.67961401E+03 -1.62973303E+03 -1.67961401E+03 -1.67760803E+03 + -1.67773804E+03 -1.62751501E+03 -1.67773804E+03 -1.67568604E+03 + -1.67586206E+03 -1.62529700E+03 -1.67586206E+03 -1.67376294E+03 + -1.67313403E+03 -1.62212000E+03 -1.67313403E+03 -1.67088098E+03 + -1.67040503E+03 -1.61894299E+03 -1.67040503E+03 -1.66799805E+03 + -1.66767700E+03 -1.61576599E+03 -1.66767700E+03 -1.66511597E+03 + -1.66494800E+03 -1.61258899E+03 -1.66494800E+03 -1.66223303E+03 + -1.66221997E+03 -1.60941199E+03 -1.66221997E+03 -1.65935095E+03 + -1.65782202E+03 -1.60535706E+03 -1.65782202E+03 -1.65457397E+03 + -1.65342297E+03 -1.60130103E+03 -1.65342297E+03 -1.64979700E+03 + -1.64902502E+03 -1.59724597E+03 -1.64902502E+03 -1.64502100E+03 + -1.64462695E+03 -1.59318994E+03 -1.64462695E+03 -1.64024402E+03 + -1.64022803E+03 -1.58913501E+03 -1.64022803E+03 -1.63546704E+03 + -1.68294202E+03 -1.67286804E+03 -1.68294202E+03 -1.67286804E+03 + -1.68108997E+03 -1.67100305E+03 -1.68108997E+03 -1.67100305E+03 + -1.67923804E+03 -1.66913696E+03 -1.67923804E+03 -1.66913696E+03 + -1.67738696E+03 -1.66727197E+03 -1.67738696E+03 -1.66727197E+03 + -1.67553503E+03 -1.66540698E+03 -1.67553503E+03 -1.66540698E+03 + -1.67289294E+03 -1.66234802E+03 -1.67289294E+03 -1.66234802E+03 + -1.67025000E+03 -1.65928894E+03 -1.67025000E+03 -1.65928894E+03 + -1.66760803E+03 -1.65622998E+03 -1.66760803E+03 -1.65622998E+03 + -1.66496497E+03 -1.65317102E+03 -1.66496497E+03 -1.65317102E+03 + -1.66232300E+03 -1.65011206E+03 -1.66232300E+03 -1.65011206E+03 + -1.65793103E+03 -1.64495898E+03 -1.65793103E+03 -1.64495898E+03 + -1.65354004E+03 -1.63980603E+03 -1.65354004E+03 -1.63980603E+03 + -1.64914795E+03 -1.63465295E+03 -1.64914795E+03 -1.63465295E+03 + -1.64475696E+03 -1.62950000E+03 -1.64475696E+03 -1.62950000E+03 + -1.64036499E+03 -1.62434595E+03 -1.64036499E+03 -1.62434595E+03 + -1.68670703E+03 -1.66502197E+03 -1.68670703E+03 -1.66502197E+03 + -1.68480005E+03 -1.66304700E+03 -1.68480005E+03 -1.66304700E+03 + -1.68289404E+03 -1.66107202E+03 -1.68289404E+03 -1.66107202E+03 + -1.68098706E+03 -1.65909595E+03 -1.68098706E+03 -1.65909595E+03 + -1.67907996E+03 -1.65712097E+03 -1.67907996E+03 -1.65712097E+03 + -1.67641699E+03 -1.65369495E+03 -1.67641699E+03 -1.65369495E+03 + -1.67375500E+03 -1.65026904E+03 -1.67375500E+03 -1.65026904E+03 + -1.67109204E+03 -1.64684204E+03 -1.67109204E+03 -1.64684204E+03 + -1.66842896E+03 -1.64341699E+03 -1.66842896E+03 -1.64341699E+03 + -1.66576599E+03 -1.63998999E+03 -1.66576599E+03 -1.63998999E+03 + -1.66129602E+03 -1.63506702E+03 -1.66129602E+03 -1.63506702E+03 + -1.65682703E+03 -1.63014404E+03 -1.65682703E+03 -1.63014404E+03 + -1.65235706E+03 -1.62522095E+03 -1.65235706E+03 -1.62522095E+03 + -1.64788696E+03 -1.62029895E+03 -1.64788696E+03 -1.62029895E+03 + -1.64341699E+03 -1.61537598E+03 -1.64341699E+03 -1.61537598E+03 + -1.69403003E+03 -1.65788794E+03 -1.69403003E+03 -1.65788794E+03 + -1.69194897E+03 -1.65564099E+03 -1.69194897E+03 -1.65564099E+03 + -1.68986804E+03 -1.65339404E+03 -1.68986804E+03 -1.65339404E+03 + -1.68778699E+03 -1.65114600E+03 -1.68778699E+03 -1.65114600E+03 + -1.68570703E+03 -1.64890002E+03 -1.68570703E+03 -1.64890002E+03 + -1.68286804E+03 -1.64504797E+03 -1.68286804E+03 -1.64504797E+03 + -1.68003003E+03 -1.64119604E+03 -1.68003003E+03 -1.64119604E+03 + -1.67719202E+03 -1.63734399E+03 -1.67719202E+03 -1.63734399E+03 + -1.67435400E+03 -1.63349304E+03 -1.67435400E+03 -1.63349304E+03 + -1.67151501E+03 -1.62964099E+03 -1.67151501E+03 -1.62964099E+03 + -1.66678406E+03 -1.62527100E+03 -1.66678406E+03 -1.62527100E+03 + -1.66205396E+03 -1.62090100E+03 -1.66205396E+03 -1.62090100E+03 + -1.65732300E+03 -1.61653198E+03 -1.65732300E+03 -1.61653198E+03 + -1.65259204E+03 -1.61216199E+03 -1.65259204E+03 -1.61216199E+03 + -1.64786096E+03 -1.60779199E+03 -1.64786096E+03 -1.60779199E+03 + -1.70119800E+03 -1.65213904E+03 -1.70119800E+03 -1.65213904E+03 + -1.69896704E+03 -1.64968604E+03 -1.69896704E+03 -1.64968604E+03 + -1.69673499E+03 -1.64723303E+03 -1.69673499E+03 -1.64723303E+03 + -1.69450305E+03 -1.64478003E+03 -1.69450305E+03 -1.64478003E+03 + -1.69227100E+03 -1.64232703E+03 -1.69227100E+03 -1.64232703E+03 + -1.68926794E+03 -1.63814697E+03 -1.68926794E+03 -1.63814697E+03 + -1.68626404E+03 -1.63396802E+03 -1.68626404E+03 -1.63396802E+03 + -1.68326001E+03 -1.62978894E+03 -1.68326001E+03 -1.62978894E+03 + -1.68025598E+03 -1.62560901E+03 -1.68025598E+03 -1.62560901E+03 + -1.67725305E+03 -1.62143005E+03 -1.67725305E+03 -1.62143005E+03 + -1.67224500E+03 -1.61753406E+03 -1.67224500E+03 -1.61753406E+03 + -1.66723804E+03 -1.61363794E+03 -1.66723804E+03 -1.61363794E+03 + -1.66223096E+03 -1.60974304E+03 -1.66223096E+03 -1.60974304E+03 + -1.65722400E+03 -1.60584705E+03 -1.65722400E+03 -1.60584705E+03 + -1.65221594E+03 -1.60195105E+03 -1.65221594E+03 -1.60195105E+03 + -1.70540100E+03 -1.64860706E+03 -1.70540100E+03 -1.64860706E+03 + -1.70310999E+03 -1.64635498E+03 -1.70310999E+03 -1.64635498E+03 + -1.70081897E+03 -1.64410400E+03 -1.70081897E+03 -1.64410400E+03 + -1.69852795E+03 -1.64185303E+03 -1.69852795E+03 -1.64185303E+03 + -1.69623706E+03 -1.63960095E+03 -1.69623706E+03 -1.63960095E+03 + -1.69316895E+03 -1.63522498E+03 -1.69316895E+03 -1.63522498E+03 + -1.69010095E+03 -1.63084998E+03 -1.69010095E+03 -1.63084998E+03 + -1.68703296E+03 -1.62647400E+03 -1.68703296E+03 -1.62647400E+03 + -1.68396399E+03 -1.62209802E+03 -1.68396399E+03 -1.62209802E+03 + -1.68089600E+03 -1.61772302E+03 -1.68089600E+03 -1.61772302E+03 + -1.67577002E+03 -1.61390906E+03 -1.67577002E+03 -1.61390906E+03 + -1.67064294E+03 -1.61009595E+03 -1.67064294E+03 -1.61009595E+03 + -1.66551599E+03 -1.60628296E+03 -1.66551599E+03 -1.60628296E+03 + -1.66038904E+03 -1.60246997E+03 -1.66038904E+03 -1.60246997E+03 + -1.65526294E+03 -1.59865698E+03 -1.65526294E+03 -1.59865698E+03 + -1.70662402E+03 -1.64779895E+03 -1.70662402E+03 -1.64779895E+03 + -1.70436096E+03 -1.64597498E+03 -1.70436096E+03 -1.64597498E+03 + -1.70209705E+03 -1.64415100E+03 -1.70209705E+03 -1.64415100E+03 + -1.69983398E+03 -1.64232703E+03 -1.69983398E+03 -1.64232703E+03 + -1.69757104E+03 -1.64050305E+03 -1.69757104E+03 -1.64050305E+03 + -1.69452905E+03 -1.63581006E+03 -1.69452905E+03 -1.63581006E+03 + -1.69148804E+03 -1.63111597E+03 -1.69148804E+03 -1.63111597E+03 + -1.68844604E+03 -1.62642297E+03 -1.68844604E+03 -1.62642297E+03 + -1.68540503E+03 -1.62172900E+03 -1.68540503E+03 -1.62172900E+03 + -1.68236304E+03 -1.61703601E+03 -1.68236304E+03 -1.61703601E+03 + -1.67729004E+03 -1.61291797E+03 -1.67729004E+03 -1.61291797E+03 + -1.67221802E+03 -1.60880103E+03 -1.67221802E+03 -1.60880103E+03 + -1.66714502E+03 -1.60468298E+03 -1.66714502E+03 -1.60468298E+03 + -1.66207202E+03 -1.60056604E+03 -1.66207202E+03 -1.60056604E+03 + -1.65699902E+03 -1.59644800E+03 -1.65699902E+03 -1.59644800E+03 + -1.70645898E+03 -1.65006897E+03 -1.70645898E+03 -1.65006897E+03 + -1.70423999E+03 -1.64840601E+03 -1.70423999E+03 -1.64840601E+03 + -1.70202002E+03 -1.64674402E+03 -1.70202002E+03 -1.64674402E+03 + -1.69980103E+03 -1.64508105E+03 -1.69980103E+03 -1.64508105E+03 + -1.69758105E+03 -1.64341895E+03 -1.69758105E+03 -1.64341895E+03 + -1.69456702E+03 -1.63806104E+03 -1.69456702E+03 -1.63806104E+03 + -1.69155298E+03 -1.63270300E+03 -1.69155298E+03 -1.63270300E+03 + -1.68853894E+03 -1.62734399E+03 -1.68853894E+03 -1.62734399E+03 + -1.68552502E+03 -1.62198596E+03 -1.68552502E+03 -1.62198596E+03 + -1.68251001E+03 -1.61662805E+03 -1.68251001E+03 -1.61662805E+03 + -1.67754395E+03 -1.61198499E+03 -1.67754395E+03 -1.61198499E+03 + -1.67257703E+03 -1.60734302E+03 -1.67257703E+03 -1.60734302E+03 + -1.66761096E+03 -1.60269995E+03 -1.66761096E+03 -1.60269995E+03 + -1.66264404E+03 -1.59805701E+03 -1.66264404E+03 -1.59805701E+03 + -1.65767700E+03 -1.59341394E+03 -1.65767700E+03 -1.59341394E+03 + -1.70480505E+03 -1.65416895E+03 -1.70480505E+03 -1.70480505E+03 + -1.70262500E+03 -1.65246204E+03 -1.70262500E+03 -1.70262500E+03 + -1.70044397E+03 -1.65075500E+03 -1.70044397E+03 -1.70044397E+03 + -1.69826501E+03 -1.64904797E+03 -1.69826501E+03 -1.69826501E+03 + -1.69608398E+03 -1.64734094E+03 -1.69608398E+03 -1.69608398E+03 + -1.69307800E+03 -1.64145398E+03 -1.69307800E+03 -1.69307800E+03 + -1.69007104E+03 -1.63556702E+03 -1.69007104E+03 -1.69007104E+03 + -1.68706494E+03 -1.62968005E+03 -1.68706494E+03 -1.68706494E+03 + -1.68405798E+03 -1.62379297E+03 -1.68405798E+03 -1.68405798E+03 + -1.68105200E+03 -1.61790601E+03 -1.68105200E+03 -1.68105200E+03 + -1.67629199E+03 -1.61266199E+03 -1.67629199E+03 -1.67629199E+03 + -1.67153296E+03 -1.60741797E+03 -1.67153296E+03 -1.67153296E+03 + -1.66677295E+03 -1.60217395E+03 -1.66677295E+03 -1.66677295E+03 + -1.66201404E+03 -1.59693005E+03 -1.66201404E+03 -1.66201404E+03 + -1.65725403E+03 -1.59168604E+03 -1.65725403E+03 -1.65725403E+03 + -1.70417798E+03 -1.70208203E+03 -1.69998596E+03 -1.69789001E+03 + -1.69579297E+03 -1.69280896E+03 -1.68982397E+03 -1.68683899E+03 + -1.68385400E+03 -1.68087000E+03 -1.67626099E+03 -1.67165100E+03 + -1.66704199E+03 -1.66243298E+03 -1.65782397E+03 -1.70484900E+03 + -1.70280798E+03 -1.70076697E+03 -1.69872595E+03 -1.69668506E+03 + -1.69373096E+03 -1.69077698E+03 -1.68782300E+03 -1.68486902E+03 + -1.68191504E+03 -1.67742004E+03 -1.67292505E+03 -1.66843005E+03 + -1.66393506E+03 -1.65943994E+03 -1.70425000E+03 -1.70215906E+03 + -1.70006799E+03 -1.69797705E+03 -1.69588599E+03 -1.69286804E+03 + -1.68985095E+03 -1.68683301E+03 -1.68381604E+03 -1.68079797E+03 + -1.67626904E+03 -1.67173999E+03 -1.66721106E+03 -1.66268103E+03 + -1.65815198E+03 -1.70408606E+03 -1.70200696E+03 -1.69992896E+03 + -1.69785095E+03 -1.69577295E+03 -1.69279797E+03 -1.68982300E+03 + -1.68684705E+03 -1.68387195E+03 -1.68089697E+03 -1.67642297E+03 + -1.67194800E+03 -1.66747400E+03 -1.66300000E+03 -1.65852600E+03 + -1.70031201E+03 -1.70031201E+03 -1.71132104E+03 -1.70031201E+03 + -1.69812903E+03 -1.69812903E+03 -1.70902600E+03 -1.69812903E+03 + -1.69594495E+03 -1.69594495E+03 -1.70673096E+03 -1.69594495E+03 + -1.69376196E+03 -1.69376196E+03 -1.70443604E+03 -1.69376196E+03 + -1.69157898E+03 -1.69157898E+03 -1.70214099E+03 -1.69157898E+03 + -1.68847705E+03 -1.68847705E+03 -1.69922302E+03 -1.68847705E+03 + -1.68537598E+03 -1.68537598E+03 -1.69630505E+03 -1.68537598E+03 + -1.68227502E+03 -1.68227502E+03 -1.69338696E+03 -1.68227502E+03 + -1.67917297E+03 -1.67917297E+03 -1.69046899E+03 -1.67917297E+03 + -1.67607202E+03 -1.67607202E+03 -1.68755103E+03 -1.67607202E+03 + -1.67176404E+03 -1.67176404E+03 -1.68243604E+03 -1.67176404E+03 + -1.66745703E+03 -1.66745703E+03 -1.67732104E+03 -1.66745703E+03 + -1.66314905E+03 -1.66314905E+03 -1.67220703E+03 -1.66314905E+03 + -1.65884094E+03 -1.65884094E+03 -1.66709204E+03 -1.65884094E+03 + -1.65453406E+03 -1.65453406E+03 -1.66197705E+03 -1.65453406E+03 + -1.71355005E+03 -1.69716699E+03 -1.71355005E+03 -1.69716699E+03 + -1.71141699E+03 -1.69496594E+03 -1.71141699E+03 -1.69496594E+03 + -1.70928503E+03 -1.69276404E+03 -1.70928503E+03 -1.69276404E+03 + -1.70715295E+03 -1.69056299E+03 -1.70715295E+03 -1.69056299E+03 + -1.70502100E+03 -1.68836096E+03 -1.70502100E+03 -1.68836096E+03 + -1.70199500E+03 -1.68525598E+03 -1.70199500E+03 -1.68525598E+03 + -1.69896997E+03 -1.68215002E+03 -1.69896997E+03 -1.68215002E+03 + -1.69594495E+03 -1.67904504E+03 -1.69594495E+03 -1.67904504E+03 + -1.69291895E+03 -1.67593994E+03 -1.69291895E+03 -1.67593994E+03 + -1.68989404E+03 -1.67283398E+03 -1.68989404E+03 -1.67283398E+03 + -1.68507202E+03 -1.66851099E+03 -1.68507202E+03 -1.66851099E+03 + -1.68025000E+03 -1.66418701E+03 -1.68025000E+03 -1.66418701E+03 + -1.67542798E+03 -1.65986304E+03 -1.67542798E+03 -1.65986304E+03 + -1.67060596E+03 -1.65553894E+03 -1.67060596E+03 -1.65553894E+03 + -1.66578503E+03 -1.65121594E+03 -1.66578503E+03 -1.65121594E+03 + -1.71826099E+03 -1.69452795E+03 -1.71826099E+03 -1.71826099E+03 + -1.71610400E+03 -1.69243103E+03 -1.71610400E+03 -1.71610400E+03 + -1.71394702E+03 -1.69033301E+03 -1.71394702E+03 -1.71394702E+03 + -1.71179004E+03 -1.68823499E+03 -1.71179004E+03 -1.71179004E+03 + -1.70963306E+03 -1.68613794E+03 -1.70963306E+03 -1.70963306E+03 + -1.70654797E+03 -1.68321204E+03 -1.70654797E+03 -1.70654797E+03 + -1.70346301E+03 -1.68028699E+03 -1.70346301E+03 -1.70346301E+03 + -1.70037805E+03 -1.67736206E+03 -1.70037805E+03 -1.70037805E+03 + -1.69729297E+03 -1.67443701E+03 -1.69729297E+03 -1.69729297E+03 + -1.69420801E+03 -1.67151196E+03 -1.69420801E+03 -1.69420801E+03 + -1.68958606E+03 -1.66702002E+03 -1.68958606E+03 -1.68958606E+03 + -1.68496301E+03 -1.66252905E+03 -1.68496301E+03 -1.68496301E+03 + -1.68033997E+03 -1.65803796E+03 -1.68033997E+03 -1.68033997E+03 + -1.67571704E+03 -1.65354602E+03 -1.67571704E+03 -1.67571704E+03 + -1.67109399E+03 -1.64905505E+03 -1.67109399E+03 -1.67109399E+03 + -1.68666895E+03 -1.68666895E+03 -1.68666895E+03 -1.68666895E+03 + -1.68461401E+03 -1.68461401E+03 -1.68461401E+03 -1.68461401E+03 + -1.68256006E+03 -1.68256006E+03 -1.68256006E+03 -1.68256006E+03 + -1.68050598E+03 -1.68050598E+03 -1.68050598E+03 -1.68050598E+03 + -1.67845203E+03 -1.67845203E+03 -1.67845203E+03 -1.67845203E+03 + -1.67544702E+03 -1.67544702E+03 -1.67544702E+03 -1.67544702E+03 + -1.67244202E+03 -1.67244202E+03 -1.67244202E+03 -1.67244202E+03 + -1.66943799E+03 -1.66943799E+03 -1.66943799E+03 -1.66943799E+03 + -1.66643298E+03 -1.66643298E+03 -1.66643298E+03 -1.66643298E+03 + -1.66342798E+03 -1.66342798E+03 -1.66342798E+03 -1.66342798E+03 + -1.65893604E+03 -1.65893604E+03 -1.65893604E+03 -1.65893604E+03 + -1.65444397E+03 -1.65444397E+03 -1.65444397E+03 -1.65444397E+03 + -1.64995203E+03 -1.64995203E+03 -1.64995203E+03 -1.64995203E+03 + -1.64545996E+03 -1.64545996E+03 -1.64545996E+03 -1.64545996E+03 + -1.64096802E+03 -1.64096802E+03 -1.64096802E+03 -1.64096802E+03 + -1.68226599E+03 -1.68023901E+03 -1.67821106E+03 -1.67618396E+03 + -1.67415601E+03 -1.67116394E+03 -1.66817102E+03 -1.66517896E+03 + -1.66218604E+03 -1.65919397E+03 -1.65464404E+03 -1.65009497E+03 + -1.64554504E+03 -1.64099500E+03 -1.63644604E+03 -1.67767700E+03 + -1.67560596E+03 -1.67353503E+03 -1.67146399E+03 -1.66939294E+03 + -1.66638599E+03 -1.66337805E+03 -1.66037000E+03 -1.65736304E+03 + -1.65435498E+03 -1.64980896E+03 -1.64526294E+03 -1.64071704E+03 + -1.63617200E+03 -1.63162598E+03 -1.67053101E+03 -1.66837598E+03 + -1.66622095E+03 -1.66406494E+03 -1.66191003E+03 -1.65887305E+03 + -1.65583606E+03 -1.65279895E+03 -1.64976196E+03 -1.64672498E+03 + -1.64215601E+03 -1.63758704E+03 -1.63301904E+03 -1.62844995E+03 + -1.62388098E+03 -1.65909399E+03 -1.65704102E+03 -1.65498804E+03 + -1.65293506E+03 -1.65088196E+03 -1.64785095E+03 -1.64481995E+03 + -1.64178894E+03 -1.63875806E+03 -1.63572705E+03 -1.63114404E+03 + -1.62656104E+03 -1.62197803E+03 -1.61739600E+03 -1.61281299E+03 + -1.64957495E+03 -1.64752905E+03 -1.64548401E+03 -1.64343799E+03 + -1.64139294E+03 -1.63837000E+03 -1.63534705E+03 -1.63232397E+03 + -1.62930103E+03 -1.62627795E+03 -1.62171899E+03 -1.61716101E+03 + -1.61260205E+03 -1.60804297E+03 -1.60348499E+03 -1.64638306E+03 + -1.64415405E+03 -1.64192505E+03 -1.63969604E+03 -1.63746594E+03 + -1.63435205E+03 -1.63123804E+03 -1.62812402E+03 -1.62501001E+03 + -1.62189600E+03 -1.61725195E+03 -1.61260901E+03 -1.60796497E+03 + -1.60332104E+03 -1.59867700E+03 -1.64227698E+03 -1.64005396E+03 + -1.63782996E+03 -1.63560706E+03 -1.63338403E+03 -1.63019604E+03 + -1.62700903E+03 -1.62382104E+03 -1.62063306E+03 -1.61744604E+03 + -1.61274805E+03 -1.60805005E+03 -1.60335205E+03 -1.59865503E+03 + -1.59395703E+03 -1.63517505E+03 -1.63517505E+03 -1.68743604E+03 + -1.63517505E+03 -1.63287903E+03 -1.63287903E+03 -1.68596704E+03 + -1.63287903E+03 -1.63058301E+03 -1.63058301E+03 -1.68449902E+03 + -1.63058301E+03 -1.62828699E+03 -1.62828699E+03 -1.68303003E+03 + -1.62828699E+03 -1.62599097E+03 -1.62599097E+03 -1.68156104E+03 + -1.62599097E+03 -1.62270203E+03 -1.62270203E+03 -1.67837695E+03 + -1.62270203E+03 -1.61941199E+03 -1.61941199E+03 -1.67519299E+03 + -1.61941199E+03 -1.61612305E+03 -1.61612305E+03 -1.67200903E+03 + -1.61612305E+03 -1.61283398E+03 -1.61283398E+03 -1.66882397E+03 + -1.61283398E+03 -1.60954504E+03 -1.60954504E+03 -1.66564001E+03 + -1.60954504E+03 -1.60528601E+03 -1.60528601E+03 -1.65968396E+03 + -1.60528601E+03 -1.60102698E+03 -1.60102698E+03 -1.65372803E+03 + -1.60102698E+03 -1.59676904E+03 -1.59676904E+03 -1.64777197E+03 + -1.59676904E+03 -1.59251001E+03 -1.59251001E+03 -1.64181604E+03 + -1.59251001E+03 -1.58825195E+03 -1.58825195E+03 -1.63585999E+03 + -1.58825195E+03 -1.67511499E+03 -1.62438904E+03 -1.67511499E+03 + -1.62438904E+03 -1.67344299E+03 -1.62218701E+03 -1.67344299E+03 + -1.62218701E+03 -1.67177100E+03 -1.61998499E+03 -1.67177100E+03 + -1.61998499E+03 -1.67009900E+03 -1.61778296E+03 -1.67009900E+03 + -1.61778296E+03 -1.66842603E+03 -1.61558105E+03 -1.66842603E+03 + -1.61558105E+03 -1.66548999E+03 -1.61236096E+03 -1.66548999E+03 + -1.61236096E+03 -1.66255298E+03 -1.60914099E+03 -1.66255298E+03 + -1.60914099E+03 -1.65961597E+03 -1.60592200E+03 -1.65961597E+03 + -1.60592200E+03 -1.65668005E+03 -1.60270203E+03 -1.65668005E+03 + -1.60270203E+03 -1.65374304E+03 -1.59948206E+03 -1.65374304E+03 + -1.59948206E+03 -1.64787805E+03 -1.59494495E+03 -1.64787805E+03 + -1.59494495E+03 -1.64201404E+03 -1.59040698E+03 -1.64201404E+03 + -1.59040698E+03 -1.63614905E+03 -1.58587000E+03 -1.63614905E+03 + -1.58587000E+03 -1.63028406E+03 -1.58133203E+03 -1.63028406E+03 + -1.58133203E+03 -1.62442004E+03 -1.57679504E+03 -1.62442004E+03 + -1.57679504E+03 -1.66397498E+03 -1.61404700E+03 -1.66397498E+03 + -1.66397498E+03 -1.66197803E+03 -1.61190405E+03 -1.66197803E+03 + -1.66197803E+03 -1.65998096E+03 -1.60976099E+03 -1.65998096E+03 + -1.65998096E+03 -1.65798401E+03 -1.60761804E+03 -1.65798401E+03 + -1.65798401E+03 -1.65598706E+03 -1.60547498E+03 -1.65598706E+03 + -1.65598706E+03 -1.65302100E+03 -1.60230298E+03 -1.65302100E+03 + -1.65302100E+03 -1.65005505E+03 -1.59913098E+03 -1.65005505E+03 + -1.65005505E+03 -1.64708899E+03 -1.59595898E+03 -1.64708899E+03 + -1.64708899E+03 -1.64412305E+03 -1.59278699E+03 -1.64412305E+03 + -1.64412305E+03 -1.64115698E+03 -1.58961499E+03 -1.64115698E+03 + -1.64115698E+03 -1.63596106E+03 -1.58491394E+03 -1.63596106E+03 + -1.63596106E+03 -1.63076404E+03 -1.58021204E+03 -1.63076404E+03 + -1.63076404E+03 -1.62556799E+03 -1.57551001E+03 -1.62556799E+03 + -1.62556799E+03 -1.62037097E+03 -1.57080896E+03 -1.62037097E+03 + -1.62037097E+03 -1.61517505E+03 -1.56610706E+03 -1.61517505E+03 + -1.61517505E+03 -1.65595105E+03 -1.65340295E+03 -1.65085498E+03 + -1.64830603E+03 -1.64575806E+03 -1.64250903E+03 -1.63926001E+03 + -1.63601099E+03 -1.63276294E+03 -1.62951404E+03 -1.62511499E+03 + -1.62071497E+03 -1.61631604E+03 -1.61191699E+03 -1.60751697E+03 + -1.65106006E+03 -1.64799500E+03 -1.64493103E+03 -1.64186597E+03 + -1.63880103E+03 -1.63534302E+03 -1.63188501E+03 -1.62842603E+03 + -1.62496802E+03 -1.62150903E+03 -1.61761804E+03 -1.61372595E+03 + -1.60983398E+03 -1.60594299E+03 -1.60205103E+03 -1.64833301E+03 + -1.64567102E+03 -1.64301001E+03 -1.64034802E+03 -1.63768701E+03 + -1.63405103E+03 -1.63041504E+03 -1.62678003E+03 -1.62314404E+03 + -1.61950806E+03 -1.61554504E+03 -1.61158203E+03 -1.60761902E+03 + -1.60365503E+03 -1.59969202E+03 -1.64830701E+03 -1.64635095E+03 + -1.64439502E+03 -1.64243896E+03 -1.64048401E+03 -1.63644800E+03 + -1.63241296E+03 -1.62837805E+03 -1.62434204E+03 -1.62030701E+03 + -1.61585706E+03 -1.61140601E+03 -1.60695605E+03 -1.60250598E+03 + -1.59805603E+03 -1.65270105E+03 -1.65084998E+03 -1.64899805E+03 + -1.64714600E+03 -1.64529395E+03 -1.64025403E+03 -1.63521399E+03 + -1.63017297E+03 -1.62513306E+03 -1.62009302E+03 -1.61497095E+03 + -1.60984900E+03 -1.60472705E+03 -1.59960498E+03 -1.59448206E+03 + -1.65977698E+03 -1.65977698E+03 -1.70428699E+03 -1.65977698E+03 + -1.65779004E+03 -1.65779004E+03 -1.70206604E+03 -1.65779004E+03 + -1.65580200E+03 -1.65580200E+03 -1.69984497E+03 -1.65580200E+03 + -1.65381494E+03 -1.65381494E+03 -1.69762402E+03 -1.65381494E+03 + -1.65182800E+03 -1.65182800E+03 -1.69540198E+03 -1.65182800E+03 + -1.64603296E+03 -1.64603296E+03 -1.69247595E+03 -1.64603296E+03 + -1.64023804E+03 -1.64023804E+03 -1.68955005E+03 -1.64023804E+03 + -1.63444397E+03 -1.63444397E+03 -1.68662402E+03 -1.63444397E+03 + -1.62864905E+03 -1.62864905E+03 -1.68369702E+03 -1.62864905E+03 + -1.62285400E+03 -1.62285400E+03 -1.68077100E+03 -1.62285400E+03 + -1.61701404E+03 -1.61701404E+03 -1.67583398E+03 -1.61701404E+03 + -1.61117395E+03 -1.61117395E+03 -1.67089697E+03 -1.61117395E+03 + -1.60533398E+03 -1.60533398E+03 -1.66595996E+03 -1.60533398E+03 + -1.59949402E+03 -1.59949402E+03 -1.66102295E+03 -1.59949402E+03 + -1.59365405E+03 -1.59365405E+03 -1.65608704E+03 -1.59365405E+03 + -1.70585303E+03 -1.66499097E+03 -1.70585303E+03 -1.70585303E+03 + -1.70364905E+03 -1.66262305E+03 -1.70364905E+03 -1.70364905E+03 + -1.70144397E+03 -1.66025500E+03 -1.70144397E+03 -1.70144397E+03 + -1.69923999E+03 -1.65788794E+03 -1.69923999E+03 -1.69923999E+03 + -1.69703601E+03 -1.65552002E+03 -1.69703601E+03 -1.69703601E+03 + -1.69396497E+03 -1.64966602E+03 -1.69396497E+03 -1.69396497E+03 + -1.69089294E+03 -1.64381299E+03 -1.69089294E+03 -1.69089294E+03 + -1.68782202E+03 -1.63795898E+03 -1.68782202E+03 -1.68782202E+03 + -1.68475098E+03 -1.63210498E+03 -1.68475098E+03 -1.68475098E+03 + -1.68168005E+03 -1.62625195E+03 -1.68168005E+03 -1.68168005E+03 + -1.67682898E+03 -1.62009998E+03 -1.67682898E+03 -1.67682898E+03 + -1.67197803E+03 -1.61394897E+03 -1.67197803E+03 -1.67197803E+03 + -1.66712805E+03 -1.60779797E+03 -1.66712805E+03 -1.66712805E+03 + -1.66227698E+03 -1.60164697E+03 -1.66227698E+03 -1.66227698E+03 + -1.65742700E+03 -1.59549597E+03 -1.65742700E+03 -1.65742700E+03 + -1.70612097E+03 -1.70400696E+03 -1.70189294E+03 -1.69977905E+03 + -1.69766504E+03 -1.69451099E+03 -1.69135706E+03 -1.68820203E+03 + -1.68504797E+03 -1.68189294E+03 -1.67722302E+03 -1.67255298E+03 + -1.66788306E+03 -1.66321301E+03 -1.65854297E+03 -1.70558899E+03 + -1.70339905E+03 -1.70120996E+03 -1.69902002E+03 -1.69683105E+03 + -1.69368396E+03 -1.69053699E+03 -1.68738904E+03 -1.68424194E+03 + -1.68109497E+03 -1.67648596E+03 -1.67187695E+03 -1.66726794E+03 + -1.66265906E+03 -1.65804895E+03 -1.70522095E+03 -1.70310999E+03 + -1.70099902E+03 -1.69888794E+03 -1.69677600E+03 -1.69371301E+03 + -1.69065002E+03 -1.68758704E+03 -1.68452405E+03 -1.68146106E+03 + -1.67684399E+03 -1.67222803E+03 -1.66761096E+03 -1.66299500E+03 + -1.65837805E+03 -1.70250195E+03 -1.70038000E+03 -1.69825806E+03 + -1.69613599E+03 -1.69401501E+03 -1.69098804E+03 -1.68796204E+03 + -1.68493506E+03 -1.68190906E+03 -1.67888306E+03 -1.67438306E+03 + -1.66988403E+03 -1.66538501E+03 -1.66088599E+03 -1.65638599E+03 + -1.69839294E+03 -1.69620496E+03 -1.69401794E+03 -1.69182996E+03 + -1.68964197E+03 -1.68653699E+03 -1.68343201E+03 -1.68032703E+03 + -1.67722205E+03 -1.67411694E+03 -1.66953296E+03 -1.66494995E+03 + -1.66036597E+03 -1.65578296E+03 -1.65119897E+03 -1.69352295E+03 + -1.69352295E+03 -1.69352295E+03 -1.69352295E+03 -1.69137195E+03 + -1.69137195E+03 -1.69137195E+03 -1.69137195E+03 -1.68922205E+03 + -1.68922205E+03 -1.68922205E+03 -1.68922205E+03 -1.68707104E+03 + -1.68707104E+03 -1.68707104E+03 -1.68707104E+03 -1.68492004E+03 + -1.68492004E+03 -1.68492004E+03 -1.68492004E+03 -1.68187195E+03 + -1.68187195E+03 -1.68187195E+03 -1.68187195E+03 -1.67882397E+03 + -1.67882397E+03 -1.67882397E+03 -1.67882397E+03 -1.67577698E+03 + -1.67577698E+03 -1.67577698E+03 -1.67577698E+03 -1.67272900E+03 + -1.67272900E+03 -1.67272900E+03 -1.67272900E+03 -1.66968103E+03 + -1.66968103E+03 -1.66968103E+03 -1.66968103E+03 -1.66511597E+03 + -1.66511597E+03 -1.66511597E+03 -1.66511597E+03 -1.66055103E+03 + -1.66055103E+03 -1.66055103E+03 -1.66055103E+03 -1.65598596E+03 + -1.65598596E+03 -1.65598596E+03 -1.65598596E+03 -1.65142102E+03 + -1.65142102E+03 -1.65142102E+03 -1.65142102E+03 -1.64685596E+03 + -1.64685596E+03 -1.64685596E+03 -1.64685596E+03 -1.69411694E+03 + -1.69411694E+03 -1.69411694E+03 -1.69411694E+03 -1.69202405E+03 + -1.69202405E+03 -1.69202405E+03 -1.69202405E+03 -1.68993005E+03 + -1.68993005E+03 -1.68993005E+03 -1.68993005E+03 -1.68783704E+03 + -1.68783704E+03 -1.68783704E+03 -1.68783704E+03 -1.68574402E+03 + -1.68574402E+03 -1.68574402E+03 -1.68574402E+03 -1.68268396E+03 + -1.68268396E+03 -1.68268396E+03 -1.68268396E+03 -1.67962500E+03 + -1.67962500E+03 -1.67962500E+03 -1.67962500E+03 -1.67656494E+03 + -1.67656494E+03 -1.67656494E+03 -1.67656494E+03 -1.67350598E+03 + -1.67350598E+03 -1.67350598E+03 -1.67350598E+03 -1.67044604E+03 + -1.67044604E+03 -1.67044604E+03 -1.67044604E+03 -1.66583997E+03 + -1.66583997E+03 -1.66583997E+03 -1.66583997E+03 -1.66123401E+03 + -1.66123401E+03 -1.66123401E+03 -1.66123401E+03 -1.65662805E+03 + -1.65662805E+03 -1.65662805E+03 -1.65662805E+03 -1.65202197E+03 + -1.65202197E+03 -1.65202197E+03 -1.65202197E+03 -1.64741602E+03 + -1.64741602E+03 -1.64741602E+03 -1.64741602E+03 -1.69012000E+03 + -1.68802905E+03 -1.68593799E+03 -1.68384705E+03 -1.68175598E+03 + -1.67869604E+03 -1.67563599E+03 -1.67257605E+03 -1.66951697E+03 + -1.66645703E+03 -1.66184399E+03 -1.65723206E+03 -1.65262000E+03 + -1.64800806E+03 -1.64339502E+03 -1.68223303E+03 -1.68014697E+03 + -1.67806201E+03 -1.67597595E+03 -1.67389001E+03 -1.67084900E+03 + -1.66780896E+03 -1.66476794E+03 -1.66172705E+03 -1.65868604E+03 + -1.65411304E+03 -1.64953894E+03 -1.64496594E+03 -1.64039197E+03 + -1.63581799E+03 -1.67083203E+03 -1.66879199E+03 -1.66675098E+03 + -1.66470996E+03 -1.66267004E+03 -1.65967700E+03 -1.65668506E+03 + -1.65369202E+03 -1.65069995E+03 -1.64770703E+03 -1.64317102E+03 + -1.63863403E+03 -1.63409802E+03 -1.62956201E+03 -1.62502502E+03 + -1.65566797E+03 -1.65361206E+03 -1.65155603E+03 -1.64950098E+03 + -1.64744495E+03 -1.64445801E+03 -1.64147205E+03 -1.63848499E+03 + -1.63549805E+03 -1.63251196E+03 -1.62798596E+03 -1.62346106E+03 + -1.61893604E+03 -1.61441003E+03 -1.60988501E+03 -1.64669104E+03 + -1.64465100E+03 -1.64260999E+03 -1.64056995E+03 -1.63853003E+03 + -1.63557397E+03 -1.63261804E+03 -1.62966199E+03 -1.62670703E+03 + -1.62375098E+03 -1.61921594E+03 -1.61468103E+03 -1.61014697E+03 + -1.60561206E+03 -1.60107703E+03 -1.64069202E+03 -1.63868201E+03 + -1.63667200E+03 -1.63466296E+03 -1.63265295E+03 -1.62972900E+03 + -1.62680603E+03 -1.62388306E+03 -1.62095996E+03 -1.61803601E+03 + -1.61358203E+03 -1.60912695E+03 -1.60467200E+03 -1.60021704E+03 + -1.59576196E+03 -1.63496106E+03 -1.63296106E+03 -1.63095996E+03 + -1.62895996E+03 -1.62695898E+03 -1.62405896E+03 -1.62115906E+03 + -1.61825903E+03 -1.61535803E+03 -1.61245801E+03 -1.60801904E+03 + -1.60357898E+03 -1.59914001E+03 -1.59469995E+03 -1.59026099E+03 + -1.63031702E+03 -1.62823401E+03 -1.62615100E+03 -1.62406897E+03 + -1.62198596E+03 -1.61892700E+03 -1.61586804E+03 -1.61280896E+03 + -1.60975098E+03 -1.60669202E+03 -1.60203503E+03 -1.59737805E+03 + -1.59272095E+03 -1.58806396E+03 -1.58340698E+03 -1.62295703E+03 + -1.62084595E+03 -1.61873596E+03 -1.61662500E+03 -1.61451501E+03 + -1.61142603E+03 -1.60833801E+03 -1.60525000E+03 -1.60216199E+03 + -1.59907397E+03 -1.59433105E+03 -1.58958899E+03 -1.58484705E+03 + -1.58010400E+03 -1.57536206E+03 -1.61450000E+03 -1.61450000E+03 + -1.66470496E+03 -1.61450000E+03 -1.61232104E+03 -1.61232104E+03 + -1.66272705E+03 -1.61232104E+03 -1.61014099E+03 -1.61014099E+03 + -1.66074902E+03 -1.61014099E+03 -1.60796204E+03 -1.60796204E+03 + -1.65877100E+03 -1.60796204E+03 -1.60578296E+03 -1.60578296E+03 + -1.65679297E+03 -1.60578296E+03 -1.60259705E+03 -1.60259705E+03 + -1.65432605E+03 -1.60259705E+03 -1.59941003E+03 -1.59941003E+03 + -1.65185901E+03 -1.59941003E+03 -1.59622400E+03 -1.59622400E+03 + -1.64939197E+03 -1.59622400E+03 -1.59303699E+03 -1.59303699E+03 + -1.64692505E+03 -1.59303699E+03 -1.58985095E+03 -1.58985095E+03 + -1.64445801E+03 -1.58985095E+03 -1.58498096E+03 -1.58498096E+03 + -1.63883496E+03 -1.58498096E+03 -1.58010999E+03 -1.58010999E+03 + -1.63321204E+03 -1.58010999E+03 -1.57523999E+03 -1.57523999E+03 + -1.62758899E+03 -1.57523999E+03 -1.57037000E+03 -1.57037000E+03 + -1.62196594E+03 -1.57037000E+03 -1.56550000E+03 -1.56550000E+03 + -1.61634302E+03 -1.56550000E+03 -1.65465698E+03 -1.60494897E+03 + -1.65465698E+03 -1.60494897E+03 -1.65201099E+03 -1.60282300E+03 + -1.65201099E+03 -1.60282300E+03 -1.64936499E+03 -1.60069702E+03 + -1.64936499E+03 -1.60069702E+03 -1.64671899E+03 -1.59857202E+03 + -1.64671899E+03 -1.59857202E+03 -1.64407300E+03 -1.59644495E+03 + -1.64407300E+03 -1.59644495E+03 -1.64158301E+03 -1.59332202E+03 + -1.64158301E+03 -1.59332202E+03 -1.63909204E+03 -1.59019897E+03 + -1.63909204E+03 -1.59019897E+03 -1.63660205E+03 -1.58707495E+03 + -1.63660205E+03 -1.58707495E+03 -1.63411096E+03 -1.58395203E+03 + -1.63411096E+03 -1.58395203E+03 -1.63162000E+03 -1.58082800E+03 + -1.63162000E+03 -1.58082800E+03 -1.62702197E+03 -1.57606299E+03 + -1.62702197E+03 -1.57606299E+03 -1.62242395E+03 -1.57129797E+03 + -1.62242395E+03 -1.57129797E+03 -1.61782495E+03 -1.56653296E+03 + -1.61782495E+03 -1.56653296E+03 -1.61322705E+03 -1.56176697E+03 + -1.61322705E+03 -1.56176697E+03 -1.60862805E+03 -1.55700195E+03 + -1.60862805E+03 -1.55700195E+03 -1.64856104E+03 -1.59897095E+03 + -1.64856104E+03 -1.64856104E+03 -1.64541699E+03 -1.59687402E+03 + -1.64541699E+03 -1.64541699E+03 -1.64227197E+03 -1.59477698E+03 + -1.64227197E+03 -1.64227197E+03 -1.63912805E+03 -1.59268103E+03 + -1.63912805E+03 -1.63912805E+03 -1.63598303E+03 -1.59058398E+03 + -1.63598303E+03 -1.63598303E+03 -1.63346301E+03 -1.58750098E+03 + -1.63346301E+03 -1.63346301E+03 -1.63094299E+03 -1.58441797E+03 + -1.63094299E+03 -1.63094299E+03 -1.62842297E+03 -1.58133496E+03 + -1.62842297E+03 -1.62842297E+03 -1.62590405E+03 -1.57825195E+03 + -1.62590405E+03 -1.62590405E+03 -1.62338403E+03 -1.57516895E+03 + -1.62338403E+03 -1.62338403E+03 -1.61934204E+03 -1.57045300E+03 + -1.61934204E+03 -1.61934204E+03 -1.61530103E+03 -1.56573706E+03 + -1.61530103E+03 -1.61530103E+03 -1.61125903E+03 -1.56102100E+03 + -1.61125903E+03 -1.61125903E+03 -1.60721802E+03 -1.55630505E+03 + -1.60721802E+03 -1.60721802E+03 -1.60317603E+03 -1.55158801E+03 + -1.60317603E+03 -1.60317603E+03 -1.64530798E+03 -1.64270801E+03 + -1.64010803E+03 -1.63750806E+03 -1.63490698E+03 -1.63233997E+03 + -1.62977197E+03 -1.62720496E+03 -1.62463696E+03 -1.62206995E+03 + -1.61783997E+03 -1.61361096E+03 -1.60938196E+03 -1.60515295E+03 + -1.60092395E+03 -1.64774695E+03 -1.64557300E+03 -1.64339795E+03 + -1.64122400E+03 -1.63905005E+03 -1.63596997E+03 -1.63289001E+03 + -1.62981104E+03 -1.62673096E+03 -1.62365100E+03 -1.61873206E+03 + -1.61381299E+03 -1.60889294E+03 -1.60397400E+03 -1.59905505E+03 + -1.65596704E+03 -1.65382397E+03 -1.65168005E+03 -1.64953699E+03 + -1.64739404E+03 -1.64278796E+03 -1.63818201E+03 -1.63357703E+03 + -1.62897095E+03 -1.62436597E+03 -1.61868201E+03 -1.61299695E+03 + -1.60731299E+03 -1.60162903E+03 -1.59594495E+03 -1.66830798E+03 + -1.66593799E+03 -1.66356702E+03 -1.66119604E+03 -1.65882495E+03 + -1.65326697E+03 -1.64770898E+03 -1.64215100E+03 -1.63659302E+03 + -1.63103503E+03 -1.62431299E+03 -1.61759094E+03 -1.61086902E+03 + -1.60414697E+03 -1.59742505E+03 -1.67407495E+03 -1.67407495E+03 + -1.70559399E+03 -1.67407495E+03 -1.67093506E+03 -1.67093506E+03 + -1.70320398E+03 -1.67093506E+03 -1.66779504E+03 -1.66779504E+03 + -1.70081494E+03 -1.66779504E+03 -1.66465503E+03 -1.66465503E+03 + -1.69842505E+03 -1.66465503E+03 -1.66151501E+03 -1.66151501E+03 + -1.69603503E+03 -1.66151501E+03 -1.65589099E+03 -1.65589099E+03 + -1.69302197E+03 -1.65589099E+03 -1.65026697E+03 -1.65026697E+03 + -1.69000903E+03 -1.65026697E+03 -1.64464404E+03 -1.64464404E+03 + -1.68699695E+03 -1.64464404E+03 -1.63902002E+03 -1.63902002E+03 + -1.68398401E+03 -1.63902002E+03 -1.63339697E+03 -1.63339697E+03 + -1.68097095E+03 -1.63339697E+03 -1.62679102E+03 -1.62679102E+03 + -1.67604102E+03 -1.62679102E+03 -1.62018506E+03 -1.62018506E+03 + -1.67111096E+03 -1.62018506E+03 -1.61357996E+03 -1.61357996E+03 + -1.66618103E+03 -1.61357996E+03 -1.60697400E+03 -1.60697400E+03 + -1.66125098E+03 -1.60697400E+03 -1.60036902E+03 -1.60036902E+03 + -1.65632104E+03 -1.60036902E+03 -1.70590601E+03 -1.67122705E+03 + -1.70590601E+03 -1.70590601E+03 -1.70363696E+03 -1.66835596E+03 + -1.70363696E+03 -1.70363696E+03 -1.70136804E+03 -1.66548499E+03 + -1.70136804E+03 -1.70136804E+03 -1.69909900E+03 -1.66261499E+03 + -1.69909900E+03 -1.69909900E+03 -1.69682996E+03 -1.65974402E+03 + -1.69682996E+03 -1.69682996E+03 -1.69372998E+03 -1.65411499E+03 + -1.69372998E+03 -1.69372998E+03 -1.69063098E+03 -1.64848596E+03 + -1.69063098E+03 -1.69063098E+03 -1.68753198E+03 -1.64285706E+03 + -1.68753198E+03 -1.68753198E+03 -1.68443201E+03 -1.63722803E+03 + -1.68443201E+03 -1.68443201E+03 -1.68133301E+03 -1.63159900E+03 + -1.68133301E+03 -1.68133301E+03 -1.67659204E+03 -1.62570898E+03 + -1.67659204E+03 -1.67659204E+03 -1.67184998E+03 -1.61981995E+03 + -1.67184998E+03 -1.67184998E+03 -1.66710803E+03 -1.61393005E+03 + -1.66710803E+03 -1.66710803E+03 -1.66236694E+03 -1.60804102E+03 + -1.66236694E+03 -1.66236694E+03 -1.65762500E+03 -1.60215100E+03 + -1.65762500E+03 -1.65762500E+03 -1.70616199E+03 -1.70396399E+03 + -1.70176599E+03 -1.69956799E+03 -1.69737000E+03 -1.69424304E+03 + -1.69111499E+03 -1.68798706E+03 -1.68485901E+03 -1.68173096E+03 + -1.67707996E+03 -1.67242798E+03 -1.66777698E+03 -1.66312500E+03 + -1.65847400E+03 -1.70542200E+03 -1.70327600E+03 -1.70113000E+03 + -1.69898499E+03 -1.69683899E+03 -1.69376196E+03 -1.69068506E+03 + -1.68760803E+03 -1.68453101E+03 -1.68145300E+03 -1.67689795E+03 + -1.67234399E+03 -1.66778894E+03 -1.66323401E+03 -1.65867896E+03 + -1.70408606E+03 -1.70196204E+03 -1.69983704E+03 -1.69771204E+03 + -1.69558704E+03 -1.69250696E+03 -1.68942700E+03 -1.68634705E+03 + -1.68326697E+03 -1.68018701E+03 -1.67559802E+03 -1.67100806E+03 + -1.66641895E+03 -1.66182898E+03 -1.65723999E+03 -1.69876196E+03 + -1.69662402E+03 -1.69448596E+03 -1.69234900E+03 -1.69021106E+03 + -1.68718396E+03 -1.68415601E+03 -1.68112903E+03 -1.67810205E+03 + -1.67507495E+03 -1.67065405E+03 -1.66623206E+03 -1.66181104E+03 + -1.65739001E+03 -1.65296899E+03 -1.69072400E+03 -1.69072400E+03 + -1.69072400E+03 -1.69072400E+03 -1.68857605E+03 -1.68857605E+03 + -1.68857605E+03 -1.68857605E+03 -1.68642700E+03 -1.68642700E+03 + -1.68642700E+03 -1.68642700E+03 -1.68427905E+03 -1.68427905E+03 + -1.68427905E+03 -1.68427905E+03 -1.68213000E+03 -1.68213000E+03 + -1.68213000E+03 -1.68213000E+03 -1.67906702E+03 -1.67906702E+03 + -1.67906702E+03 -1.67906702E+03 -1.67600305E+03 -1.67600305E+03 + -1.67600305E+03 -1.67600305E+03 -1.67293799E+03 -1.67293799E+03 + -1.67293799E+03 -1.67293799E+03 -1.66987500E+03 -1.66987500E+03 + -1.66987500E+03 -1.66987500E+03 -1.66681104E+03 -1.66681104E+03 + -1.66681104E+03 -1.66681104E+03 -1.66230200E+03 -1.66230200E+03 + -1.66230200E+03 -1.66230200E+03 -1.65779395E+03 -1.65779395E+03 + -1.65779395E+03 -1.65779395E+03 -1.65328601E+03 -1.65328601E+03 + -1.65328601E+03 -1.65328601E+03 -1.64877698E+03 -1.64877698E+03 + -1.64877698E+03 -1.64877698E+03 -1.64426904E+03 -1.64426904E+03 + -1.64426904E+03 -1.64426904E+03 -1.69767004E+03 -1.69767004E+03 + -1.69767004E+03 -1.69767004E+03 -1.69560706E+03 -1.69560706E+03 + -1.69560706E+03 -1.69560706E+03 -1.69354395E+03 -1.69354395E+03 + -1.69354395E+03 -1.69354395E+03 -1.69148206E+03 -1.69148206E+03 + -1.69148206E+03 -1.69148206E+03 -1.68941895E+03 -1.68941895E+03 + -1.68941895E+03 -1.68941895E+03 -1.68641003E+03 -1.68641003E+03 + -1.68641003E+03 -1.68641003E+03 -1.68340198E+03 -1.68340198E+03 + -1.68340198E+03 -1.68340198E+03 -1.68039294E+03 -1.68039294E+03 + -1.68039294E+03 -1.68039294E+03 -1.67738403E+03 -1.67738403E+03 + -1.67738403E+03 -1.67738403E+03 -1.67437598E+03 -1.67437598E+03 + -1.67437598E+03 -1.67437598E+03 -1.66983496E+03 -1.66983496E+03 + -1.66983496E+03 -1.66983496E+03 -1.66529504E+03 -1.66529504E+03 + -1.66529504E+03 -1.66529504E+03 -1.66075500E+03 -1.66075500E+03 + -1.66075500E+03 -1.66075500E+03 -1.65621497E+03 -1.65621497E+03 + -1.65621497E+03 -1.65621497E+03 -1.65167505E+03 -1.65167505E+03 + -1.65167505E+03 -1.65167505E+03 -1.69357605E+03 -1.69151001E+03 + -1.68944397E+03 -1.68737805E+03 -1.68531201E+03 -1.68230396E+03 + -1.67929504E+03 -1.67628601E+03 -1.67327698E+03 -1.67026904E+03 + -1.66571301E+03 -1.66115601E+03 -1.65659998E+03 -1.65204395E+03 + -1.64748804E+03 -1.68499402E+03 -1.68290906E+03 -1.68082397E+03 + -1.67873901E+03 -1.67665405E+03 -1.67361096E+03 -1.67056799E+03 + -1.66752502E+03 -1.66448206E+03 -1.66143896E+03 -1.65686401E+03 + -1.65228894E+03 -1.64771399E+03 -1.64313904E+03 -1.63856396E+03 + -1.67118799E+03 -1.66907703E+03 -1.66696594E+03 -1.66485498E+03 + -1.66274402E+03 -1.65966003E+03 -1.65657703E+03 -1.65349304E+03 + -1.65041003E+03 -1.64732605E+03 -1.64260303E+03 -1.63788000E+03 + -1.63315698E+03 -1.62843396E+03 -1.62371106E+03 -1.65852795E+03 + -1.65634302E+03 -1.65415698E+03 -1.65197205E+03 -1.64978699E+03 + -1.64658997E+03 -1.64339294E+03 -1.64019702E+03 -1.63700000E+03 + -1.63380298E+03 -1.62883105E+03 -1.62385803E+03 -1.61888599E+03 + -1.61391394E+03 -1.60894104E+03 -1.64771106E+03 -1.64552295E+03 + -1.64333606E+03 -1.64114905E+03 -1.63896106E+03 -1.63577295E+03 + -1.63258398E+03 -1.62939600E+03 -1.62620703E+03 -1.62301904E+03 + -1.61802905E+03 -1.61303894E+03 -1.60804895E+03 -1.60305798E+03 + -1.59806799E+03 -1.64012305E+03 -1.63787598E+03 -1.63563000E+03 + -1.63338306E+03 -1.63113696E+03 -1.62787000E+03 -1.62460400E+03 + -1.62133704E+03 -1.61807104E+03 -1.61480396E+03 -1.60973804E+03 + -1.60467200E+03 -1.59960596E+03 -1.59454004E+03 -1.58947302E+03 + -1.63550903E+03 -1.63322705E+03 -1.63094604E+03 -1.62866394E+03 + -1.62638306E+03 -1.62305103E+03 -1.61971899E+03 -1.61638696E+03 + -1.61305505E+03 -1.60972302E+03 -1.60458606E+03 -1.59944995E+03 + -1.59431299E+03 -1.58917603E+03 -1.58403894E+03 -1.63033496E+03 + -1.62808398E+03 -1.62583203E+03 -1.62358105E+03 -1.62132898E+03 + -1.61807703E+03 -1.61482397E+03 -1.61157104E+03 -1.60831799E+03 + -1.60506604E+03 -1.60002905E+03 -1.59499097E+03 -1.58995398E+03 + -1.58491699E+03 -1.57988000E+03 -1.62525098E+03 -1.62296704E+03 + -1.62068396E+03 -1.61840100E+03 -1.61611694E+03 -1.61279004E+03 + -1.60946301E+03 -1.60613599E+03 -1.60280798E+03 -1.59948096E+03 + -1.59436304E+03 -1.58924500E+03 -1.58412695E+03 -1.57900806E+03 + -1.57389001E+03 -1.61860901E+03 -1.61632202E+03 -1.61403601E+03 + -1.61174902E+03 -1.60946301E+03 -1.60612500E+03 -1.60278796E+03 + -1.59944995E+03 -1.59611304E+03 -1.59277502E+03 -1.58762000E+03 + -1.58246594E+03 -1.57731104E+03 -1.57215601E+03 -1.56700098E+03 + -1.60901599E+03 -1.60671106E+03 -1.60440601E+03 -1.60209998E+03 + -1.59979395E+03 -1.59649500E+03 -1.59319495E+03 -1.58989502E+03 + -1.58659497E+03 -1.58329602E+03 -1.57833203E+03 -1.57336804E+03 + -1.56840405E+03 -1.56343994E+03 -1.55847595E+03 -1.60107300E+03 + -1.60107300E+03 -1.64818201E+03 -1.60107300E+03 -1.59891699E+03 + -1.59891699E+03 -1.64538196E+03 -1.59891699E+03 -1.59676099E+03 + -1.59676099E+03 -1.64258301E+03 -1.59676099E+03 -1.59460498E+03 + -1.59460498E+03 -1.63978296E+03 -1.59460498E+03 -1.59244897E+03 + -1.59244897E+03 -1.63698401E+03 -1.59244897E+03 -1.58931604E+03 + -1.58931604E+03 -1.63525403E+03 -1.58931604E+03 -1.58618298E+03 + -1.58618298E+03 -1.63352405E+03 -1.58618298E+03 -1.58305005E+03 + -1.58305005E+03 -1.63179395E+03 -1.58305005E+03 -1.57991699E+03 + -1.57991699E+03 -1.63006396E+03 -1.57991699E+03 -1.57678406E+03 + -1.57678406E+03 -1.62833398E+03 -1.57678406E+03 -1.57199500E+03 + -1.57199500E+03 -1.62388794E+03 -1.57199500E+03 -1.56720496E+03 + -1.56720496E+03 -1.61944104E+03 -1.56720496E+03 -1.56241504E+03 + -1.56241504E+03 -1.61499500E+03 -1.56241504E+03 -1.55762500E+03 + -1.55762500E+03 -1.61054797E+03 -1.55762500E+03 -1.55283496E+03 + -1.55283496E+03 -1.60610095E+03 -1.55283496E+03 -1.64198401E+03 + -1.59705298E+03 -1.64198401E+03 -1.59705298E+03 -1.63959998E+03 + -1.59491504E+03 -1.63959998E+03 -1.59491504E+03 -1.63721594E+03 + -1.59277600E+03 -1.63721594E+03 -1.59277600E+03 -1.63483203E+03 + -1.59063794E+03 -1.63483203E+03 -1.59063794E+03 -1.63244800E+03 + -1.58849902E+03 -1.63244800E+03 -1.58849902E+03 -1.63081995E+03 + -1.58539905E+03 -1.63081995E+03 -1.58539905E+03 -1.62919299E+03 + -1.58229895E+03 -1.62919299E+03 -1.58229895E+03 -1.62756494E+03 + -1.57919897E+03 -1.62756494E+03 -1.57919897E+03 -1.62593799E+03 + -1.57609900E+03 -1.62593799E+03 -1.57609900E+03 -1.62431006E+03 + -1.57299805E+03 -1.62431006E+03 -1.57299805E+03 -1.61990100E+03 + -1.56825696E+03 -1.61990100E+03 -1.56825696E+03 -1.61549097E+03 + -1.56351599E+03 -1.61549097E+03 -1.56351599E+03 -1.61108105E+03 + -1.55877405E+03 -1.61108105E+03 -1.55877405E+03 -1.60667102E+03 + -1.55403296E+03 -1.60667102E+03 -1.55403296E+03 -1.60226099E+03 + -1.54929102E+03 -1.60226099E+03 -1.54929102E+03 -1.64138196E+03 + -1.59410400E+03 -1.64138196E+03 -1.64138196E+03 -1.63911499E+03 + -1.59196594E+03 -1.63911499E+03 -1.63911499E+03 -1.63684802E+03 + -1.58982898E+03 -1.63684802E+03 -1.63684802E+03 -1.63458105E+03 + -1.58769104E+03 -1.63458105E+03 -1.63458105E+03 -1.63231396E+03 + -1.58555396E+03 -1.63231396E+03 -1.63231396E+03 -1.63044897E+03 + -1.58245300E+03 -1.63044897E+03 -1.63044897E+03 -1.62858496E+03 + -1.57935205E+03 -1.62858496E+03 -1.62858496E+03 -1.62671997E+03 + -1.57625098E+03 -1.62671997E+03 -1.62671997E+03 -1.62485498E+03 + -1.57315002E+03 -1.62485498E+03 -1.62485498E+03 -1.62298999E+03 + -1.57004895E+03 -1.62298999E+03 -1.62298999E+03 -1.61835205E+03 + -1.56529004E+03 -1.61835205E+03 -1.61835205E+03 -1.61371497E+03 + -1.56053198E+03 -1.61371497E+03 -1.61371497E+03 -1.60907800E+03 + -1.55577295E+03 -1.60907800E+03 -1.60907800E+03 -1.60444104E+03 + -1.55101501E+03 -1.60444104E+03 -1.60444104E+03 -1.59980396E+03 + -1.54625598E+03 -1.59980396E+03 -1.59980396E+03 -1.64864404E+03 + -1.64643103E+03 -1.64421704E+03 -1.64200403E+03 -1.63979102E+03 + -1.63669604E+03 -1.63360095E+03 -1.63050598E+03 -1.62741101E+03 + -1.62431604E+03 -1.61939795E+03 -1.61447900E+03 -1.60956104E+03 + -1.60464197E+03 -1.59972400E+03 -1.66351794E+03 -1.66103699E+03 + -1.65855505E+03 -1.65607300E+03 -1.65359094E+03 -1.65000696E+03 + -1.64642297E+03 -1.64283997E+03 -1.63925598E+03 -1.63567200E+03 + -1.62938403E+03 -1.62309595E+03 -1.61680896E+03 -1.61052100E+03 + -1.60423303E+03 -1.67402600E+03 -1.67124304E+03 -1.66845898E+03 + -1.66567603E+03 -1.66289294E+03 -1.65726904E+03 -1.65164404E+03 + -1.64602002E+03 -1.64039600E+03 -1.63477100E+03 -1.62918896E+03 + -1.62360706E+03 -1.61802405E+03 -1.61244202E+03 -1.60685999E+03 + -1.66984900E+03 -1.66984900E+03 -1.70474304E+03 -1.66984900E+03 + -1.66739795E+03 -1.66739795E+03 -1.70221301E+03 -1.66739795E+03 + -1.66494800E+03 -1.66494800E+03 -1.69968298E+03 -1.66494800E+03 + -1.66249805E+03 -1.66249805E+03 -1.69715295E+03 -1.66249805E+03 + -1.66004797E+03 -1.66004797E+03 -1.69462402E+03 -1.66004797E+03 + -1.65485901E+03 -1.65485901E+03 -1.69158606E+03 -1.65485901E+03 + -1.64967004E+03 -1.64967004E+03 -1.68854895E+03 -1.64967004E+03 + -1.64448096E+03 -1.64448096E+03 -1.68551196E+03 -1.64448096E+03 + -1.63929199E+03 -1.63929199E+03 -1.68247498E+03 -1.63929199E+03 + -1.63410303E+03 -1.63410303E+03 -1.67943799E+03 -1.63410303E+03 + -1.62884204E+03 -1.62884204E+03 -1.67479504E+03 -1.62884204E+03 + -1.62358203E+03 -1.62358203E+03 -1.67015198E+03 -1.62358203E+03 + -1.61832202E+03 -1.61832202E+03 -1.66551001E+03 -1.61832202E+03 + -1.61306201E+03 -1.61306201E+03 -1.66086694E+03 -1.61306201E+03 + -1.60780103E+03 -1.60780103E+03 -1.65622400E+03 -1.60780103E+03 + -1.70527600E+03 -1.66701001E+03 -1.70527600E+03 -1.70527600E+03 + -1.70291504E+03 -1.66495105E+03 -1.70291504E+03 -1.70291504E+03 + -1.70055505E+03 -1.66289197E+03 -1.70055505E+03 -1.70055505E+03 + -1.69819495E+03 -1.66083203E+03 -1.69819495E+03 -1.69819495E+03 + -1.69583398E+03 -1.65877295E+03 -1.69583398E+03 -1.69583398E+03 + -1.69269104E+03 -1.65398596E+03 -1.69269104E+03 -1.69269104E+03 + -1.68954700E+03 -1.64919995E+03 -1.68954700E+03 -1.68954700E+03 + -1.68640295E+03 -1.64441296E+03 -1.68640295E+03 -1.68640295E+03 + -1.68325903E+03 -1.63962695E+03 -1.68325903E+03 -1.68325903E+03 + -1.68011499E+03 -1.63483997E+03 -1.68011499E+03 -1.68011499E+03 + -1.67557605E+03 -1.62959705E+03 -1.67557605E+03 -1.67557605E+03 + -1.67103796E+03 -1.62435498E+03 -1.67103796E+03 -1.67103796E+03 + -1.66650000E+03 -1.61911206E+03 -1.66650000E+03 -1.66650000E+03 + -1.66196106E+03 -1.61386902E+03 -1.66196106E+03 -1.66196106E+03 + -1.65742297E+03 -1.60862695E+03 -1.65742297E+03 -1.65742297E+03 + -1.70400000E+03 -1.70177197E+03 -1.69954395E+03 -1.69731604E+03 + -1.69508801E+03 -1.69197095E+03 -1.68885400E+03 -1.68573804E+03 + -1.68262097E+03 -1.67950403E+03 -1.67509399E+03 -1.67068396E+03 + -1.66627405E+03 -1.66186401E+03 -1.65745398E+03 -1.70100305E+03 + -1.69885706E+03 -1.69671106E+03 -1.69456396E+03 -1.69241797E+03 + -1.68932996E+03 -1.68624097E+03 -1.68315295E+03 -1.68006494E+03 + -1.67697595E+03 -1.67250598E+03 -1.66803503E+03 -1.66356494E+03 + -1.65909399E+03 -1.65462402E+03 -1.69346106E+03 -1.69134998E+03 + -1.68923999E+03 -1.68712903E+03 -1.68501794E+03 -1.68202100E+03 + -1.67902405E+03 -1.67602698E+03 -1.67303003E+03 -1.67003296E+03 + -1.66565198E+03 -1.66127100E+03 -1.65689001E+03 -1.65250903E+03 + -1.64812805E+03 -1.68327100E+03 -1.68327100E+03 -1.68327100E+03 + -1.68327100E+03 -1.68108704E+03 -1.68108704E+03 -1.68108704E+03 + -1.68108704E+03 -1.67890295E+03 -1.67890295E+03 -1.67890295E+03 + -1.67890295E+03 -1.67671899E+03 -1.67671899E+03 -1.67671899E+03 + -1.67671899E+03 -1.67453503E+03 -1.67453503E+03 -1.67453503E+03 + -1.67453503E+03 -1.67144202E+03 -1.67144202E+03 -1.67144202E+03 + -1.67144202E+03 -1.66834998E+03 -1.66834998E+03 -1.66834998E+03 + -1.66834998E+03 -1.66525696E+03 -1.66525696E+03 -1.66525696E+03 + -1.66525696E+03 -1.66216504E+03 -1.66216504E+03 -1.66216504E+03 + -1.66216504E+03 -1.65907300E+03 -1.65907300E+03 -1.65907300E+03 + -1.65907300E+03 -1.65457104E+03 -1.65457104E+03 -1.65457104E+03 + -1.65457104E+03 -1.65006995E+03 -1.65006995E+03 -1.65006995E+03 + -1.65006995E+03 -1.64556799E+03 -1.64556799E+03 -1.64556799E+03 + -1.64556799E+03 -1.64106702E+03 -1.64106702E+03 -1.64106702E+03 + -1.64106702E+03 -1.63656604E+03 -1.63656604E+03 -1.63656604E+03 + -1.63656604E+03 -1.69456799E+03 -1.69456799E+03 -1.69456799E+03 + -1.69456799E+03 -1.69253101E+03 -1.69253101E+03 -1.69253101E+03 + -1.69253101E+03 -1.69049402E+03 -1.69049402E+03 -1.69049402E+03 + -1.69049402E+03 -1.68845703E+03 -1.68845703E+03 -1.68845703E+03 + -1.68845703E+03 -1.68642004E+03 -1.68642004E+03 -1.68642004E+03 + -1.68642004E+03 -1.68347302E+03 -1.68347302E+03 -1.68347302E+03 + -1.68347302E+03 -1.68052600E+03 -1.68052600E+03 -1.68052600E+03 + -1.68052600E+03 -1.67757898E+03 -1.67757898E+03 -1.67757898E+03 + -1.67757898E+03 -1.67463196E+03 -1.67463196E+03 -1.67463196E+03 + -1.67463196E+03 -1.67168604E+03 -1.67168604E+03 -1.67168604E+03 + -1.67168604E+03 -1.66726794E+03 -1.66726794E+03 -1.66726794E+03 + -1.66726794E+03 -1.66285095E+03 -1.66285095E+03 -1.66285095E+03 + -1.66285095E+03 -1.65843396E+03 -1.65843396E+03 -1.65843396E+03 + -1.65843396E+03 -1.65401697E+03 -1.65401697E+03 -1.65401697E+03 + -1.65401697E+03 -1.64959998E+03 -1.64959998E+03 -1.64959998E+03 + -1.64959998E+03 -1.69328503E+03 -1.69121399E+03 -1.68914294E+03 + -1.68707104E+03 -1.68500000E+03 -1.68214697E+03 -1.67929395E+03 + -1.67644202E+03 -1.67358899E+03 -1.67073596E+03 -1.66625195E+03 + -1.66176904E+03 -1.65728601E+03 -1.65280298E+03 -1.64831897E+03 + -1.68661694E+03 -1.68457397E+03 -1.68253101E+03 -1.68048804E+03 + -1.67844495E+03 -1.67544995E+03 -1.67245496E+03 -1.66945996E+03 + -1.66646497E+03 -1.66346997E+03 -1.65887195E+03 -1.65427502E+03 + -1.64967798E+03 -1.64508105E+03 -1.64048401E+03 -1.67119897E+03 + -1.66915100E+03 -1.66710400E+03 -1.66505603E+03 -1.66300903E+03 + -1.66003198E+03 -1.65705396E+03 -1.65407703E+03 -1.65109998E+03 + -1.64812305E+03 -1.64346106E+03 -1.63879797E+03 -1.63413599E+03 + -1.62947400E+03 -1.62481104E+03 -1.65763000E+03 -1.65556006E+03 + -1.65349097E+03 -1.65142102E+03 -1.64935205E+03 -1.64633203E+03 + -1.64331201E+03 -1.64029297E+03 -1.63727295E+03 -1.63425305E+03 + -1.62943201E+03 -1.62461206E+03 -1.61979102E+03 -1.61496997E+03 + -1.61015002E+03 -1.64796802E+03 -1.64583398E+03 -1.64369995E+03 + -1.64156494E+03 -1.63943103E+03 -1.63634094E+03 -1.63325000E+03 + -1.63016003E+03 -1.62706897E+03 -1.62397900E+03 -1.61899597E+03 + -1.61401294E+03 -1.60903003E+03 -1.60404700E+03 -1.59906396E+03 + -1.64407104E+03 -1.64187805E+03 -1.63968604E+03 -1.63749402E+03 + -1.63530103E+03 -1.63212598E+03 -1.62895105E+03 -1.62577600E+03 + -1.62260095E+03 -1.61942603E+03 -1.61417603E+03 -1.60892700E+03 + -1.60367798E+03 -1.59842798E+03 -1.59317896E+03 -1.64020398E+03 + -1.63793298E+03 -1.63566101E+03 -1.63339001E+03 -1.63111902E+03 + -1.62783606E+03 -1.62455298E+03 -1.62127002E+03 -1.61798596E+03 + -1.61470300E+03 -1.60934204E+03 -1.60398096E+03 -1.59862000E+03 + -1.59325903E+03 -1.58789795E+03 -1.63548499E+03 -1.63314001E+03 + -1.63079504E+03 -1.62844995E+03 -1.62610498E+03 -1.62270898E+03 + -1.61931201E+03 -1.61591602E+03 -1.61252002E+03 -1.60912402E+03 + -1.60377405E+03 -1.59842297E+03 -1.59307300E+03 -1.58772302E+03 + -1.58237195E+03 -1.62989600E+03 -1.62750305E+03 -1.62510999E+03 + -1.62271802E+03 -1.62032495E+03 -1.61684399E+03 -1.61336401E+03 + -1.60988403E+03 -1.60640295E+03 -1.60292297E+03 -1.59757898E+03 + -1.59223596E+03 -1.58689294E+03 -1.58154895E+03 -1.57620605E+03 + -1.62414294E+03 -1.62183496E+03 -1.61952698E+03 -1.61721899E+03 + -1.61491101E+03 -1.61162195E+03 -1.60833301E+03 -1.60504395E+03 + -1.60175598E+03 -1.59846704E+03 -1.59336694E+03 -1.58826697E+03 + -1.58316797E+03 -1.57806799E+03 -1.57296802E+03 -1.62155798E+03 + -1.61918896E+03 -1.61682104E+03 -1.61445300E+03 -1.61208398E+03 + -1.60864294E+03 -1.60520203E+03 -1.60176099E+03 -1.59831897E+03 + -1.59487805E+03 -1.58958301E+03 -1.58428796E+03 -1.57899194E+03 + -1.57369702E+03 -1.56840198E+03 -1.61524500E+03 -1.61289795E+03 + -1.61055103E+03 -1.60820398E+03 -1.60585706E+03 -1.60245703E+03 + -1.59905701E+03 -1.59565698E+03 -1.59225696E+03 -1.58885706E+03 + -1.58366699E+03 -1.57847595E+03 -1.57328601E+03 -1.56809497E+03 + -1.56290503E+03 -1.60912500E+03 -1.60678003E+03 -1.60443506E+03 + -1.60209094E+03 -1.59974597E+03 -1.59638306E+03 -1.59302100E+03 + -1.58965796E+03 -1.58629602E+03 -1.58293298E+03 -1.57785400E+03 + -1.57277600E+03 -1.56769702E+03 -1.56261804E+03 -1.55753894E+03 + -1.60042395E+03 -1.60042395E+03 -1.64858704E+03 -1.60042395E+03 + -1.59816003E+03 -1.59816003E+03 -1.64570801E+03 -1.59816003E+03 + -1.59589697E+03 -1.59589697E+03 -1.64282898E+03 -1.59589697E+03 + -1.59363306E+03 -1.59363306E+03 -1.63994995E+03 -1.59363306E+03 + -1.59137000E+03 -1.59137000E+03 -1.63707104E+03 -1.59137000E+03 + -1.58813306E+03 -1.58813306E+03 -1.63557898E+03 -1.58813306E+03 + -1.58489600E+03 -1.58489600E+03 -1.63408704E+03 -1.58489600E+03 + -1.58166003E+03 -1.58166003E+03 -1.63259497E+03 -1.58166003E+03 + -1.57842297E+03 -1.57842297E+03 -1.63110303E+03 -1.57842297E+03 + -1.57518701E+03 -1.57518701E+03 -1.62961096E+03 -1.57518701E+03 + -1.57028894E+03 -1.57028894E+03 -1.62495605E+03 -1.57028894E+03 + -1.56539099E+03 -1.56539099E+03 -1.62030200E+03 -1.56539099E+03 + -1.56049194E+03 -1.56049194E+03 -1.61564697E+03 -1.56049194E+03 + -1.55559399E+03 -1.55559399E+03 -1.61099194E+03 -1.55559399E+03 + -1.55069604E+03 -1.55069604E+03 -1.60633704E+03 -1.55069604E+03 + -1.64931702E+03 -1.59735999E+03 -1.64931702E+03 -1.59735999E+03 + -1.64679297E+03 -1.59516699E+03 -1.64679297E+03 -1.59516699E+03 + -1.64427002E+03 -1.59297302E+03 -1.64427002E+03 -1.59297302E+03 + -1.64174695E+03 -1.59077905E+03 -1.64174695E+03 -1.59077905E+03 + -1.63922400E+03 -1.58858606E+03 -1.63922400E+03 -1.58858606E+03 + -1.63722302E+03 -1.58541602E+03 -1.63722302E+03 -1.58541602E+03 + -1.63522302E+03 -1.58224597E+03 -1.63522302E+03 -1.58224597E+03 + -1.63322205E+03 -1.57907703E+03 -1.63322205E+03 -1.57907703E+03 + -1.63122095E+03 -1.57590698E+03 -1.63122095E+03 -1.57590698E+03 + -1.62921997E+03 -1.57273706E+03 -1.62921997E+03 -1.57273706E+03 + -1.62497095E+03 -1.56790100E+03 -1.62497095E+03 -1.56790100E+03 + -1.62072095E+03 -1.56306604E+03 -1.62072095E+03 -1.56306604E+03 + -1.61647095E+03 -1.55822998E+03 -1.61647095E+03 -1.55822998E+03 + -1.61222095E+03 -1.55339502E+03 -1.61222095E+03 -1.55339502E+03 + -1.60797095E+03 -1.54855896E+03 -1.60797095E+03 -1.54855896E+03 + -1.65084998E+03 -1.60070105E+03 -1.65084998E+03 -1.60070105E+03 + -1.64847498E+03 -1.59848401E+03 -1.64847498E+03 -1.59848401E+03 + -1.64609998E+03 -1.59626697E+03 -1.64609998E+03 -1.59626697E+03 + -1.64372595E+03 -1.59405005E+03 -1.64372595E+03 -1.59405005E+03 + -1.64135095E+03 -1.59183398E+03 -1.64135095E+03 -1.59183398E+03 + -1.63934595E+03 -1.58861499E+03 -1.63934595E+03 -1.58861499E+03 + -1.63733997E+03 -1.58539697E+03 -1.63733997E+03 -1.58539697E+03 + -1.63533496E+03 -1.58217896E+03 -1.63533496E+03 -1.58217896E+03 + -1.63332996E+03 -1.57896106E+03 -1.63332996E+03 -1.57896106E+03 + -1.63132397E+03 -1.57574304E+03 -1.63132397E+03 -1.57574304E+03 + -1.62749500E+03 -1.57081995E+03 -1.62749500E+03 -1.57081995E+03 + -1.62366504E+03 -1.56589697E+03 -1.62366504E+03 -1.56589697E+03 + -1.61983496E+03 -1.56097400E+03 -1.61983496E+03 -1.56097400E+03 + -1.61600598E+03 -1.55605200E+03 -1.61600598E+03 -1.55605200E+03 + -1.61217603E+03 -1.55112903E+03 -1.61217603E+03 -1.55112903E+03 + -1.65957703E+03 -1.60561804E+03 -1.65957703E+03 -1.65957703E+03 + -1.65737000E+03 -1.60337305E+03 -1.65737000E+03 -1.65737000E+03 + -1.65516296E+03 -1.60112695E+03 -1.65516296E+03 -1.65516296E+03 + -1.65295605E+03 -1.59888098E+03 -1.65295605E+03 -1.65295605E+03 + -1.65074902E+03 -1.59663501E+03 -1.65074902E+03 -1.65074902E+03 + -1.64745801E+03 -1.59334900E+03 -1.64745801E+03 -1.64745801E+03 + -1.64416602E+03 -1.59006396E+03 -1.64416602E+03 -1.64416602E+03 + -1.64087500E+03 -1.58677795E+03 -1.64087500E+03 -1.64087500E+03 + -1.63758301E+03 -1.58349194E+03 -1.63758301E+03 -1.63758301E+03 + -1.63429199E+03 -1.58020605E+03 -1.63429199E+03 -1.63429199E+03 + -1.63022498E+03 -1.57514001E+03 -1.63022498E+03 -1.63022498E+03 + -1.62615906E+03 -1.57007397E+03 -1.62615906E+03 -1.62615906E+03 + -1.62209204E+03 -1.56500903E+03 -1.62209204E+03 -1.62209204E+03 + -1.61802502E+03 -1.55994299E+03 -1.61802502E+03 -1.61802502E+03 + -1.61395801E+03 -1.55487695E+03 -1.61395801E+03 -1.61395801E+03 + -1.66552197E+03 -1.66340906E+03 -1.66129602E+03 -1.65918201E+03 + -1.65706897E+03 -1.65336096E+03 -1.64965405E+03 -1.64594604E+03 + -1.64223804E+03 -1.63853003E+03 -1.63368799E+03 -1.62884595E+03 + -1.62400403E+03 -1.61916199E+03 -1.61431995E+03 -1.66676294E+03 + -1.66676294E+03 -1.70009497E+03 -1.66676294E+03 -1.66482202E+03 + -1.66482202E+03 -1.69760498E+03 -1.66482202E+03 -1.66288098E+03 + -1.66288098E+03 -1.69511499E+03 -1.66288098E+03 -1.66093994E+03 + -1.66093994E+03 -1.69262402E+03 -1.66093994E+03 -1.65900000E+03 + -1.65900000E+03 -1.69013403E+03 -1.65900000E+03 -1.65509094E+03 + -1.65509094E+03 -1.68712598E+03 -1.65509094E+03 -1.65118201E+03 + -1.65118201E+03 -1.68411804E+03 -1.65118201E+03 -1.64727295E+03 + -1.64727295E+03 -1.68110999E+03 -1.64727295E+03 -1.64336401E+03 + -1.64336401E+03 -1.67810205E+03 -1.64336401E+03 -1.63945496E+03 + -1.63945496E+03 -1.67509497E+03 -1.63945496E+03 -1.63451599E+03 + -1.63451599E+03 -1.67096497E+03 -1.63451599E+03 -1.62957800E+03 + -1.62957800E+03 -1.66683606E+03 -1.62957800E+03 -1.62463904E+03 + -1.62463904E+03 -1.66270703E+03 -1.62463904E+03 -1.61970105E+03 + -1.61970105E+03 -1.65857800E+03 -1.61970105E+03 -1.61476196E+03 + -1.61476196E+03 -1.65444897E+03 -1.61476196E+03 -1.69817700E+03 + -1.66721594E+03 -1.69817700E+03 -1.69817700E+03 -1.69590906E+03 + -1.66543396E+03 -1.69590906E+03 -1.69590906E+03 -1.69364001E+03 + -1.66365198E+03 -1.69364001E+03 -1.69364001E+03 -1.69137097E+03 + -1.66187000E+03 -1.69137097E+03 -1.69137097E+03 -1.68910205E+03 + -1.66008899E+03 -1.68910205E+03 -1.68910205E+03 -1.68604504E+03 + -1.65608899E+03 -1.68604504E+03 -1.68604504E+03 -1.68298804E+03 + -1.65208997E+03 -1.68298804E+03 -1.68298804E+03 -1.67993103E+03 + -1.64809094E+03 -1.67993103E+03 -1.67993103E+03 -1.67687402E+03 + -1.64409204E+03 -1.67687402E+03 -1.67687402E+03 -1.67381702E+03 + -1.64009204E+03 -1.67381702E+03 -1.67381702E+03 -1.66971997E+03 + -1.63512195E+03 -1.66971997E+03 -1.66971997E+03 -1.66562402E+03 + -1.63015100E+03 -1.66562402E+03 -1.66562402E+03 -1.66152698E+03 + -1.62518005E+03 -1.66152698E+03 -1.66152698E+03 -1.65743103E+03 + -1.62020898E+03 -1.65743103E+03 -1.65743103E+03 -1.65333398E+03 + -1.61523901E+03 -1.65333398E+03 -1.65333398E+03 -1.69362402E+03 + -1.69154700E+03 -1.68946899E+03 -1.68739197E+03 -1.68531494E+03 + -1.68233203E+03 -1.67934998E+03 -1.67636804E+03 -1.67338501E+03 + -1.67040295E+03 -1.66616296E+03 -1.66192200E+03 -1.65768201E+03 + -1.65344202E+03 -1.64920105E+03 -1.68431702E+03 -1.68231799E+03 + -1.68031897E+03 -1.67831995E+03 -1.67632104E+03 -1.67344397E+03 + -1.67056702E+03 -1.66768994E+03 -1.66481299E+03 -1.66193604E+03 + -1.65776404E+03 -1.65359204E+03 -1.64942004E+03 -1.64524695E+03 + -1.64107495E+03 -1.67500806E+03 -1.67500806E+03 -1.67500806E+03 + -1.67500806E+03 -1.67279395E+03 -1.67279395E+03 -1.67279395E+03 + -1.67279395E+03 -1.67057996E+03 -1.67057996E+03 -1.67057996E+03 + -1.67057996E+03 -1.66836597E+03 -1.66836597E+03 -1.66836597E+03 + -1.66836597E+03 -1.66615100E+03 -1.66615100E+03 -1.66615100E+03 + -1.66615100E+03 -1.66304895E+03 -1.66304895E+03 -1.66304895E+03 + -1.66304895E+03 -1.65994604E+03 -1.65994604E+03 -1.65994604E+03 + -1.65994604E+03 -1.65684399E+03 -1.65684399E+03 -1.65684399E+03 + -1.65684399E+03 -1.65374097E+03 -1.65374097E+03 -1.65374097E+03 + -1.65374097E+03 -1.65063794E+03 -1.65063794E+03 -1.65063794E+03 + -1.65063794E+03 -1.64624902E+03 -1.64624902E+03 -1.64624902E+03 + -1.64624902E+03 -1.64185901E+03 -1.64185901E+03 -1.64185901E+03 + -1.64185901E+03 -1.63746899E+03 -1.63746899E+03 -1.63746899E+03 + -1.63746899E+03 -1.63307996E+03 -1.63307996E+03 -1.63307996E+03 + -1.63307996E+03 -1.62868994E+03 -1.62868994E+03 -1.62868994E+03 + -1.62868994E+03 -1.69206897E+03 -1.69206897E+03 -1.69206897E+03 + -1.69206897E+03 -1.68998206E+03 -1.68998206E+03 -1.68998206E+03 + -1.68998206E+03 -1.68789600E+03 -1.68789600E+03 -1.68789600E+03 + -1.68789600E+03 -1.68580896E+03 -1.68580896E+03 -1.68580896E+03 + -1.68580896E+03 -1.68372302E+03 -1.68372302E+03 -1.68372302E+03 + -1.68372302E+03 -1.68070801E+03 -1.68070801E+03 -1.68070801E+03 + -1.68070801E+03 -1.67769299E+03 -1.67769299E+03 -1.67769299E+03 + -1.67769299E+03 -1.67467798E+03 -1.67467798E+03 -1.67467798E+03 + -1.67467798E+03 -1.67166296E+03 -1.67166296E+03 -1.67166296E+03 + -1.67166296E+03 -1.66864795E+03 -1.66864795E+03 -1.66864795E+03 + -1.66864795E+03 -1.66414404E+03 -1.66414404E+03 -1.66414404E+03 + -1.66414404E+03 -1.65964099E+03 -1.65964099E+03 -1.65964099E+03 + -1.65964099E+03 -1.65513696E+03 -1.65513696E+03 -1.65513696E+03 + -1.65513696E+03 -1.65063403E+03 -1.65063403E+03 -1.65063403E+03 + -1.65063403E+03 -1.64613000E+03 -1.64613000E+03 -1.64613000E+03 + -1.64613000E+03 -1.69120801E+03 -1.68913599E+03 -1.68706299E+03 + -1.68498999E+03 -1.68291699E+03 -1.67990906E+03 -1.67690100E+03 + -1.67389294E+03 -1.67088501E+03 -1.66787598E+03 -1.66339197E+03 + -1.65890796E+03 -1.65442297E+03 -1.64993896E+03 -1.64545496E+03 + -1.68165698E+03 -1.67960901E+03 -1.67756006E+03 -1.67551196E+03 + -1.67346301E+03 -1.67051196E+03 -1.66756104E+03 -1.66460999E+03 + -1.66165906E+03 -1.65870801E+03 -1.65423804E+03 -1.64976904E+03 + -1.64529895E+03 -1.64082996E+03 -1.63635999E+03 -1.66667603E+03 + -1.66457104E+03 -1.66246594E+03 -1.66036096E+03 -1.65825696E+03 + -1.65524194E+03 -1.65222705E+03 -1.64921204E+03 -1.64619702E+03 + -1.64318201E+03 -1.63854700E+03 -1.63391199E+03 -1.62927795E+03 + -1.62464294E+03 -1.62000806E+03 -1.65532495E+03 -1.65318994E+03 + -1.65105505E+03 -1.64892004E+03 -1.64678601E+03 -1.64371594E+03 + -1.64064600E+03 -1.63757605E+03 -1.63450598E+03 -1.63143604E+03 + -1.62655298E+03 -1.62166895E+03 -1.61678503E+03 -1.61190100E+03 + -1.60701794E+03 -1.64932202E+03 -1.64715198E+03 -1.64498206E+03 + -1.64281201E+03 -1.64064294E+03 -1.63751294E+03 -1.63438403E+03 + -1.63125500E+03 -1.62812598E+03 -1.62499695E+03 -1.61983398E+03 + -1.61467200E+03 -1.60951001E+03 -1.60434705E+03 -1.59918506E+03 + -1.64665002E+03 -1.64444202E+03 -1.64223303E+03 -1.64002502E+03 + -1.63781604E+03 -1.63465503E+03 -1.63149304E+03 -1.62833203E+03 + -1.62517004E+03 -1.62200903E+03 -1.61665601E+03 -1.61130298E+03 + -1.60594995E+03 -1.60059705E+03 -1.59524500E+03 -1.64323804E+03 + -1.64099902E+03 -1.63875903E+03 -1.63652002E+03 -1.63428003E+03 + -1.63105396E+03 -1.62782800E+03 -1.62460095E+03 -1.62137500E+03 + -1.61814795E+03 -1.61271497E+03 -1.60728101E+03 -1.60184705E+03 + -1.59641296E+03 -1.59097900E+03 -1.63957898E+03 -1.63729504E+03 + -1.63501099E+03 -1.63272705E+03 -1.63044299E+03 -1.62714697E+03 + -1.62385205E+03 -1.62055603E+03 -1.61726001E+03 -1.61396399E+03 + -1.60852600E+03 -1.60308801E+03 -1.59765002E+03 -1.59221204E+03 + -1.58677502E+03 -1.63555701E+03 -1.63329297E+03 -1.63102795E+03 + -1.62876404E+03 -1.62649902E+03 -1.62315198E+03 -1.61980396E+03 + -1.61645605E+03 -1.61310803E+03 -1.60976099E+03 -1.60432104E+03 + -1.59888098E+03 -1.59344202E+03 -1.58800195E+03 -1.58256201E+03 + -1.63303699E+03 -1.63079895E+03 -1.62856006E+03 -1.62632202E+03 + -1.62408301E+03 -1.62074695E+03 -1.61741101E+03 -1.61407495E+03 + -1.61073901E+03 -1.60740198E+03 -1.60199597E+03 -1.59658899E+03 + -1.59118201E+03 -1.58577502E+03 -1.58036804E+03 -1.63265698E+03 + -1.63033398E+03 -1.62801196E+03 -1.62568896E+03 -1.62336694E+03 + -1.61995898E+03 -1.61655200E+03 -1.61314502E+03 -1.60973804E+03 + -1.60632996E+03 -1.60106897E+03 -1.59580798E+03 -1.59054700E+03 + -1.58528503E+03 -1.58002405E+03 -1.63408398E+03 -1.63172095E+03 + -1.62935901E+03 -1.62699597E+03 -1.62463306E+03 -1.62119702E+03 + -1.61776001E+03 -1.61432397E+03 -1.61088696E+03 -1.60745105E+03 + -1.60218701E+03 -1.59692200E+03 -1.59165796E+03 -1.58639404E+03 + -1.58112903E+03 -1.63556299E+03 -1.63307397E+03 -1.63058606E+03 + -1.62809705E+03 -1.62560803E+03 -1.62194702E+03 -1.61828699E+03 + -1.61462598E+03 -1.61096497E+03 -1.60730396E+03 -1.60162695E+03 + -1.59594897E+03 -1.59027100E+03 -1.58459302E+03 -1.57891504E+03 + -1.61940796E+03 -1.61694397E+03 -1.61447998E+03 -1.61201599E+03 + -1.60955200E+03 -1.60601099E+03 -1.60246899E+03 -1.59892798E+03 + -1.59538696E+03 -1.59184497E+03 -1.58650195E+03 -1.58116003E+03 + -1.57581702E+03 -1.57047400E+03 -1.56513098E+03 -1.61028101E+03 + -1.60791101E+03 -1.60554102E+03 -1.60317200E+03 -1.60080200E+03 + -1.59741199E+03 -1.59402197E+03 -1.59063306E+03 -1.58724304E+03 + -1.58385303E+03 -1.57877197E+03 -1.57369104E+03 -1.56860901E+03 + -1.56352795E+03 -1.55844702E+03 -1.61032800E+03 -1.60797498E+03 + -1.60562195E+03 -1.60327002E+03 -1.60091699E+03 -1.59755701E+03 + -1.59419800E+03 -1.59083801E+03 -1.58747803E+03 -1.58411902E+03 + -1.57909302E+03 -1.57406702E+03 -1.56904102E+03 -1.56401501E+03 + -1.55898999E+03 -1.61406604E+03 -1.61406604E+03 -1.66585596E+03 + -1.61406604E+03 -1.61170898E+03 -1.61170898E+03 -1.66308606E+03 + -1.61170898E+03 -1.60935303E+03 -1.60935303E+03 -1.66031604E+03 + -1.60935303E+03 -1.60699695E+03 -1.60699695E+03 -1.65754504E+03 + -1.60699695E+03 -1.60464001E+03 -1.60464001E+03 -1.65477502E+03 + -1.60464001E+03 -1.60125500E+03 -1.60125500E+03 -1.65278503E+03 + -1.60125500E+03 -1.59787097E+03 -1.59787097E+03 -1.65079395E+03 + -1.59787097E+03 -1.59448596E+03 -1.59448596E+03 -1.64880396E+03 + -1.59448596E+03 -1.59110205E+03 -1.59110205E+03 -1.64681299E+03 + -1.59110205E+03 -1.58771704E+03 -1.58771704E+03 -1.64482300E+03 + -1.58771704E+03 -1.58262195E+03 -1.58262195E+03 -1.64029895E+03 + -1.58262195E+03 -1.57752600E+03 -1.57752600E+03 -1.63577405E+03 + -1.57752600E+03 -1.57243103E+03 -1.57243103E+03 -1.63125000E+03 + -1.57243103E+03 -1.56733496E+03 -1.56733496E+03 -1.62672498E+03 + -1.56733496E+03 -1.56223999E+03 -1.56223999E+03 -1.62220105E+03 + -1.56223999E+03 -1.66861304E+03 -1.61378198E+03 -1.66861304E+03 + -1.61378198E+03 -1.66612000E+03 -1.61154602E+03 -1.66612000E+03 + -1.61154602E+03 -1.66362805E+03 -1.60931104E+03 -1.66362805E+03 + -1.60931104E+03 -1.66113501E+03 -1.60707495E+03 -1.66113501E+03 + -1.60707495E+03 -1.65864294E+03 -1.60483997E+03 -1.65864294E+03 + -1.60483997E+03 -1.65605200E+03 -1.60158301E+03 -1.65605200E+03 + -1.60158301E+03 -1.65346204E+03 -1.59832703E+03 -1.65346204E+03 + -1.59832703E+03 -1.65087097E+03 -1.59507104E+03 -1.65087097E+03 + -1.59507104E+03 -1.64828101E+03 -1.59181494E+03 -1.64828101E+03 + -1.59181494E+03 -1.64568994E+03 -1.58855896E+03 -1.64568994E+03 + -1.58855896E+03 -1.64100098E+03 -1.58355505E+03 -1.64100098E+03 + -1.58355505E+03 -1.63631201E+03 -1.57855103E+03 -1.63631201E+03 + -1.57855103E+03 -1.63162305E+03 -1.57354700E+03 -1.63162305E+03 + -1.57354700E+03 -1.62693396E+03 -1.56854395E+03 -1.62693396E+03 + -1.56854395E+03 -1.62224597E+03 -1.56354004E+03 -1.62224597E+03 + -1.56354004E+03 -1.66999695E+03 -1.61246594E+03 -1.66999695E+03 + -1.66999695E+03 -1.66773804E+03 -1.61030798E+03 -1.66773804E+03 + -1.66773804E+03 -1.66547803E+03 -1.60815002E+03 -1.66547803E+03 + -1.66547803E+03 -1.66321899E+03 -1.60599097E+03 -1.66321899E+03 + -1.66321899E+03 -1.66095996E+03 -1.60383301E+03 -1.66095996E+03 + -1.66095996E+03 -1.65794299E+03 -1.60063403E+03 -1.65794299E+03 + -1.65794299E+03 -1.65492603E+03 -1.59743396E+03 -1.65492603E+03 + -1.65492603E+03 -1.65191003E+03 -1.59423499E+03 -1.65191003E+03 + -1.65191003E+03 -1.64889294E+03 -1.59103503E+03 -1.64889294E+03 + -1.64889294E+03 -1.64587695E+03 -1.58783606E+03 -1.64587695E+03 + -1.64587695E+03 -1.64109399E+03 -1.58287598E+03 -1.64109399E+03 + -1.64109399E+03 -1.63631104E+03 -1.57791699E+03 -1.63631104E+03 + -1.63631104E+03 -1.63152795E+03 -1.57295703E+03 -1.63152795E+03 + -1.63152795E+03 -1.62674500E+03 -1.56799695E+03 -1.62674500E+03 + -1.62674500E+03 -1.62196204E+03 -1.56303796E+03 -1.62196204E+03 + -1.62196204E+03 -1.67047302E+03 -1.67047302E+03 -1.69076001E+03 + -1.69076001E+03 -1.66847803E+03 -1.66847803E+03 -1.68849194E+03 + -1.68849194E+03 -1.66648303E+03 -1.66648303E+03 -1.68622400E+03 + -1.68622400E+03 -1.66448804E+03 -1.66448804E+03 -1.68395605E+03 + -1.68395605E+03 -1.66249304E+03 -1.66249304E+03 -1.68168799E+03 + -1.68168799E+03 -1.65916199E+03 -1.65916199E+03 -1.67874805E+03 + -1.67874805E+03 -1.65582996E+03 -1.65582996E+03 -1.67580798E+03 + -1.67580798E+03 -1.65249902E+03 -1.65249902E+03 -1.67286902E+03 + -1.67286902E+03 -1.64916699E+03 -1.64916699E+03 -1.66992896E+03 + -1.66992896E+03 -1.64583496E+03 -1.64583496E+03 -1.66698901E+03 + -1.66698901E+03 -1.64103003E+03 -1.64103003E+03 -1.66338098E+03 + -1.66338098E+03 -1.63622400E+03 -1.63622400E+03 -1.65977405E+03 + -1.65977405E+03 -1.63141895E+03 -1.63141895E+03 -1.65616602E+03 + -1.65616602E+03 -1.62661401E+03 -1.62661401E+03 -1.65255798E+03 + -1.65255798E+03 -1.62180798E+03 -1.62180798E+03 -1.64894995E+03 + -1.64894995E+03 -1.68725806E+03 -1.68512000E+03 -1.68298206E+03 + -1.68084399E+03 -1.67870605E+03 -1.67573096E+03 -1.67275598E+03 + -1.66978101E+03 -1.66680603E+03 -1.66383105E+03 -1.66025403E+03 + -1.65667603E+03 -1.65309802E+03 -1.64952002E+03 -1.64594299E+03 + -1.68254199E+03 -1.68042603E+03 -1.67831006E+03 -1.67619397E+03 + -1.67407800E+03 -1.67102600E+03 -1.66797302E+03 -1.66492102E+03 + -1.66186804E+03 -1.65881604E+03 -1.65489099E+03 -1.65096594E+03 + -1.64704102E+03 -1.64311597E+03 -1.63919104E+03 -1.67729297E+03 + -1.67729297E+03 -1.67729297E+03 -1.67729297E+03 -1.67510205E+03 + -1.67510205E+03 -1.67510205E+03 -1.67510205E+03 -1.67291101E+03 + -1.67291101E+03 -1.67291101E+03 -1.67291101E+03 -1.67071997E+03 + -1.67071997E+03 -1.67071997E+03 -1.67071997E+03 -1.66852905E+03 + -1.66852905E+03 -1.66852905E+03 -1.66852905E+03 -1.66538403E+03 + -1.66538403E+03 -1.66538403E+03 -1.66538403E+03 -1.66223999E+03 + -1.66223999E+03 -1.66223999E+03 -1.66223999E+03 -1.65909497E+03 + -1.65909497E+03 -1.65909497E+03 -1.65909497E+03 -1.65595105E+03 + -1.65595105E+03 -1.65595105E+03 -1.65595105E+03 -1.65280603E+03 + -1.65280603E+03 -1.65280603E+03 -1.65280603E+03 -1.64837500E+03 + -1.64837500E+03 -1.64837500E+03 -1.64837500E+03 -1.64394299E+03 + -1.64394299E+03 -1.64394299E+03 -1.64394299E+03 -1.63951196E+03 + -1.63951196E+03 -1.63951196E+03 -1.63951196E+03 -1.63507996E+03 + -1.63507996E+03 -1.63507996E+03 -1.63507996E+03 -1.63064905E+03 + -1.63064905E+03 -1.63064905E+03 -1.63064905E+03 -1.69378101E+03 + -1.69378101E+03 -1.69378101E+03 -1.69378101E+03 -1.69160205E+03 + -1.69160205E+03 -1.69160205E+03 -1.69160205E+03 -1.68942200E+03 + -1.68942200E+03 -1.68942200E+03 -1.68942200E+03 -1.68724194E+03 + -1.68724194E+03 -1.68724194E+03 -1.68724194E+03 -1.68506201E+03 + -1.68506201E+03 -1.68506201E+03 -1.68506201E+03 -1.68203699E+03 + -1.68203699E+03 -1.68203699E+03 -1.68203699E+03 -1.67901196E+03 + -1.67901196E+03 -1.67901196E+03 -1.67901196E+03 -1.67598804E+03 + -1.67598804E+03 -1.67598804E+03 -1.67598804E+03 -1.67296301E+03 + -1.67296301E+03 -1.67296301E+03 -1.67296301E+03 -1.66993799E+03 + -1.66993799E+03 -1.66993799E+03 -1.66993799E+03 -1.66531006E+03 + -1.66531006E+03 -1.66531006E+03 -1.66531006E+03 -1.66068103E+03 + -1.66068103E+03 -1.66068103E+03 -1.66068103E+03 -1.65605298E+03 + -1.65605298E+03 -1.65605298E+03 -1.65605298E+03 -1.65142395E+03 + -1.65142395E+03 -1.65142395E+03 -1.65142395E+03 -1.64679602E+03 + -1.64679602E+03 -1.64679602E+03 -1.64679602E+03 -1.68910400E+03 + -1.68700903E+03 -1.68491504E+03 -1.68281995E+03 -1.68072595E+03 + -1.67778796E+03 -1.67485095E+03 -1.67191394E+03 -1.66897595E+03 + -1.66603894E+03 -1.66150903E+03 -1.65697900E+03 -1.65244995E+03 + -1.64792004E+03 -1.64339001E+03 -1.68043799E+03 -1.67829504E+03 + -1.67615100E+03 -1.67400696E+03 -1.67186304E+03 -1.66877698E+03 + -1.66569202E+03 -1.66260596E+03 -1.65952002E+03 -1.65643396E+03 + -1.65179004E+03 -1.64714600E+03 -1.64250098E+03 -1.63785706E+03 + -1.63321301E+03 -1.66783105E+03 -1.66569495E+03 -1.66356006E+03 + -1.66142395E+03 -1.65928894E+03 -1.65620801E+03 -1.65312695E+03 + -1.65004700E+03 -1.64696594E+03 -1.64388501E+03 -1.63904395E+03 + -1.63420300E+03 -1.62936206E+03 -1.62452100E+03 -1.61968005E+03 + -1.65567505E+03 -1.65356396E+03 -1.65145300E+03 -1.64934204E+03 + -1.64723096E+03 -1.64417297E+03 -1.64111499E+03 -1.63805701E+03 + -1.63499902E+03 -1.63194104E+03 -1.62696301E+03 -1.62198401E+03 + -1.61700500E+03 -1.61202600E+03 -1.60704700E+03 -1.64945801E+03 + -1.64733203E+03 -1.64520605E+03 -1.64307996E+03 -1.64095398E+03 + -1.63789697E+03 -1.63484094E+03 -1.63178503E+03 -1.62872803E+03 + -1.62567200E+03 -1.62060095E+03 -1.61553003E+03 -1.61045898E+03 + -1.60538794E+03 -1.60031702E+03 -1.64656006E+03 -1.64444104E+03 + -1.64232104E+03 -1.64020203E+03 -1.63808301E+03 -1.63504395E+03 + -1.63200500E+03 -1.62896594E+03 -1.62592700E+03 -1.62288794E+03 + -1.61762805E+03 -1.61236804E+03 -1.60710803E+03 -1.60184705E+03 + -1.59658704E+03 -1.64306799E+03 -1.64096106E+03 -1.63885400E+03 + -1.63674695E+03 -1.63464001E+03 -1.63157605E+03 -1.62851196E+03 + -1.62544800E+03 -1.62238403E+03 -1.61931995E+03 -1.61406201E+03 + -1.60880396E+03 -1.60354602E+03 -1.59828796E+03 -1.59303003E+03 + -1.64041003E+03 -1.63801501E+03 -1.63562000E+03 -1.63322400E+03 + -1.63082898E+03 -1.62773096E+03 -1.62463403E+03 -1.62153601E+03 + -1.61843799E+03 -1.61533997E+03 -1.61021594E+03 -1.60509094E+03 + -1.59996704E+03 -1.59484302E+03 -1.58971802E+03 -1.63744202E+03 + -1.63515906E+03 -1.63287695E+03 -1.63059399E+03 -1.62831201E+03 + -1.62508301E+03 -1.62185303E+03 -1.61862305E+03 -1.61539404E+03 + -1.61216394E+03 -1.60703003E+03 -1.60189600E+03 -1.59676196E+03 + -1.59162805E+03 -1.58649402E+03 -1.63722302E+03 -1.63488696E+03 + -1.63255103E+03 -1.63021497E+03 -1.62787903E+03 -1.62454102E+03 + -1.62120203E+03 -1.61786304E+03 -1.61452405E+03 -1.61118506E+03 + -1.60611206E+03 -1.60104004E+03 -1.59596802E+03 -1.59089502E+03 + -1.58582300E+03 -1.64197705E+03 -1.63952405E+03 -1.63707104E+03 + -1.63461804E+03 -1.63216504E+03 -1.62860999E+03 -1.62505505E+03 + -1.62150000E+03 -1.61794495E+03 -1.61439001E+03 -1.60906702E+03 + -1.60374402E+03 -1.59842200E+03 -1.59309900E+03 -1.58777600E+03 + -1.64742297E+03 -1.64502295E+03 -1.64262195E+03 -1.64022205E+03 + -1.63782104E+03 -1.63437805E+03 -1.63093396E+03 -1.62748999E+03 + -1.62404700E+03 -1.62060303E+03 -1.61545898E+03 -1.61031494E+03 + -1.60517102E+03 -1.60002600E+03 -1.59488196E+03 -1.64723401E+03 + -1.64482397E+03 -1.64241504E+03 -1.64000500E+03 -1.63759497E+03 + -1.63411902E+03 -1.63064197E+03 -1.62716602E+03 -1.62368994E+03 + -1.62021301E+03 -1.61496594E+03 -1.60971899E+03 -1.60447205E+03 + -1.59922400E+03 -1.59397705E+03 -1.63836206E+03 -1.63579395E+03 + -1.63322705E+03 -1.63066003E+03 -1.62809302E+03 -1.62441101E+03 + -1.62072900E+03 -1.61704700E+03 -1.61336499E+03 -1.60968201E+03 + -1.60419299E+03 -1.59870398E+03 -1.59321497E+03 -1.58772595E+03 + -1.58223706E+03 -1.62866003E+03 -1.62619495E+03 -1.62372998E+03 + -1.62126501E+03 -1.61880005E+03 -1.61528601E+03 -1.61177295E+03 + -1.60826001E+03 -1.60474695E+03 -1.60123401E+03 -1.59597095E+03 + -1.59070898E+03 -1.58544604E+03 -1.58018396E+03 -1.57492102E+03 + -1.62342004E+03 -1.62108496E+03 -1.61875000E+03 -1.61641504E+03 + -1.61407898E+03 -1.61073303E+03 -1.60738599E+03 -1.60403894E+03 + -1.60069202E+03 -1.59734595E+03 -1.59228101E+03 -1.58721594E+03 + -1.58215100E+03 -1.57708704E+03 -1.57202197E+03 -1.62194104E+03 + -1.61967200E+03 -1.61740405E+03 -1.61513501E+03 -1.61286597E+03 + -1.60962805E+03 -1.60639001E+03 -1.60315100E+03 -1.59991296E+03 + -1.59667505E+03 -1.59177100E+03 -1.58686694E+03 -1.58196301E+03 + -1.57705798E+03 -1.57215405E+03 -1.61912402E+03 -1.61684998E+03 + -1.61457605E+03 -1.61230298E+03 -1.61002905E+03 -1.60680701E+03 + -1.60358606E+03 -1.60036401E+03 -1.59714197E+03 -1.59392004E+03 + -1.58906897E+03 -1.58421704E+03 -1.57936499E+03 -1.57451404E+03 + -1.56966199E+03 -1.61607202E+03 -1.61607202E+03 -1.67843103E+03 + -1.61607202E+03 -1.61384705E+03 -1.61384705E+03 -1.67533398E+03 + -1.61384705E+03 -1.61162305E+03 -1.61162305E+03 -1.67223706E+03 + -1.61162305E+03 -1.60939905E+03 -1.60939905E+03 -1.66914099E+03 + -1.60939905E+03 -1.60717395E+03 -1.60717395E+03 -1.66604395E+03 + -1.60717395E+03 -1.60395703E+03 -1.60395703E+03 -1.66378003E+03 + -1.60395703E+03 -1.60073901E+03 -1.60073901E+03 -1.66151697E+03 + -1.60073901E+03 -1.59752197E+03 -1.59752197E+03 -1.65925305E+03 + -1.59752197E+03 -1.59430396E+03 -1.59430396E+03 -1.65698999E+03 + -1.59430396E+03 -1.59108704E+03 -1.59108704E+03 -1.65472595E+03 + -1.59108704E+03 -1.58620105E+03 -1.58620105E+03 -1.64995203E+03 + -1.58620105E+03 -1.58131604E+03 -1.58131604E+03 -1.64517700E+03 + -1.58131604E+03 -1.57643005E+03 -1.57643005E+03 -1.64040198E+03 + -1.57643005E+03 -1.57154395E+03 -1.57154395E+03 -1.63562695E+03 + -1.57154395E+03 -1.56665906E+03 -1.56665906E+03 -1.63085205E+03 + -1.56665906E+03 -1.67676904E+03 -1.61813599E+03 -1.68609302E+03 + -1.68609302E+03 -1.67435095E+03 -1.61587097E+03 -1.68377795E+03 + -1.68377795E+03 -1.67193201E+03 -1.61360596E+03 -1.68146204E+03 + -1.68146204E+03 -1.66951404E+03 -1.61134204E+03 -1.67914697E+03 + -1.67914697E+03 -1.66709497E+03 -1.60907703E+03 -1.67683203E+03 + -1.67683203E+03 -1.66423401E+03 -1.60573901E+03 -1.67389502E+03 + -1.67389502E+03 -1.66137305E+03 -1.60240002E+03 -1.67095801E+03 + -1.67095801E+03 -1.65851196E+03 -1.59906201E+03 -1.66802100E+03 + -1.66802100E+03 -1.65565100E+03 -1.59572400E+03 -1.66508398E+03 + -1.66508398E+03 -1.65279004E+03 -1.59238501E+03 -1.66214795E+03 + -1.66214795E+03 -1.64806604E+03 -1.58742004E+03 -1.65857300E+03 + -1.65857300E+03 -1.64334094E+03 -1.58245496E+03 -1.65499695E+03 + -1.65499695E+03 -1.63861694E+03 -1.57748901E+03 -1.65142200E+03 + -1.65142200E+03 -1.63389294E+03 -1.57252405E+03 -1.64784705E+03 + -1.64784705E+03 -1.62916895E+03 -1.56755896E+03 -1.64427197E+03 + -1.64427197E+03 -1.68463098E+03 -1.68240906E+03 -1.68018799E+03 + -1.67796594E+03 -1.67574500E+03 -1.67262598E+03 -1.66950806E+03 + -1.66639001E+03 -1.66327197E+03 -1.66015295E+03 -1.65635596E+03 + -1.65255896E+03 -1.64876196E+03 -1.64496497E+03 -1.64116797E+03 + -1.68341394E+03 -1.68119604E+03 -1.67897803E+03 -1.67676001E+03 + -1.67454199E+03 -1.67133997E+03 -1.66813794E+03 -1.66493604E+03 + -1.66173401E+03 -1.65853198E+03 -1.65421106E+03 -1.64989001E+03 + -1.64556799E+03 -1.64124695E+03 -1.63692603E+03 -1.68100098E+03 + -1.68100098E+03 -1.68100098E+03 -1.68100098E+03 -1.67876001E+03 + -1.67876001E+03 -1.67876001E+03 -1.67876001E+03 -1.67651904E+03 + -1.67651904E+03 -1.67651904E+03 -1.67651904E+03 -1.67427795E+03 + -1.67427795E+03 -1.67427795E+03 -1.67427795E+03 -1.67203699E+03 + -1.67203699E+03 -1.67203699E+03 -1.67203699E+03 -1.66883105E+03 + -1.66883105E+03 -1.66883105E+03 -1.66883105E+03 -1.66562500E+03 + -1.66562500E+03 -1.66562500E+03 -1.66562500E+03 -1.66241797E+03 + -1.66241797E+03 -1.66241797E+03 -1.66241797E+03 -1.65921204E+03 + -1.65921204E+03 -1.65921204E+03 -1.65921204E+03 -1.65600598E+03 + -1.65600598E+03 -1.65600598E+03 -1.65600598E+03 -1.65138196E+03 + -1.65138196E+03 -1.65138196E+03 -1.65138196E+03 -1.64675903E+03 + -1.64675903E+03 -1.64675903E+03 -1.64675903E+03 -1.64213501E+03 + -1.64213501E+03 -1.64213501E+03 -1.64213501E+03 -1.63751099E+03 + -1.63751099E+03 -1.63751099E+03 -1.63751099E+03 -1.63288696E+03 + -1.63288696E+03 -1.63288696E+03 -1.63288696E+03 -1.72727002E+03 + -1.72727002E+03 -1.69613403E+03 -1.72727002E+03 -1.72349805E+03 + -1.72349805E+03 -1.69394104E+03 -1.72349805E+03 -1.71972595E+03 + -1.71972595E+03 -1.69174902E+03 -1.71972595E+03 -1.71595398E+03 + -1.71595398E+03 -1.68955603E+03 -1.71595398E+03 -1.71218298E+03 + -1.71218298E+03 -1.68736401E+03 -1.71218298E+03 -1.70917200E+03 + -1.70917200E+03 -1.68428601E+03 -1.70917200E+03 -1.70616101E+03 + -1.70616101E+03 -1.68120801E+03 -1.70616101E+03 -1.70315002E+03 + -1.70315002E+03 -1.67813000E+03 -1.70315002E+03 -1.70013904E+03 + -1.70013904E+03 -1.67505200E+03 -1.70013904E+03 -1.69712805E+03 + -1.69712805E+03 -1.67197498E+03 -1.69712805E+03 -1.69337195E+03 + -1.69337195E+03 -1.66725403E+03 -1.69337195E+03 -1.68961694E+03 + -1.68961694E+03 -1.66253296E+03 -1.68961694E+03 -1.68586096E+03 + -1.68586096E+03 -1.65781201E+03 -1.68586096E+03 -1.68210498E+03 + -1.68210498E+03 -1.65309094E+03 -1.68210498E+03 -1.67834900E+03 + -1.67834900E+03 -1.64837000E+03 -1.67834900E+03 -1.68883105E+03 + -1.71869995E+03 -1.68883105E+03 -1.68883105E+03 -1.68665601E+03 + -1.71491199E+03 -1.68665601E+03 -1.68665601E+03 -1.68447998E+03 + -1.71112500E+03 -1.68447998E+03 -1.68447998E+03 -1.68230396E+03 + -1.70733704E+03 -1.68230396E+03 -1.68230396E+03 -1.68012903E+03 + -1.70355005E+03 -1.68012903E+03 -1.68012903E+03 -1.67708899E+03 + -1.70063696E+03 -1.67708899E+03 -1.67708899E+03 -1.67404895E+03 + -1.69772400E+03 -1.67404895E+03 -1.67404895E+03 -1.67100903E+03 + -1.69481006E+03 -1.67100903E+03 -1.67100903E+03 -1.66796899E+03 + -1.69189697E+03 -1.66796899E+03 -1.66796899E+03 -1.66493005E+03 + -1.68898401E+03 -1.66493005E+03 -1.66493005E+03 -1.66032397E+03 + -1.68482300E+03 -1.66032397E+03 -1.66032397E+03 -1.65571899E+03 + -1.68066199E+03 -1.65571899E+03 -1.65571899E+03 -1.65111401E+03 + -1.67650098E+03 -1.65111401E+03 -1.65111401E+03 -1.64650806E+03 + -1.67233997E+03 -1.64650806E+03 -1.64650806E+03 -1.64190295E+03 + -1.66817896E+03 -1.64190295E+03 -1.64190295E+03 -1.67925098E+03 + -1.67708801E+03 -1.67492395E+03 -1.67276001E+03 -1.67059595E+03 + -1.66748596E+03 -1.66437598E+03 -1.66126599E+03 -1.65815601E+03 + -1.65504602E+03 -1.65038696E+03 -1.64572803E+03 -1.64106897E+03 + -1.63641101E+03 -1.63175195E+03 -1.66546497E+03 -1.66328101E+03 + -1.66109802E+03 -1.65891394E+03 -1.65672998E+03 -1.65364197E+03 + -1.65055396E+03 -1.64746594E+03 -1.64437805E+03 -1.64129102E+03 + -1.63679700E+03 -1.63230505E+03 -1.62781201E+03 -1.62331799E+03 + -1.61882495E+03 -1.65385901E+03 -1.65170801E+03 -1.64955798E+03 + -1.64740796E+03 -1.64525806E+03 -1.64218506E+03 -1.63911304E+03 + -1.63604004E+03 -1.63296704E+03 -1.62989502E+03 -1.62529199E+03 + -1.62068994E+03 -1.61608801E+03 -1.61148596E+03 -1.60688403E+03 + -1.64865601E+03 -1.64649402E+03 -1.64433105E+03 -1.64216797E+03 + -1.64000500E+03 -1.63690405E+03 -1.63380298E+03 -1.63070203E+03 + -1.62760095E+03 -1.62449902E+03 -1.61956995E+03 -1.61464001E+03 + -1.60970996E+03 -1.60478101E+03 -1.59985095E+03 -1.64498804E+03 + -1.64282300E+03 -1.64065796E+03 -1.63849304E+03 -1.63632800E+03 + -1.63323596E+03 -1.63014502E+03 -1.62705298E+03 -1.62396204E+03 + -1.62087000E+03 -1.61582996E+03 -1.61079004E+03 -1.60575000E+03 + -1.60071106E+03 -1.59567102E+03 -1.64120605E+03 -1.63908997E+03 + -1.63697400E+03 -1.63485803E+03 -1.63274194E+03 -1.62965198E+03 + -1.62656201E+03 -1.62347205E+03 -1.62038196E+03 -1.61729199E+03 + -1.61226294E+03 -1.60723401E+03 -1.60220496E+03 -1.59717603E+03 + -1.59214697E+03 -1.63943396E+03 -1.63715405E+03 -1.63487305E+03 + -1.63259204E+03 -1.63031104E+03 -1.62715906E+03 -1.62400806E+03 + -1.62085596E+03 -1.61770496E+03 -1.61455298E+03 -1.60952698E+03 + -1.60450098E+03 -1.59947498E+03 -1.59444897E+03 -1.58942297E+03 + -1.64126404E+03 -1.63897498E+03 -1.63668604E+03 -1.63439697E+03 + -1.63210803E+03 -1.62884204E+03 -1.62557495E+03 -1.62230896E+03 + -1.61904199E+03 -1.61577600E+03 -1.61063000E+03 -1.60548499E+03 + -1.60033997E+03 -1.59519495E+03 -1.59004895E+03 -1.64543103E+03 + -1.64318896E+03 -1.64094702E+03 -1.63870496E+03 -1.63646301E+03 + -1.63318005E+03 -1.62989697E+03 -1.62661499E+03 -1.62333203E+03 + -1.62005005E+03 -1.61481104E+03 -1.60957104E+03 -1.60433203E+03 + -1.59909302E+03 -1.59385400E+03 -1.65092102E+03 -1.64876599E+03 + -1.64661096E+03 -1.64445605E+03 -1.64230103E+03 -1.63909900E+03 + -1.63589697E+03 -1.63269604E+03 -1.62949402E+03 -1.62629297E+03 + -1.62114697E+03 -1.61600098E+03 -1.61085498E+03 -1.60570898E+03 + -1.60056299E+03 -1.65351294E+03 -1.65128198E+03 -1.64905103E+03 + -1.64681995E+03 -1.64458899E+03 -1.64134497E+03 -1.63810095E+03 + -1.63485596E+03 -1.63161206E+03 -1.62836804E+03 -1.62342505E+03 + -1.61848206E+03 -1.61353796E+03 -1.60859497E+03 -1.60365198E+03 + -1.65334802E+03 -1.65103198E+03 -1.64871594E+03 -1.64640002E+03 + -1.64408398E+03 -1.64076501E+03 -1.63744604E+03 -1.63412598E+03 + -1.63080701E+03 -1.62748804E+03 -1.62250598E+03 -1.61752502E+03 + -1.61254395E+03 -1.60756201E+03 -1.60258105E+03 -1.65119495E+03 + -1.64873596E+03 -1.64627698E+03 -1.64381799E+03 -1.64135901E+03 + -1.63783899E+03 -1.63432104E+03 -1.63080200E+03 -1.62728198E+03 + -1.62376404E+03 -1.61850403E+03 -1.61324500E+03 -1.60798596E+03 + -1.60272705E+03 -1.59746802E+03 -1.64590906E+03 -1.64330603E+03 + -1.64070300E+03 -1.63810095E+03 -1.63549805E+03 -1.63181396E+03 + -1.62813098E+03 -1.62444800E+03 -1.62076404E+03 -1.61708105E+03 + -1.61164404E+03 -1.60620605E+03 -1.60076904E+03 -1.59533105E+03 + -1.58989404E+03 -1.64130603E+03 -1.63862097E+03 -1.63593701E+03 + -1.63325195E+03 -1.63056799E+03 -1.62679700E+03 -1.62302698E+03 + -1.61925696E+03 -1.61548804E+03 -1.61171802E+03 -1.60617395E+03 + -1.60063098E+03 -1.59508801E+03 -1.58954504E+03 -1.58400195E+03 + -1.63644202E+03 -1.63374097E+03 -1.63104102E+03 -1.62833997E+03 + -1.62563904E+03 -1.62188196E+03 -1.61812500E+03 -1.61436694E+03 + -1.61060999E+03 -1.60685303E+03 -1.60140601E+03 -1.59595898E+03 + -1.59051294E+03 -1.58506604E+03 -1.57961902E+03 -1.62979504E+03 + -1.62718298E+03 -1.62457202E+03 -1.62196106E+03 -1.61934900E+03 + -1.61570703E+03 -1.61206494E+03 -1.60842200E+03 -1.60478003E+03 + -1.60113794E+03 -1.59585901E+03 -1.59058105E+03 -1.58530200E+03 + -1.58002295E+03 -1.57474500E+03 -1.62271594E+03 -1.62021106E+03 + -1.61770605E+03 -1.61519995E+03 -1.61269495E+03 -1.60927600E+03 + -1.60585706E+03 -1.60243799E+03 -1.59901904E+03 -1.59559900E+03 + -1.59074695E+03 -1.58589404E+03 -1.58104102E+03 -1.57618799E+03 + -1.57133496E+03 -1.62676404E+03 -1.62676404E+03 -1.68783606E+03 + -1.62676404E+03 -1.62427100E+03 -1.62427100E+03 -1.68466296E+03 + -1.62427100E+03 -1.62177795E+03 -1.62177795E+03 -1.68149097E+03 + -1.62177795E+03 -1.61928503E+03 -1.61928503E+03 -1.67831897E+03 + -1.61928503E+03 -1.61679297E+03 -1.61679297E+03 -1.67514697E+03 + -1.61679297E+03 -1.61329797E+03 -1.61329797E+03 -1.67267798E+03 + -1.61329797E+03 -1.60980396E+03 -1.60980396E+03 -1.67020898E+03 + -1.60980396E+03 -1.60631006E+03 -1.60631006E+03 -1.66773999E+03 + -1.60631006E+03 -1.60281604E+03 -1.60281604E+03 -1.66527197E+03 + -1.60281604E+03 -1.59932202E+03 -1.59932202E+03 -1.66280298E+03 + -1.59932202E+03 -1.59423596E+03 -1.59423596E+03 -1.65868396E+03 + -1.59423596E+03 -1.58915100E+03 -1.58915100E+03 -1.65456494E+03 + -1.58915100E+03 -1.58406494E+03 -1.58406494E+03 -1.65044702E+03 + -1.58406494E+03 -1.57897998E+03 -1.57897998E+03 -1.64632800E+03 + -1.57897998E+03 -1.57389404E+03 -1.57389404E+03 -1.64220898E+03 + -1.57389404E+03 -1.68279199E+03 -1.63195398E+03 -1.68279199E+03 + -1.68279199E+03 -1.68046997E+03 -1.62959497E+03 -1.68046997E+03 + -1.68046997E+03 -1.67814795E+03 -1.62723706E+03 -1.67814795E+03 + -1.67814795E+03 -1.67582605E+03 -1.62487805E+03 -1.67582605E+03 + -1.67582605E+03 -1.67350403E+03 -1.62251904E+03 -1.67350403E+03 + -1.67350403E+03 -1.67034595E+03 -1.61898596E+03 -1.67034595E+03 + -1.67034595E+03 -1.66718896E+03 -1.61545398E+03 -1.66718896E+03 + -1.66718896E+03 -1.66403101E+03 -1.61192102E+03 -1.66403101E+03 + -1.66403101E+03 -1.66087402E+03 -1.60838794E+03 -1.66087402E+03 + -1.66087402E+03 -1.65771594E+03 -1.60485498E+03 -1.65771594E+03 + -1.65771594E+03 -1.65344397E+03 -1.59959302E+03 -1.65344397E+03 + -1.65344397E+03 -1.64917200E+03 -1.59433105E+03 -1.64917200E+03 + -1.64917200E+03 -1.64490100E+03 -1.58906897E+03 -1.64490100E+03 + -1.64490100E+03 -1.64062903E+03 -1.58380701E+03 -1.64062903E+03 + -1.64062903E+03 -1.63635706E+03 -1.57854504E+03 -1.63635706E+03 + -1.63635706E+03 -1.68283301E+03 -1.68049597E+03 -1.67816003E+03 + -1.67582300E+03 -1.67348596E+03 -1.67021899E+03 -1.66695105E+03 + -1.66368396E+03 -1.66041699E+03 -1.65714905E+03 -1.65247998E+03 + -1.64781201E+03 -1.64314294E+03 -1.63847400E+03 -1.63380505E+03 + -1.68252197E+03 -1.68252197E+03 -1.68252197E+03 -1.68252197E+03 + -1.68015198E+03 -1.68015198E+03 -1.68015198E+03 -1.68015198E+03 + -1.67778101E+03 -1.67778101E+03 -1.67778101E+03 -1.67778101E+03 + -1.67541101E+03 -1.67541101E+03 -1.67541101E+03 -1.67541101E+03 + -1.67304102E+03 -1.67304102E+03 -1.67304102E+03 -1.67304102E+03 + -1.66971802E+03 -1.66971802E+03 -1.66971802E+03 -1.66971802E+03 + -1.66639404E+03 -1.66639404E+03 -1.66639404E+03 -1.66639404E+03 + -1.66306995E+03 -1.66306995E+03 -1.66306995E+03 -1.66306995E+03 + -1.65974695E+03 -1.65974695E+03 -1.65974695E+03 -1.65974695E+03 + -1.65642297E+03 -1.65642297E+03 -1.65642297E+03 -1.65642297E+03 + -1.65159399E+03 -1.65159399E+03 -1.65159399E+03 -1.65159399E+03 + -1.64676501E+03 -1.64676501E+03 -1.64676501E+03 -1.64676501E+03 + -1.64193506E+03 -1.64193506E+03 -1.64193506E+03 -1.64193506E+03 + -1.63710596E+03 -1.63710596E+03 -1.63710596E+03 -1.63710596E+03 + -1.63227698E+03 -1.63227698E+03 -1.63227698E+03 -1.63227698E+03 + -1.73184302E+03 -1.73184302E+03 -1.73184302E+03 -1.73184302E+03 + -1.72919604E+03 -1.72919604E+03 -1.72919604E+03 -1.72919604E+03 + -1.72654895E+03 -1.72654895E+03 -1.72654895E+03 -1.72654895E+03 + -1.72390295E+03 -1.72390295E+03 -1.72390295E+03 -1.72390295E+03 + -1.72125598E+03 -1.72125598E+03 -1.72125598E+03 -1.72125598E+03 + -1.71820300E+03 -1.71820300E+03 -1.71820300E+03 -1.71820300E+03 + -1.71515002E+03 -1.71515002E+03 -1.71515002E+03 -1.71515002E+03 + -1.71209705E+03 -1.71209705E+03 -1.71209705E+03 -1.71209705E+03 + -1.70904297E+03 -1.70904297E+03 -1.70904297E+03 -1.70904297E+03 + -1.70598999E+03 -1.70598999E+03 -1.70598999E+03 -1.70598999E+03 + -1.70212000E+03 -1.70212000E+03 -1.70212000E+03 -1.70212000E+03 + -1.69825000E+03 -1.69825000E+03 -1.69825000E+03 -1.69825000E+03 + -1.69438000E+03 -1.69438000E+03 -1.69438000E+03 -1.69438000E+03 + -1.69051001E+03 -1.69051001E+03 -1.69051001E+03 -1.69051001E+03 + -1.68664001E+03 -1.68664001E+03 -1.68664001E+03 -1.68664001E+03 + -1.72247595E+03 -1.72247595E+03 -1.69018201E+03 -1.72247595E+03 + -1.71966504E+03 -1.71966504E+03 -1.68799695E+03 -1.71966504E+03 + -1.71685303E+03 -1.71685303E+03 -1.68581201E+03 -1.71685303E+03 + -1.71404199E+03 -1.71404199E+03 -1.68362695E+03 -1.71404199E+03 + -1.71123096E+03 -1.71123096E+03 -1.68144202E+03 -1.71123096E+03 + -1.70844397E+03 -1.70844397E+03 -1.67832495E+03 -1.70844397E+03 + -1.70565796E+03 -1.70565796E+03 -1.67520801E+03 -1.70565796E+03 + -1.70287195E+03 -1.70287195E+03 -1.67209094E+03 -1.70287195E+03 + -1.70008606E+03 -1.70008606E+03 -1.66897400E+03 -1.70008606E+03 + -1.69729895E+03 -1.69729895E+03 -1.66585706E+03 -1.69729895E+03 + -1.69277100E+03 -1.69277100E+03 -1.66106799E+03 -1.69277100E+03 + -1.68824194E+03 -1.68824194E+03 -1.65628003E+03 -1.68824194E+03 + -1.68371301E+03 -1.68371301E+03 -1.65149194E+03 -1.68371301E+03 + -1.67918396E+03 -1.67918396E+03 -1.64670300E+03 -1.67918396E+03 + -1.67465503E+03 -1.67465503E+03 -1.64191504E+03 -1.67465503E+03 + -1.68006299E+03 -1.71428601E+03 -1.68006299E+03 -1.71428601E+03 + -1.67786401E+03 -1.71139001E+03 -1.67786401E+03 -1.71139001E+03 + -1.67566394E+03 -1.70849500E+03 -1.67566394E+03 -1.70849500E+03 + -1.67346497E+03 -1.70559900E+03 -1.67346497E+03 -1.70559900E+03 + -1.67126599E+03 -1.70270398E+03 -1.67126599E+03 -1.70270398E+03 + -1.66809595E+03 -1.69978796E+03 -1.66809595E+03 -1.69978796E+03 + -1.66492700E+03 -1.69687195E+03 -1.66492700E+03 -1.69687195E+03 + -1.66175696E+03 -1.69395496E+03 -1.66175696E+03 -1.69395496E+03 + -1.65858704E+03 -1.69103894E+03 -1.65858704E+03 -1.69103894E+03 + -1.65541699E+03 -1.68812305E+03 -1.65541699E+03 -1.68812305E+03 + -1.65065405E+03 -1.68351294E+03 -1.65065405E+03 -1.68351294E+03 + -1.64589197E+03 -1.67890295E+03 -1.64589197E+03 -1.67890295E+03 + -1.64112903E+03 -1.67429297E+03 -1.64112903E+03 -1.67429297E+03 + -1.63636597E+03 -1.66968201E+03 -1.63636597E+03 -1.66968201E+03 + -1.63160303E+03 -1.66507202E+03 -1.63160303E+03 -1.66507202E+03 + -1.66829297E+03 -1.70778503E+03 -1.66829297E+03 -1.70778503E+03 + -1.66604102E+03 -1.70487903E+03 -1.66604102E+03 -1.70487903E+03 + -1.66378894E+03 -1.70197205E+03 -1.66378894E+03 -1.70197205E+03 + -1.66153601E+03 -1.69906604E+03 -1.66153601E+03 -1.69906604E+03 + -1.65928406E+03 -1.69615906E+03 -1.65928406E+03 -1.69615906E+03 + -1.65602600E+03 -1.69311304E+03 -1.65602600E+03 -1.69311304E+03 + -1.65276794E+03 -1.69006604E+03 -1.65276794E+03 -1.69006604E+03 + -1.64951001E+03 -1.68702002E+03 -1.64951001E+03 -1.68702002E+03 + -1.64625098E+03 -1.68397302E+03 -1.64625098E+03 -1.68397302E+03 + -1.64299304E+03 -1.68092700E+03 -1.64299304E+03 -1.68092700E+03 + -1.63837903E+03 -1.67622998E+03 -1.63837903E+03 -1.67622998E+03 + -1.63376501E+03 -1.67153198E+03 -1.63376501E+03 -1.67153198E+03 + -1.62915100E+03 -1.66683496E+03 -1.62915100E+03 -1.66683496E+03 + -1.62453699E+03 -1.66213794E+03 -1.62453699E+03 -1.66213794E+03 + -1.61992297E+03 -1.65744104E+03 -1.61992297E+03 -1.65744104E+03 + -1.65788904E+03 -1.70322205E+03 -1.65788904E+03 -1.70322205E+03 + -1.65563306E+03 -1.70034204E+03 -1.65563306E+03 -1.70034204E+03 + -1.65337695E+03 -1.69746204E+03 -1.65337695E+03 -1.69746204E+03 + -1.65112097E+03 -1.69458301E+03 -1.65112097E+03 -1.69458301E+03 + -1.64886597E+03 -1.69170300E+03 -1.64886597E+03 -1.69170300E+03 + -1.64560498E+03 -1.68860706E+03 -1.64560498E+03 -1.68860706E+03 + -1.64234399E+03 -1.68551001E+03 -1.64234399E+03 -1.68551001E+03 + -1.63908301E+03 -1.68241394E+03 -1.63908301E+03 -1.68241394E+03 + -1.63582202E+03 -1.67931799E+03 -1.63582202E+03 -1.67931799E+03 + -1.63256104E+03 -1.67622205E+03 -1.63256104E+03 -1.67622205E+03 + -1.62788794E+03 -1.67150500E+03 -1.62788794E+03 -1.67150500E+03 + -1.62321399E+03 -1.66678796E+03 -1.62321399E+03 -1.66678796E+03 + -1.61854102E+03 -1.66207104E+03 -1.61854102E+03 -1.66207104E+03 + -1.61386804E+03 -1.65735498E+03 -1.61386804E+03 -1.65735498E+03 + -1.60919397E+03 -1.65263794E+03 -1.60919397E+03 -1.65263794E+03 + -1.65155200E+03 -1.70051794E+03 -1.65155200E+03 -1.65155200E+03 + -1.64931104E+03 -1.69774597E+03 -1.64931104E+03 -1.64931104E+03 + -1.64706995E+03 -1.69497302E+03 -1.64706995E+03 -1.64706995E+03 + -1.64482898E+03 -1.69220105E+03 -1.64482898E+03 -1.64482898E+03 + -1.64258801E+03 -1.68942896E+03 -1.64258801E+03 -1.64258801E+03 + -1.63937097E+03 -1.68633606E+03 -1.63937097E+03 -1.63937097E+03 + -1.63615295E+03 -1.68324304E+03 -1.63615295E+03 -1.63615295E+03 + -1.63293604E+03 -1.68015002E+03 -1.63293604E+03 -1.63293604E+03 + -1.62971802E+03 -1.67705701E+03 -1.62971802E+03 -1.62971802E+03 + -1.62650000E+03 -1.67396399E+03 -1.62650000E+03 -1.62650000E+03 + -1.62151001E+03 -1.66916296E+03 -1.62151001E+03 -1.62151001E+03 + -1.61652002E+03 -1.66436096E+03 -1.61652002E+03 -1.61652002E+03 + -1.61152905E+03 -1.65955896E+03 -1.61152905E+03 -1.61152905E+03 + -1.60653894E+03 -1.65475806E+03 -1.60653894E+03 -1.60653894E+03 + -1.60154797E+03 -1.64995605E+03 -1.60154797E+03 -1.60154797E+03 + -1.64687695E+03 -1.64464600E+03 -1.64241504E+03 -1.64018506E+03 + -1.63795398E+03 -1.63478406E+03 -1.63161304E+03 -1.62844299E+03 + -1.62527197E+03 -1.62210205E+03 -1.61696497E+03 -1.61182800E+03 + -1.60669104E+03 -1.60155396E+03 -1.59641699E+03 -1.64352600E+03 + -1.64127905E+03 -1.63903198E+03 -1.63678503E+03 -1.63453796E+03 + -1.63140698E+03 -1.62827698E+03 -1.62514600E+03 -1.62201501E+03 + -1.61888403E+03 -1.61377100E+03 -1.60865796E+03 -1.60354395E+03 + -1.59843103E+03 -1.59331799E+03 -1.64287598E+03 -1.64063403E+03 + -1.63839197E+03 -1.63614905E+03 -1.63390698E+03 -1.63070703E+03 + -1.62750696E+03 -1.62430701E+03 -1.62110706E+03 -1.61790698E+03 + -1.61279895E+03 -1.60768994E+03 -1.60258203E+03 -1.59747302E+03 + -1.59236499E+03 -1.64612402E+03 -1.64387195E+03 -1.64162000E+03 + -1.63936804E+03 -1.63711597E+03 -1.63386304E+03 -1.63061096E+03 + -1.62735803E+03 -1.62410498E+03 -1.62085205E+03 -1.61577197E+03 + -1.61069202E+03 -1.60561206E+03 -1.60053198E+03 -1.59545203E+03 + -1.65003796E+03 -1.64771301E+03 -1.64538794E+03 -1.64306299E+03 + -1.64073804E+03 -1.63729004E+03 -1.63384094E+03 -1.63039294E+03 + -1.62694495E+03 -1.62349695E+03 -1.61859302E+03 -1.61368994E+03 + -1.60878601E+03 -1.60388196E+03 -1.59897900E+03 -1.65378101E+03 + -1.65144702E+03 -1.64911401E+03 -1.64678003E+03 -1.64444604E+03 + -1.64106702E+03 -1.63768799E+03 -1.63431006E+03 -1.63093103E+03 + -1.62755200E+03 -1.62274902E+03 -1.61794604E+03 -1.61314404E+03 + -1.60834094E+03 -1.60353796E+03 -1.65669995E+03 -1.65439697E+03 + -1.65209399E+03 -1.64979004E+03 -1.64748706E+03 -1.64418994E+03 + -1.64089197E+03 -1.63759497E+03 -1.63429797E+03 -1.63100098E+03 + -1.62609302E+03 -1.62118604E+03 -1.61627795E+03 -1.61137097E+03 + -1.60646301E+03 -1.65820300E+03 -1.65587500E+03 -1.65354700E+03 + -1.65121899E+03 -1.64889099E+03 -1.64555603E+03 -1.64222205E+03 + -1.63888696E+03 -1.63555200E+03 -1.63221802E+03 -1.62729395E+03 + -1.62237000E+03 -1.61744702E+03 -1.61252295E+03 -1.60759900E+03 + -1.65889294E+03 -1.65652002E+03 -1.65414795E+03 -1.65177600E+03 + -1.64940295E+03 -1.64601001E+03 -1.64261694E+03 -1.63922498E+03 + -1.63583203E+03 -1.63243896E+03 -1.62740601E+03 -1.62237305E+03 + -1.61733997E+03 -1.61230798E+03 -1.60727502E+03 -1.65959595E+03 + -1.65712805E+03 -1.65465906E+03 -1.65219104E+03 -1.64972302E+03 + -1.64616003E+03 -1.64259705E+03 -1.63903503E+03 -1.63547205E+03 + -1.63190906E+03 -1.62669702E+03 -1.62148499E+03 -1.61627405E+03 + -1.61106201E+03 -1.60584998E+03 -1.65899402E+03 -1.65646399E+03 + -1.65393396E+03 -1.65140503E+03 -1.64887500E+03 -1.64525903E+03 + -1.64164294E+03 -1.63802795E+03 -1.63441199E+03 -1.63079700E+03 + -1.62541199E+03 -1.62002698E+03 -1.61464294E+03 -1.60925806E+03 + -1.60387402E+03 -1.65701404E+03 -1.65440002E+03 -1.65178601E+03 + -1.64917200E+03 -1.64655701E+03 -1.64284204E+03 -1.63912598E+03 + -1.63541101E+03 -1.63169604E+03 -1.62797998E+03 -1.62246899E+03 + -1.61695703E+03 -1.61144604E+03 -1.60593396E+03 -1.60042297E+03 + -1.65242297E+03 -1.64974597E+03 -1.64706897E+03 -1.64439197E+03 + -1.64171497E+03 -1.63789197E+03 -1.63406897E+03 -1.63024597E+03 + -1.62642297E+03 -1.62259998E+03 -1.61696704E+03 -1.61133398E+03 + -1.60570105E+03 -1.60006799E+03 -1.59443506E+03 -1.64260400E+03 + -1.63992700E+03 -1.63724902E+03 -1.63457202E+03 -1.63189502E+03 + -1.62808899E+03 -1.62428296E+03 -1.62047705E+03 -1.61667102E+03 + -1.61286499E+03 -1.60730298E+03 -1.60174097E+03 -1.59618005E+03 + -1.59061804E+03 -1.58505701E+03 -1.63945203E+03 -1.63694202E+03 + -1.63443201E+03 -1.63192200E+03 -1.62941199E+03 -1.62585901E+03 + -1.62230603E+03 -1.61875305E+03 -1.61519995E+03 -1.61164697E+03 + -1.60642395E+03 -1.60120105E+03 -1.59597900E+03 -1.59075598E+03 + -1.58553296E+03 -1.64032703E+03 -1.64032703E+03 -1.68735095E+03 + -1.64032703E+03 -1.63789001E+03 -1.63789001E+03 -1.68427295E+03 + -1.63789001E+03 -1.63545300E+03 -1.63545300E+03 -1.68119495E+03 + -1.63545300E+03 -1.63301501E+03 -1.63301501E+03 -1.67811804E+03 + -1.63301501E+03 -1.63057800E+03 -1.63057800E+03 -1.67504004E+03 + -1.63057800E+03 -1.62714099E+03 -1.62714099E+03 -1.67238794E+03 + -1.62714099E+03 -1.62370398E+03 -1.62370398E+03 -1.66973706E+03 + -1.62370398E+03 -1.62026697E+03 -1.62026697E+03 -1.66708496E+03 + -1.62026697E+03 -1.61682996E+03 -1.61682996E+03 -1.66443396E+03 + -1.61682996E+03 -1.61339294E+03 -1.61339294E+03 -1.66178198E+03 + -1.61339294E+03 -1.60837000E+03 -1.60837000E+03 -1.65724805E+03 + -1.60837000E+03 -1.60334705E+03 -1.60334705E+03 -1.65271301E+03 + -1.60334705E+03 -1.59832397E+03 -1.59832397E+03 -1.64817798E+03 + -1.59832397E+03 -1.59330103E+03 -1.59330103E+03 -1.64364294E+03 + -1.59330103E+03 -1.58827795E+03 -1.58827795E+03 -1.63910901E+03 + -1.58827795E+03 -1.68323804E+03 -1.64353003E+03 -1.68323804E+03 + -1.68323804E+03 -1.68064905E+03 -1.64119800E+03 -1.68064905E+03 + -1.68064905E+03 -1.67806104E+03 -1.63886694E+03 -1.67806104E+03 + -1.67806104E+03 -1.67547205E+03 -1.63653503E+03 -1.67547205E+03 + -1.67547205E+03 -1.67288403E+03 -1.63420300E+03 -1.67288403E+03 + -1.67288403E+03 -1.66973804E+03 -1.63069897E+03 -1.66973804E+03 + -1.66973804E+03 -1.66659204E+03 -1.62719397E+03 -1.66659204E+03 + -1.66659204E+03 -1.66344604E+03 -1.62368994E+03 -1.66344604E+03 + -1.66344604E+03 -1.66030005E+03 -1.62018506E+03 -1.66030005E+03 + -1.66030005E+03 -1.65715405E+03 -1.61668005E+03 -1.65715405E+03 + -1.65715405E+03 -1.65241895E+03 -1.61152698E+03 -1.65241895E+03 + -1.65241895E+03 -1.64768396E+03 -1.60637402E+03 -1.64768396E+03 + -1.64768396E+03 -1.64294897E+03 -1.60122205E+03 -1.64294897E+03 + -1.64294897E+03 -1.63821399E+03 -1.59606897E+03 -1.63821399E+03 + -1.63821399E+03 -1.63347900E+03 -1.59091602E+03 -1.63347900E+03 + -1.63347900E+03 -1.68340796E+03 -1.68340796E+03 -1.68340796E+03 + -1.68340796E+03 -1.68100806E+03 -1.68100806E+03 -1.68100806E+03 + -1.68100806E+03 -1.67860706E+03 -1.67860706E+03 -1.67860706E+03 + -1.67860706E+03 -1.67620703E+03 -1.67620703E+03 -1.67620703E+03 + -1.67620703E+03 -1.67380603E+03 -1.67380603E+03 -1.67380603E+03 + -1.67380603E+03 -1.67044104E+03 -1.67044104E+03 -1.67044104E+03 + -1.67044104E+03 -1.66707703E+03 -1.66707703E+03 -1.66707703E+03 + -1.66707703E+03 -1.66371204E+03 -1.66371204E+03 -1.66371204E+03 + -1.66371204E+03 -1.66034705E+03 -1.66034705E+03 -1.66034705E+03 + -1.66034705E+03 -1.65698206E+03 -1.65698206E+03 -1.65698206E+03 + -1.65698206E+03 -1.65212097E+03 -1.65212097E+03 -1.65212097E+03 + -1.65212097E+03 -1.64725903E+03 -1.64725903E+03 -1.64725903E+03 + -1.64725903E+03 -1.64239795E+03 -1.64239795E+03 -1.64239795E+03 + -1.64239795E+03 -1.63753601E+03 -1.63753601E+03 -1.63753601E+03 + -1.63753601E+03 -1.63267505E+03 -1.63267505E+03 -1.63267505E+03 + -1.63267505E+03 -1.73046899E+03 -1.73046899E+03 -1.73046899E+03 + -1.73046899E+03 -1.72835596E+03 -1.72835596E+03 -1.72835596E+03 + -1.72835596E+03 -1.72624304E+03 -1.72624304E+03 -1.72624304E+03 + -1.72624304E+03 -1.72413000E+03 -1.72413000E+03 -1.72413000E+03 + -1.72413000E+03 -1.72201697E+03 -1.72201697E+03 -1.72201697E+03 + -1.72201697E+03 -1.71900000E+03 -1.71900000E+03 -1.71900000E+03 + -1.71900000E+03 -1.71598303E+03 -1.71598303E+03 -1.71598303E+03 + -1.71598303E+03 -1.71296594E+03 -1.71296594E+03 -1.71296594E+03 + -1.71296594E+03 -1.70994897E+03 -1.70994897E+03 -1.70994897E+03 + -1.70994897E+03 -1.70693201E+03 -1.70693201E+03 -1.70693201E+03 + -1.70693201E+03 -1.70256396E+03 -1.70256396E+03 -1.70256396E+03 + -1.70256396E+03 -1.69819604E+03 -1.69819604E+03 -1.69819604E+03 + -1.69819604E+03 -1.69382800E+03 -1.69382800E+03 -1.69382800E+03 + -1.69382800E+03 -1.68945996E+03 -1.68945996E+03 -1.68945996E+03 + -1.68945996E+03 -1.68509302E+03 -1.68509302E+03 -1.68509302E+03 + -1.68509302E+03 -1.72324402E+03 -1.72104504E+03 -1.71884705E+03 + -1.71664905E+03 -1.71444995E+03 -1.71141504E+03 -1.70838000E+03 + -1.70534595E+03 -1.70231104E+03 -1.69927600E+03 -1.69461499E+03 + -1.68995398E+03 -1.68529297E+03 -1.68063306E+03 -1.67597205E+03 + -1.71526697E+03 -1.71294202E+03 -1.71061694E+03 -1.70829199E+03 + -1.70596704E+03 -1.70280798E+03 -1.69964795E+03 -1.69648901E+03 + -1.69332996E+03 -1.69017004E+03 -1.68560095E+03 -1.68103198E+03 + -1.67646301E+03 -1.67189404E+03 -1.66732397E+03 -1.70880005E+03 + -1.70646301E+03 -1.70412500E+03 -1.70178699E+03 -1.69944897E+03 + -1.69624402E+03 -1.69303796E+03 -1.68983301E+03 -1.68662695E+03 + -1.68342200E+03 -1.67860999E+03 -1.67379895E+03 -1.66898804E+03 + -1.66417700E+03 -1.65936597E+03 -1.70461499E+03 -1.70223401E+03 + -1.69985400E+03 -1.69747302E+03 -1.69509302E+03 -1.69183398E+03 + -1.68857605E+03 -1.68531702E+03 -1.68205896E+03 -1.67880005E+03 + -1.67405896E+03 -1.66931799E+03 -1.66457605E+03 -1.65983496E+03 + -1.65509302E+03 -1.70210803E+03 -1.70210803E+03 -1.65676697E+03 + -1.70210803E+03 -1.69973706E+03 -1.69973706E+03 -1.65448706E+03 + -1.69973706E+03 -1.69736597E+03 -1.69736597E+03 -1.65220801E+03 + -1.69736597E+03 -1.69499500E+03 -1.69499500E+03 -1.64992798E+03 + -1.69499500E+03 -1.69262402E+03 -1.69262402E+03 -1.64764905E+03 + -1.69262402E+03 -1.68945801E+03 -1.68945801E+03 -1.64436499E+03 + -1.68945801E+03 -1.68629102E+03 -1.68629102E+03 -1.64108203E+03 + -1.68629102E+03 -1.68312500E+03 -1.68312500E+03 -1.63779895E+03 + -1.68312500E+03 -1.67995898E+03 -1.67995898E+03 -1.63451599E+03 + -1.67995898E+03 -1.67679199E+03 -1.67679199E+03 -1.63123303E+03 + -1.67679199E+03 -1.67198401E+03 -1.67198401E+03 -1.62623303E+03 + -1.67198401E+03 -1.66717505E+03 -1.66717505E+03 -1.62123206E+03 + -1.66717505E+03 -1.66236694E+03 -1.66236694E+03 -1.61623206E+03 + -1.66236694E+03 -1.65755798E+03 -1.65755798E+03 -1.61123096E+03 + -1.65755798E+03 -1.65274902E+03 -1.65274902E+03 -1.60622998E+03 + -1.65274902E+03 -1.65160303E+03 -1.70137695E+03 -1.65160303E+03 + -1.70137695E+03 -1.64932300E+03 -1.69909705E+03 -1.64932300E+03 + -1.69909705E+03 -1.64704297E+03 -1.69681799E+03 -1.64704297E+03 + -1.69681799E+03 -1.64476294E+03 -1.69453796E+03 -1.64476294E+03 + -1.69453796E+03 -1.64248206E+03 -1.69225903E+03 -1.64248206E+03 + -1.69225903E+03 -1.63926697E+03 -1.68908496E+03 -1.63926697E+03 + -1.68908496E+03 -1.63605200E+03 -1.68591101E+03 -1.63605200E+03 + -1.68591101E+03 -1.63283704E+03 -1.68273706E+03 -1.63283704E+03 + -1.68273706E+03 -1.62962195E+03 -1.67956299E+03 -1.62962195E+03 + -1.67956299E+03 -1.62640698E+03 -1.67638904E+03 -1.62640698E+03 + -1.67638904E+03 -1.62130396E+03 -1.67132605E+03 -1.62130396E+03 + -1.67132605E+03 -1.61620105E+03 -1.66626404E+03 -1.61620105E+03 + -1.66626404E+03 -1.61109900E+03 -1.66120105E+03 -1.61109900E+03 + -1.66120105E+03 -1.60599500E+03 -1.65613794E+03 -1.60599500E+03 + -1.65613794E+03 -1.60089197E+03 -1.65107495E+03 -1.60089197E+03 + -1.65107495E+03 -1.64845203E+03 -1.70284802E+03 -1.64845203E+03 + -1.70284802E+03 -1.64616797E+03 -1.70060498E+03 -1.64616797E+03 + -1.70060498E+03 -1.64388403E+03 -1.69836096E+03 -1.64388403E+03 + -1.69836096E+03 -1.64159998E+03 -1.69611804E+03 -1.64159998E+03 + -1.69611804E+03 -1.63931604E+03 -1.69387402E+03 -1.63931604E+03 + -1.69387402E+03 -1.63618701E+03 -1.69060901E+03 -1.63618701E+03 + -1.69060901E+03 -1.63305701E+03 -1.68734399E+03 -1.63305701E+03 + -1.68734399E+03 -1.62992798E+03 -1.68407898E+03 -1.62992798E+03 + -1.68407898E+03 -1.62679895E+03 -1.68081396E+03 -1.62679895E+03 + -1.68081396E+03 -1.62367004E+03 -1.67754895E+03 -1.62367004E+03 + -1.67754895E+03 -1.61852197E+03 -1.67229395E+03 -1.61852197E+03 + -1.67229395E+03 -1.61337500E+03 -1.66704004E+03 -1.61337500E+03 + -1.66704004E+03 -1.60822705E+03 -1.66178503E+03 -1.60822705E+03 + -1.66178503E+03 -1.60307898E+03 -1.65653101E+03 -1.60307898E+03 + -1.65653101E+03 -1.59793201E+03 -1.65127600E+03 -1.59793201E+03 + -1.65127600E+03 -1.64846399E+03 -1.70842395E+03 -1.64846399E+03 + -1.70842395E+03 -1.64619104E+03 -1.70603699E+03 -1.64619104E+03 + -1.70603699E+03 -1.64391797E+03 -1.70365002E+03 -1.64391797E+03 + -1.70365002E+03 -1.64164502E+03 -1.70126294E+03 -1.64164502E+03 + -1.70126294E+03 -1.63937195E+03 -1.69887598E+03 -1.63937195E+03 + -1.69887598E+03 -1.63621899E+03 -1.69527295E+03 -1.63621899E+03 + -1.69527295E+03 -1.63306494E+03 -1.69167004E+03 -1.63306494E+03 + -1.69167004E+03 -1.62991199E+03 -1.68806702E+03 -1.62991199E+03 + -1.68806702E+03 -1.62675903E+03 -1.68446399E+03 -1.62675903E+03 + -1.68446399E+03 -1.62360596E+03 -1.68086206E+03 -1.62360596E+03 + -1.68086206E+03 -1.61841296E+03 -1.67573499E+03 -1.61841296E+03 + -1.67573499E+03 -1.61321997E+03 -1.67060901E+03 -1.61321997E+03 + -1.67060901E+03 -1.60802698E+03 -1.66548206E+03 -1.60802698E+03 + -1.66548206E+03 -1.60283398E+03 -1.66035596E+03 -1.60283398E+03 + -1.66035596E+03 -1.59764197E+03 -1.65522900E+03 -1.59764197E+03 + -1.65522900E+03 -1.65152295E+03 -1.71687805E+03 -1.65152295E+03 + -1.71687805E+03 -1.64926099E+03 -1.71403894E+03 -1.64926099E+03 + -1.71403894E+03 -1.64699805E+03 -1.71119995E+03 -1.64699805E+03 + -1.71119995E+03 -1.64473596E+03 -1.70836206E+03 -1.64473596E+03 + -1.70836206E+03 -1.64247400E+03 -1.70552295E+03 -1.64247400E+03 + -1.70552295E+03 -1.63921704E+03 -1.70185706E+03 -1.63921704E+03 + -1.70185706E+03 -1.63595996E+03 -1.69819104E+03 -1.63595996E+03 + -1.69819104E+03 -1.63270300E+03 -1.69452502E+03 -1.63270300E+03 + -1.69452502E+03 -1.62944604E+03 -1.69085803E+03 -1.62944604E+03 + -1.69085803E+03 -1.62618994E+03 -1.68719202E+03 -1.62618994E+03 + -1.68719202E+03 -1.62103198E+03 -1.68204895E+03 -1.62103198E+03 + -1.68204895E+03 -1.61587500E+03 -1.67690698E+03 -1.61587500E+03 + -1.67690698E+03 -1.61071802E+03 -1.67176404E+03 -1.61071802E+03 + -1.67176404E+03 -1.60556104E+03 -1.66662097E+03 -1.60556104E+03 + -1.66662097E+03 -1.60040295E+03 -1.66147803E+03 -1.60040295E+03 + -1.66147803E+03 -1.65573096E+03 -1.72298706E+03 -1.65573096E+03 + -1.72298706E+03 -1.65345703E+03 -1.72051904E+03 -1.65345703E+03 + -1.72051904E+03 -1.65118201E+03 -1.71805005E+03 -1.65118201E+03 + -1.71805005E+03 -1.64890698E+03 -1.71558203E+03 -1.64890698E+03 + -1.71558203E+03 -1.64663196E+03 -1.71311304E+03 -1.64663196E+03 + -1.71311304E+03 -1.64313306E+03 -1.70941699E+03 -1.64313306E+03 + -1.70941699E+03 -1.63963403E+03 -1.70572095E+03 -1.63963403E+03 + -1.70572095E+03 -1.63613501E+03 -1.70202502E+03 -1.63613501E+03 + -1.70202502E+03 -1.63263501E+03 -1.69832898E+03 -1.63263501E+03 + -1.69832898E+03 -1.62913599E+03 -1.69463306E+03 -1.62913599E+03 + -1.69463306E+03 -1.62409802E+03 -1.68902295E+03 -1.62409802E+03 + -1.68902295E+03 -1.61906006E+03 -1.68341394E+03 -1.61906006E+03 + -1.68341394E+03 -1.61402100E+03 -1.67780396E+03 -1.61402100E+03 + -1.67780396E+03 -1.60898303E+03 -1.67219495E+03 -1.60898303E+03 + -1.67219495E+03 -1.60394495E+03 -1.66658496E+03 -1.60394495E+03 + -1.66658496E+03 -1.65947205E+03 -1.72621997E+03 -1.65947205E+03 + -1.72621997E+03 -1.65718005E+03 -1.72414697E+03 -1.65718005E+03 + -1.72414697E+03 -1.65488794E+03 -1.72207397E+03 -1.65488794E+03 + -1.72207397E+03 -1.65259595E+03 -1.72000195E+03 -1.65259595E+03 + -1.72000195E+03 -1.65030298E+03 -1.71792896E+03 -1.65030298E+03 + -1.71792896E+03 -1.64684094E+03 -1.71399500E+03 -1.64684094E+03 + -1.71399500E+03 -1.64338000E+03 -1.71006201E+03 -1.64338000E+03 + -1.71006201E+03 -1.63991797E+03 -1.70612805E+03 -1.63991797E+03 + -1.70612805E+03 -1.63645605E+03 -1.70219397E+03 -1.63645605E+03 + -1.70219397E+03 -1.63299402E+03 -1.69826001E+03 -1.63299402E+03 + -1.69826001E+03 -1.62807605E+03 -1.69262598E+03 -1.62807605E+03 + -1.69262598E+03 -1.62315796E+03 -1.68699194E+03 -1.62315796E+03 + -1.68699194E+03 -1.61823999E+03 -1.68135803E+03 -1.61823999E+03 + -1.68135803E+03 -1.61332202E+03 -1.67572400E+03 -1.61332202E+03 + -1.67572400E+03 -1.60840405E+03 -1.67008997E+03 -1.60840405E+03 + -1.67008997E+03 -1.66197900E+03 -1.72530603E+03 -1.66197900E+03 + -1.66197900E+03 -1.65968103E+03 -1.72339099E+03 -1.65968103E+03 + -1.65968103E+03 -1.65738196E+03 -1.72147705E+03 -1.65738196E+03 + -1.65738196E+03 -1.65508398E+03 -1.71956201E+03 -1.65508398E+03 + -1.65508398E+03 -1.65278601E+03 -1.71764795E+03 -1.65278601E+03 + -1.65278601E+03 -1.64949695E+03 -1.71359399E+03 -1.64949695E+03 + -1.64949695E+03 -1.64620801E+03 -1.70954102E+03 -1.64620801E+03 + -1.64620801E+03 -1.64292004E+03 -1.70548706E+03 -1.64292004E+03 + -1.64292004E+03 -1.63963098E+03 -1.70143396E+03 -1.63963098E+03 + -1.63963098E+03 -1.63634302E+03 -1.69738000E+03 -1.63634302E+03 + -1.63634302E+03 -1.63135303E+03 -1.69188696E+03 -1.63135303E+03 + -1.63135303E+03 -1.62636304E+03 -1.68639294E+03 -1.62636304E+03 + -1.62636304E+03 -1.62137402E+03 -1.68089905E+03 -1.62137402E+03 + -1.62137402E+03 -1.61638403E+03 -1.67540601E+03 -1.61638403E+03 + -1.61638403E+03 -1.61139404E+03 -1.66991199E+03 -1.61139404E+03 + -1.61139404E+03 -1.66394604E+03 -1.66162903E+03 -1.65931201E+03 + -1.65699500E+03 -1.65467798E+03 -1.65142700E+03 -1.64817603E+03 + -1.64492505E+03 -1.64167395E+03 -1.63842297E+03 -1.63353406E+03 + -1.62864502E+03 -1.62375500E+03 -1.61886597E+03 -1.61397705E+03 + -1.66487805E+03 -1.66253894E+03 -1.66019995E+03 -1.65786096E+03 + -1.65552197E+03 -1.65242004E+03 -1.64931897E+03 -1.64621802E+03 + -1.64311694E+03 -1.64001599E+03 -1.63504895E+03 -1.63008203E+03 + -1.62511499E+03 -1.62014795E+03 -1.61518103E+03 -1.66567603E+03 + -1.66330896E+03 -1.66094202E+03 -1.65857495E+03 -1.65620801E+03 + -1.65308203E+03 -1.64995605E+03 -1.64682996E+03 -1.64370496E+03 + -1.64057898E+03 -1.63556995E+03 -1.63056201E+03 -1.62555396E+03 + -1.62054504E+03 -1.61553699E+03 -1.66641199E+03 -1.66401099E+03 + -1.66161096E+03 -1.65920996E+03 -1.65681006E+03 -1.65346899E+03 + -1.65012805E+03 -1.64678699E+03 -1.64344604E+03 -1.64010596E+03 + -1.63511096E+03 -1.63011694E+03 -1.62512195E+03 -1.62012805E+03 + -1.61513306E+03 -1.66802502E+03 -1.66565503E+03 -1.66328503E+03 + -1.66091394E+03 -1.65854395E+03 -1.65517798E+03 -1.65181299E+03 + -1.64844702E+03 -1.64508203E+03 -1.64171594E+03 -1.63662695E+03 + -1.63153699E+03 -1.62644702E+03 -1.62135706E+03 -1.61626697E+03 + -1.66512903E+03 -1.66269995E+03 -1.66027197E+03 -1.65784399E+03 + -1.65541504E+03 -1.65198206E+03 -1.64854797E+03 -1.64511499E+03 + -1.64168103E+03 -1.63824805E+03 -1.63317102E+03 -1.62809399E+03 + -1.62301599E+03 -1.61793896E+03 -1.61286206E+03 -1.65595300E+03 + -1.65351404E+03 -1.65107495E+03 -1.64863599E+03 -1.64619702E+03 + -1.64276294E+03 -1.63932898E+03 -1.63589502E+03 -1.63245996E+03 + -1.62902600E+03 -1.62394800E+03 -1.61886902E+03 -1.61379102E+03 + -1.60871301E+03 -1.60363403E+03 -1.64897095E+03 -1.64658606E+03 + -1.64420105E+03 -1.64181604E+03 -1.63943005E+03 -1.63606604E+03 + -1.63270105E+03 -1.62933704E+03 -1.62597205E+03 -1.62260706E+03 + -1.61764905E+03 -1.61269104E+03 -1.60773206E+03 -1.60277405E+03 + -1.59781604E+03 -1.64684497E+03 -1.64442603E+03 -1.64200696E+03 + -1.63958704E+03 -1.63716797E+03 -1.63378406E+03 -1.63040002E+03 + -1.62701599E+03 -1.62363098E+03 -1.62024695E+03 -1.61530005E+03 + -1.61035205E+03 -1.60540405E+03 -1.60045605E+03 -1.59550903E+03 + -1.64932703E+03 -1.64932703E+03 -1.68943298E+03 -1.64932703E+03 + -1.64686694E+03 -1.64686694E+03 -1.68635095E+03 -1.64686694E+03 + -1.64440796E+03 -1.64440796E+03 -1.68326794E+03 -1.64440796E+03 + -1.64194800E+03 -1.64194800E+03 -1.68018604E+03 -1.64194800E+03 + -1.63948901E+03 -1.63948901E+03 -1.67710303E+03 -1.63948901E+03 + -1.63602295E+03 -1.63602295E+03 -1.67426404E+03 -1.63602295E+03 + -1.63255701E+03 -1.63255701E+03 -1.67142505E+03 -1.63255701E+03 + -1.62909204E+03 -1.62909204E+03 -1.66858496E+03 -1.62909204E+03 + -1.62562598E+03 -1.62562598E+03 -1.66574597E+03 -1.62562598E+03 + -1.62216003E+03 -1.62216003E+03 -1.66290698E+03 -1.62216003E+03 + -1.61712305E+03 -1.61712305E+03 -1.65809094E+03 -1.61712305E+03 + -1.61208496E+03 -1.61208496E+03 -1.65327502E+03 -1.61208496E+03 + -1.60704797E+03 -1.60704797E+03 -1.64845898E+03 -1.60704797E+03 + -1.60201001E+03 -1.60201001E+03 -1.64364294E+03 -1.60201001E+03 + -1.59697302E+03 -1.59697302E+03 -1.63882703E+03 -1.59697302E+03 + -1.68793799E+03 -1.65450195E+03 -1.68793799E+03 -1.68793799E+03 + -1.68535803E+03 -1.65210901E+03 -1.68535803E+03 -1.68535803E+03 + -1.68277795E+03 -1.64971594E+03 -1.68277795E+03 -1.68277795E+03 + -1.68019800E+03 -1.64732300E+03 -1.68019800E+03 -1.68019800E+03 + -1.67761804E+03 -1.64493103E+03 -1.67761804E+03 -1.67761804E+03 + -1.67429700E+03 -1.64137695E+03 -1.67429700E+03 -1.67429700E+03 + -1.67097595E+03 -1.63782397E+03 -1.67097595E+03 -1.67097595E+03 + -1.66765503E+03 -1.63427100E+03 -1.66765503E+03 -1.66765503E+03 + -1.66433398E+03 -1.63071704E+03 -1.66433398E+03 -1.66433398E+03 + -1.66101294E+03 -1.62716394E+03 -1.66101294E+03 -1.66101294E+03 + -1.65606702E+03 -1.62207495E+03 -1.65606702E+03 -1.65606702E+03 + -1.65112097E+03 -1.61698706E+03 -1.65112097E+03 -1.65112097E+03 + -1.64617395E+03 -1.61189905E+03 -1.64617395E+03 -1.64617395E+03 + -1.64122803E+03 -1.60681006E+03 -1.64122803E+03 -1.64122803E+03 + -1.63628198E+03 -1.60172205E+03 -1.63628198E+03 -1.63628198E+03 + -1.73405603E+03 -1.73405603E+03 -1.73405603E+03 -1.73405603E+03 + -1.73168005E+03 -1.73168005E+03 -1.73168005E+03 -1.73168005E+03 + -1.72930298E+03 -1.72930298E+03 -1.72930298E+03 -1.72930298E+03 + -1.72692700E+03 -1.72692700E+03 -1.72692700E+03 -1.72692700E+03 + -1.72455005E+03 -1.72455005E+03 -1.72455005E+03 -1.72455005E+03 + -1.72111304E+03 -1.72111304E+03 -1.72111304E+03 -1.72111304E+03 + -1.71767700E+03 -1.71767700E+03 -1.71767700E+03 -1.71767700E+03 + -1.71423999E+03 -1.71423999E+03 -1.71423999E+03 -1.71423999E+03 + -1.71080396E+03 -1.71080396E+03 -1.71080396E+03 -1.71080396E+03 + -1.70736694E+03 -1.70736694E+03 -1.70736694E+03 -1.70736694E+03 + -1.70230701E+03 -1.70230701E+03 -1.70230701E+03 -1.70230701E+03 + -1.69724805E+03 -1.69724805E+03 -1.69724805E+03 -1.69724805E+03 + -1.69218799E+03 -1.69218799E+03 -1.69218799E+03 -1.69218799E+03 + -1.68712805E+03 -1.68712805E+03 -1.68712805E+03 -1.68712805E+03 + -1.68206799E+03 -1.68206799E+03 -1.68206799E+03 -1.68206799E+03 + -1.72365198E+03 -1.72140601E+03 -1.71916101E+03 -1.71691602E+03 + -1.71467102E+03 -1.71148303E+03 -1.70829395E+03 -1.70510596E+03 + -1.70191797E+03 -1.69872998E+03 -1.69395801E+03 -1.68918604E+03 + -1.68441504E+03 -1.67964294E+03 -1.67487097E+03 -1.71635596E+03 + -1.71410596E+03 -1.71185706E+03 -1.70960706E+03 -1.70735706E+03 + -1.70413794E+03 -1.70091895E+03 -1.69769995E+03 -1.69448096E+03 + -1.69126196E+03 -1.68645398E+03 -1.68164600E+03 -1.67683899E+03 + -1.67203101E+03 -1.66722302E+03 -1.70965198E+03 -1.70738794E+03 + -1.70512402E+03 -1.70285901E+03 -1.70059497E+03 -1.69736902E+03 + -1.69414294E+03 -1.69091699E+03 -1.68769104E+03 -1.68446497E+03 + -1.67969702E+03 -1.67492798E+03 -1.67016003E+03 -1.66539197E+03 + -1.66062305E+03 -1.70608997E+03 -1.70386902E+03 -1.70164697E+03 + -1.69942603E+03 -1.69720496E+03 -1.69399805E+03 -1.69079102E+03 + -1.68758398E+03 -1.68437805E+03 -1.68117102E+03 -1.67639001E+03 + -1.67160901E+03 -1.66682898E+03 -1.66204797E+03 -1.65726794E+03 + -1.70438196E+03 -1.70218701E+03 -1.69999304E+03 -1.69779797E+03 + -1.69560400E+03 -1.69240100E+03 -1.68919702E+03 -1.68599402E+03 + -1.68279004E+03 -1.67958704E+03 -1.67478296E+03 -1.66997998E+03 + -1.66517603E+03 -1.66037305E+03 -1.65556897E+03 -1.70438599E+03 + -1.70221204E+03 -1.70003796E+03 -1.69786499E+03 -1.69569104E+03 + -1.69247900E+03 -1.68926794E+03 -1.68605603E+03 -1.68284497E+03 + -1.67963306E+03 -1.67469604E+03 -1.66975903E+03 -1.66482202E+03 + -1.65988501E+03 -1.65494702E+03 -1.70618396E+03 -1.70390796E+03 + -1.70163306E+03 -1.69935706E+03 -1.69708105E+03 -1.69381604E+03 + -1.69055103E+03 -1.68728601E+03 -1.68402100E+03 -1.68075598E+03 + -1.67562195E+03 -1.67048804E+03 -1.66535400E+03 -1.66021997E+03 + -1.65508606E+03 -1.71293298E+03 -1.71042700E+03 -1.70792102E+03 + -1.70541504E+03 -1.70290906E+03 -1.69916699E+03 -1.69542505E+03 + -1.69168298E+03 -1.68794104E+03 -1.68419897E+03 -1.67913196E+03 + -1.67406396E+03 -1.66899695E+03 -1.66392896E+03 -1.65886096E+03 + -1.72441602E+03 -1.72091296E+03 -1.71741003E+03 -1.71390698E+03 + -1.71040295E+03 -1.70682898E+03 -1.70325403E+03 -1.69967896E+03 + -1.69610400E+03 -1.69252905E+03 -1.68745801E+03 -1.68238696E+03 + -1.67731494E+03 -1.67224402E+03 -1.66717297E+03 -1.73123596E+03 + -1.72844995E+03 -1.72566504E+03 -1.72287903E+03 -1.72009399E+03 + -1.71664197E+03 -1.71318994E+03 -1.70973901E+03 -1.70628699E+03 + -1.70283496E+03 -1.69702600E+03 -1.69121704E+03 -1.68540796E+03 + -1.67959900E+03 -1.67379004E+03 -1.73553894E+03 -1.73320300E+03 + -1.73086694E+03 -1.72853101E+03 -1.72619397E+03 -1.72249402E+03 + -1.71879297E+03 -1.71509302E+03 -1.71139294E+03 -1.70769202E+03 + -1.70197400E+03 -1.69625598E+03 -1.69053796E+03 -1.68481995E+03 + -1.67910095E+03 -1.73354504E+03 -1.73354504E+03 -1.66764697E+03 + -1.73354504E+03 -1.73128198E+03 -1.73128198E+03 -1.66532397E+03 + -1.73128198E+03 -1.72902002E+03 -1.72902002E+03 -1.66300195E+03 + -1.72902002E+03 -1.72675696E+03 -1.72675696E+03 -1.66067896E+03 + -1.72675696E+03 -1.72449402E+03 -1.72449402E+03 -1.65835706E+03 + -1.72449402E+03 -1.72078296E+03 -1.72078296E+03 -1.65504102E+03 + -1.72078296E+03 -1.71707202E+03 -1.71707202E+03 -1.65172498E+03 + -1.71707202E+03 -1.71335999E+03 -1.71335999E+03 -1.64841003E+03 + -1.71335999E+03 -1.70964905E+03 -1.70964905E+03 -1.64509399E+03 + -1.70964905E+03 -1.70593799E+03 -1.70593799E+03 -1.64177905E+03 + -1.70593799E+03 -1.70073096E+03 -1.70073096E+03 -1.63690796E+03 + -1.70073096E+03 -1.69552405E+03 -1.69552405E+03 -1.63203796E+03 + -1.69552405E+03 -1.69031702E+03 -1.69031702E+03 -1.62716797E+03 + -1.69031702E+03 -1.68511096E+03 -1.68511096E+03 -1.62229797E+03 + -1.68511096E+03 -1.67990405E+03 -1.67990405E+03 -1.61742798E+03 + -1.67990405E+03 -1.67009595E+03 -1.72819995E+03 -1.67009595E+03 + -1.72819995E+03 -1.66776501E+03 -1.72595703E+03 -1.66776501E+03 + -1.72595703E+03 -1.66543396E+03 -1.72371399E+03 -1.66543396E+03 + -1.72371399E+03 -1.66310303E+03 -1.72147205E+03 -1.66310303E+03 + -1.72147205E+03 -1.66077100E+03 -1.71922900E+03 -1.66077100E+03 + -1.71922900E+03 -1.65755798E+03 -1.71556006E+03 -1.65755798E+03 + -1.71556006E+03 -1.65434399E+03 -1.71189099E+03 -1.65434399E+03 + -1.71189099E+03 -1.65113000E+03 -1.70822302E+03 -1.65113000E+03 + -1.70822302E+03 -1.64791602E+03 -1.70455396E+03 -1.64791602E+03 + -1.70455396E+03 -1.64470203E+03 -1.70088501E+03 -1.64470203E+03 + -1.70088501E+03 -1.63982605E+03 -1.69559094E+03 -1.63982605E+03 + -1.69559094E+03 -1.63495105E+03 -1.69029602E+03 -1.63495105E+03 + -1.69029602E+03 -1.63007495E+03 -1.68500098E+03 -1.63007495E+03 + -1.68500098E+03 -1.62519897E+03 -1.67970605E+03 -1.62519897E+03 + -1.67970605E+03 -1.62032300E+03 -1.67441199E+03 -1.62032300E+03 + -1.67441199E+03 -1.67173499E+03 -1.72301599E+03 -1.67173499E+03 + -1.72301599E+03 -1.66938000E+03 -1.72047400E+03 -1.66938000E+03 + -1.72047400E+03 -1.66702600E+03 -1.71793103E+03 -1.66702600E+03 + -1.71793103E+03 -1.66467102E+03 -1.71538904E+03 -1.66467102E+03 + -1.71538904E+03 -1.66231604E+03 -1.71284595E+03 -1.66231604E+03 + -1.71284595E+03 -1.65928101E+03 -1.70904199E+03 -1.65928101E+03 + -1.70904199E+03 -1.65624695E+03 -1.70523804E+03 -1.65624695E+03 + -1.70523804E+03 -1.65321204E+03 -1.70143396E+03 -1.65321204E+03 + -1.70143396E+03 -1.65017700E+03 -1.69763000E+03 -1.65017700E+03 + -1.69763000E+03 -1.64714294E+03 -1.69382495E+03 -1.64714294E+03 + -1.69382495E+03 -1.64219604E+03 -1.68869495E+03 -1.64219604E+03 + -1.68869495E+03 -1.63725000E+03 -1.68356396E+03 -1.63725000E+03 + -1.68356396E+03 -1.63230298E+03 -1.67843298E+03 -1.63230298E+03 + -1.67843298E+03 -1.62735706E+03 -1.67330298E+03 -1.62735706E+03 + -1.67330298E+03 -1.62241003E+03 -1.66817200E+03 -1.62241003E+03 + -1.66817200E+03 -1.67247705E+03 -1.72073596E+03 -1.67247705E+03 + -1.72073596E+03 -1.67008398E+03 -1.71768604E+03 -1.67008398E+03 + -1.71768604E+03 -1.66769202E+03 -1.71463599E+03 -1.66769202E+03 + -1.71463599E+03 -1.66529895E+03 -1.71158606E+03 -1.66529895E+03 + -1.71158606E+03 -1.66290601E+03 -1.70853601E+03 -1.66290601E+03 + -1.70853601E+03 -1.65992896E+03 -1.70472400E+03 -1.65992896E+03 + -1.70472400E+03 -1.65695105E+03 -1.70091101E+03 -1.65695105E+03 + -1.70091101E+03 -1.65397302E+03 -1.69709802E+03 -1.65397302E+03 + -1.69709802E+03 -1.65099500E+03 -1.69328503E+03 -1.65099500E+03 + -1.69328503E+03 -1.64801697E+03 -1.68947205E+03 -1.64801697E+03 + -1.68947205E+03 -1.64310498E+03 -1.68433496E+03 -1.64310498E+03 + -1.68433496E+03 -1.63819202E+03 -1.67919800E+03 -1.63819202E+03 + -1.67919800E+03 -1.63327905E+03 -1.67406104E+03 -1.63327905E+03 + -1.67406104E+03 -1.62836694E+03 -1.66892395E+03 -1.62836694E+03 + -1.66892395E+03 -1.62345398E+03 -1.66378699E+03 -1.62345398E+03 + -1.66378699E+03 -1.67244897E+03 -1.71847595E+03 -1.67244897E+03 + -1.71847595E+03 -1.67002905E+03 -1.71574194E+03 -1.67002905E+03 + -1.71574194E+03 -1.66760999E+03 -1.71300806E+03 -1.66760999E+03 + -1.71300806E+03 -1.66519104E+03 -1.71027405E+03 -1.66519104E+03 + -1.71027405E+03 -1.66277100E+03 -1.70754004E+03 -1.66277100E+03 + -1.70754004E+03 -1.65954199E+03 -1.70347705E+03 -1.65954199E+03 + -1.70347705E+03 -1.65631299E+03 -1.69941394E+03 -1.65631299E+03 + -1.69941394E+03 -1.65308301E+03 -1.69535095E+03 -1.65308301E+03 + -1.69535095E+03 -1.64985400E+03 -1.69128894E+03 -1.64985400E+03 + -1.69128894E+03 -1.64662402E+03 -1.68722595E+03 -1.64662402E+03 + -1.68722595E+03 -1.64196802E+03 -1.68211804E+03 -1.64196802E+03 + -1.68211804E+03 -1.63731201E+03 -1.67701099E+03 -1.63731201E+03 + -1.67701099E+03 -1.63265503E+03 -1.67190405E+03 -1.63265503E+03 + -1.67190405E+03 -1.62799902E+03 -1.66679700E+03 -1.62799902E+03 + -1.66679700E+03 -1.62334204E+03 -1.66168994E+03 -1.62334204E+03 + -1.66168994E+03 -1.66995496E+03 -1.71530103E+03 -1.66995496E+03 + -1.66995496E+03 -1.66762805E+03 -1.71335400E+03 -1.66762805E+03 + -1.66762805E+03 -1.66530103E+03 -1.71140601E+03 -1.66530103E+03 + -1.66530103E+03 -1.66297400E+03 -1.70945898E+03 -1.66297400E+03 + -1.66297400E+03 -1.66064697E+03 -1.70751099E+03 -1.66064697E+03 + -1.66064697E+03 -1.65753894E+03 -1.70311206E+03 -1.65753894E+03 + -1.65753894E+03 -1.65443201E+03 -1.69871399E+03 -1.65443201E+03 + -1.65443201E+03 -1.65132495E+03 -1.69431494E+03 -1.65132495E+03 + -1.65132495E+03 -1.64821802E+03 -1.68991602E+03 -1.64821802E+03 + -1.64821802E+03 -1.64510999E+03 -1.68551794E+03 -1.64510999E+03 + -1.64510999E+03 -1.64027600E+03 -1.68059802E+03 -1.64027600E+03 + -1.64027600E+03 -1.63544104E+03 -1.67567798E+03 -1.63544104E+03 + -1.63544104E+03 -1.63060706E+03 -1.67075806E+03 -1.63060706E+03 + -1.63060706E+03 -1.62577197E+03 -1.66583899E+03 -1.62577197E+03 + -1.62577197E+03 -1.62093799E+03 -1.66091895E+03 -1.62093799E+03 + -1.62093799E+03 -1.66758105E+03 -1.66528003E+03 -1.66297998E+03 + -1.66068005E+03 -1.65837903E+03 -1.65529004E+03 -1.65220105E+03 + -1.64911206E+03 -1.64602295E+03 -1.64293396E+03 -1.63803003E+03 + -1.63312598E+03 -1.62822302E+03 -1.62331897E+03 -1.61841504E+03 + -1.66339502E+03 -1.66095801E+03 -1.65852100E+03 -1.65608398E+03 + -1.65364795E+03 -1.65021594E+03 -1.64678406E+03 -1.64335205E+03 + -1.63992102E+03 -1.63648901E+03 -1.63147900E+03 -1.62646899E+03 + -1.62145898E+03 -1.61644995E+03 -1.61143994E+03 -1.65517297E+03 + -1.65273706E+03 -1.65030103E+03 -1.64786499E+03 -1.64542896E+03 + -1.64201794E+03 -1.63860596E+03 -1.63519397E+03 -1.63178198E+03 + -1.62837097E+03 -1.62338904E+03 -1.61840796E+03 -1.61342603E+03 + -1.60844495E+03 -1.60346301E+03 -1.65288098E+03 -1.65043604E+03 + -1.64798999E+03 -1.64554395E+03 -1.64309802E+03 -1.63966699E+03 + -1.63623499E+03 -1.63280298E+03 -1.62937097E+03 -1.62593896E+03 + -1.62091699E+03 -1.61589502E+03 -1.61087195E+03 -1.60584998E+03 + -1.60082703E+03 -1.65584900E+03 -1.65338501E+03 -1.65092102E+03 + -1.64845703E+03 -1.64599304E+03 -1.64256299E+03 -1.63913306E+03 + -1.63570398E+03 -1.63227405E+03 -1.62884399E+03 -1.62382898E+03 + -1.61881396E+03 -1.61379895E+03 -1.60878406E+03 -1.60376904E+03 + -1.65993701E+03 -1.65993701E+03 -1.65993701E+03 -1.65993701E+03 + -1.65742395E+03 -1.65742395E+03 -1.65742395E+03 -1.65742395E+03 + -1.65491199E+03 -1.65491199E+03 -1.65491199E+03 -1.65491199E+03 + -1.65239905E+03 -1.65239905E+03 -1.65239905E+03 -1.65239905E+03 + -1.64988696E+03 -1.64988696E+03 -1.64988696E+03 -1.64988696E+03 + -1.64639404E+03 -1.64639404E+03 -1.64639404E+03 -1.64639404E+03 + -1.64290002E+03 -1.64290002E+03 -1.64290002E+03 -1.64290002E+03 + -1.63940698E+03 -1.63940698E+03 -1.63940698E+03 -1.63940698E+03 + -1.63591394E+03 -1.63591394E+03 -1.63591394E+03 -1.63591394E+03 + -1.63242102E+03 -1.63242102E+03 -1.63242102E+03 -1.63242102E+03 + -1.62739697E+03 -1.62739697E+03 -1.62739697E+03 -1.62739697E+03 + -1.62237305E+03 -1.62237305E+03 -1.62237305E+03 -1.62237305E+03 + -1.61734900E+03 -1.61734900E+03 -1.61734900E+03 -1.61734900E+03 + -1.61232495E+03 -1.61232495E+03 -1.61232495E+03 -1.61232495E+03 + -1.60730200E+03 -1.60730200E+03 -1.60730200E+03 -1.60730200E+03 + -1.73401294E+03 -1.73401294E+03 -1.73401294E+03 -1.73401294E+03 + -1.73178601E+03 -1.73178601E+03 -1.73178601E+03 -1.73178601E+03 + -1.72955896E+03 -1.72955896E+03 -1.72955896E+03 -1.72955896E+03 + -1.72733301E+03 -1.72733301E+03 -1.72733301E+03 -1.72733301E+03 + -1.72510596E+03 -1.72510596E+03 -1.72510596E+03 -1.72510596E+03 + -1.72193506E+03 -1.72193506E+03 -1.72193506E+03 -1.72193506E+03 + -1.71876501E+03 -1.71876501E+03 -1.71876501E+03 -1.71876501E+03 + -1.71559399E+03 -1.71559399E+03 -1.71559399E+03 -1.71559399E+03 + -1.71242297E+03 -1.71242297E+03 -1.71242297E+03 -1.71242297E+03 + -1.70925305E+03 -1.70925305E+03 -1.70925305E+03 -1.70925305E+03 + -1.70438599E+03 -1.70438599E+03 -1.70438599E+03 -1.70438599E+03 + -1.69952002E+03 -1.69952002E+03 -1.69952002E+03 -1.69952002E+03 + -1.69465295E+03 -1.69465295E+03 -1.69465295E+03 -1.69465295E+03 + -1.68978601E+03 -1.68978601E+03 -1.68978601E+03 -1.68978601E+03 + -1.68492004E+03 -1.68492004E+03 -1.68492004E+03 -1.68492004E+03 + -1.72263306E+03 -1.72045801E+03 -1.71828406E+03 -1.71610901E+03 + -1.71393506E+03 -1.71081104E+03 -1.70768701E+03 -1.70456396E+03 + -1.70143994E+03 -1.69831604E+03 -1.69366003E+03 -1.68900305E+03 + -1.68434705E+03 -1.67968994E+03 -1.67503406E+03 -1.71443005E+03 + -1.71222705E+03 -1.71002405E+03 -1.70782202E+03 -1.70561902E+03 + -1.70253601E+03 -1.69945300E+03 -1.69637000E+03 -1.69328796E+03 + -1.69020496E+03 -1.68559094E+03 -1.68097705E+03 -1.67636304E+03 + -1.67174902E+03 -1.66713501E+03 -1.70970398E+03 -1.70746106E+03 + -1.70521704E+03 -1.70297302E+03 -1.70072900E+03 -1.69754797E+03 + -1.69436804E+03 -1.69118701E+03 -1.68800598E+03 -1.68482495E+03 + -1.68008398E+03 -1.67534204E+03 -1.67060095E+03 -1.66585901E+03 + -1.66111804E+03 -1.70854895E+03 -1.70621301E+03 -1.70387695E+03 + -1.70154102E+03 -1.69920496E+03 -1.69585901E+03 -1.69251196E+03 + -1.68916504E+03 -1.68581799E+03 -1.68247095E+03 -1.67758105E+03 + -1.67269202E+03 -1.66780200E+03 -1.66291199E+03 -1.65802197E+03 + -1.70742798E+03 -1.70511499E+03 -1.70280200E+03 -1.70048901E+03 + -1.69817603E+03 -1.69485400E+03 -1.69153296E+03 -1.68821204E+03 + -1.68489099E+03 -1.68156897E+03 -1.67667102E+03 -1.67177197E+03 + -1.66687305E+03 -1.66197400E+03 -1.65707495E+03 -1.70984998E+03 + -1.70745496E+03 -1.70506006E+03 -1.70266504E+03 -1.70027002E+03 + -1.69687903E+03 -1.69348901E+03 -1.69009802E+03 -1.68670801E+03 + -1.68331799E+03 -1.67833203E+03 -1.67334705E+03 -1.66836206E+03 + -1.66337598E+03 -1.65839099E+03 -1.71484595E+03 -1.71245496E+03 + -1.71006396E+03 -1.70767395E+03 -1.70528296E+03 -1.70190698E+03 + -1.69853101E+03 -1.69515503E+03 -1.69177905E+03 -1.68840295E+03 + -1.68344995E+03 -1.67849805E+03 -1.67354504E+03 -1.66859302E+03 + -1.66364001E+03 -1.72346106E+03 -1.72102502E+03 -1.71858899E+03 + -1.71615295E+03 -1.71371704E+03 -1.71027795E+03 -1.70683899E+03 + -1.70339905E+03 -1.69995996E+03 -1.69652100E+03 -1.69148401E+03 + -1.68644604E+03 -1.68140906E+03 -1.67637097E+03 -1.67133398E+03 + -1.73293506E+03 -1.73055005E+03 -1.72816602E+03 -1.72578101E+03 + -1.72339600E+03 -1.72003003E+03 -1.71666394E+03 -1.71329700E+03 + -1.70993103E+03 -1.70656396E+03 -1.70159399E+03 -1.69662305E+03 + -1.69165198E+03 -1.68668103E+03 -1.68171106E+03 -1.74039905E+03 + -1.73797302E+03 -1.73554700E+03 -1.73312097E+03 -1.73069495E+03 + -1.72724500E+03 -1.72379395E+03 -1.72034302E+03 -1.71689197E+03 + -1.71344202E+03 -1.70851196E+03 -1.70358203E+03 -1.69865198E+03 + -1.69372205E+03 -1.68879199E+03 -1.74347900E+03 -1.74101501E+03 + -1.73855103E+03 -1.73608606E+03 -1.73362195E+03 -1.73027600E+03 + -1.72693103E+03 -1.72358496E+03 -1.72023901E+03 -1.71689294E+03 + -1.71178406E+03 -1.70667603E+03 -1.70156702E+03 -1.69645898E+03 + -1.69134998E+03 -1.74278601E+03 -1.74030396E+03 -1.73782300E+03 + -1.73534094E+03 -1.73285901E+03 -1.72936304E+03 -1.72586804E+03 + -1.72237305E+03 -1.71887805E+03 -1.71538196E+03 -1.71030396E+03 + -1.70522705E+03 -1.70014905E+03 -1.69507104E+03 -1.68999304E+03 + -1.73836694E+03 -1.73585400E+03 -1.73334204E+03 -1.73082898E+03 + -1.72831604E+03 -1.72478101E+03 -1.72124597E+03 -1.71771106E+03 + -1.71417603E+03 -1.71064099E+03 -1.70542896E+03 -1.70021704E+03 + -1.69500500E+03 -1.68979395E+03 -1.68458203E+03 -1.73091199E+03 + -1.72840906E+03 -1.72590601E+03 -1.72340295E+03 -1.72090002E+03 + -1.71731799E+03 -1.71373499E+03 -1.71015295E+03 -1.70656995E+03 + -1.70298804E+03 -1.69778101E+03 -1.69257397E+03 -1.68736694E+03 + -1.68216003E+03 -1.67695398E+03 -1.72883496E+03 -1.72586597E+03 + -1.72289600E+03 -1.71992700E+03 -1.71695801E+03 -1.71334302E+03 + -1.70972705E+03 -1.70611206E+03 -1.70249597E+03 -1.69888098E+03 + -1.69358899E+03 -1.68829700E+03 -1.68300500E+03 -1.67771301E+03 + -1.67242102E+03 -1.72577795E+03 -1.72292200E+03 -1.72006494E+03 + -1.71720898E+03 -1.71435205E+03 -1.71063696E+03 -1.70692200E+03 + -1.70320605E+03 -1.69949097E+03 -1.69577600E+03 -1.69058801E+03 + -1.68540002E+03 -1.68021204E+03 -1.67502405E+03 -1.66983606E+03 + -1.72286401E+03 -1.72286401E+03 -1.67586401E+03 -1.72286401E+03 + -1.72050903E+03 -1.72050903E+03 -1.67351001E+03 -1.72050903E+03 + -1.71815295E+03 -1.71815295E+03 -1.67115601E+03 -1.71815295E+03 + -1.71579797E+03 -1.71579797E+03 -1.66880200E+03 -1.71579797E+03 + -1.71344299E+03 -1.71344299E+03 -1.66644800E+03 -1.71344299E+03 + -1.70947705E+03 -1.70947705E+03 -1.66339600E+03 -1.70947705E+03 + -1.70551196E+03 -1.70551196E+03 -1.66034497E+03 -1.70551196E+03 + -1.70154700E+03 -1.70154700E+03 -1.65729395E+03 -1.70154700E+03 + -1.69758203E+03 -1.69758203E+03 -1.65424194E+03 -1.69758203E+03 + -1.69361694E+03 -1.69361694E+03 -1.65119104E+03 -1.69361694E+03 + -1.68859204E+03 -1.68859204E+03 -1.64629504E+03 -1.68859204E+03 + -1.68356799E+03 -1.68356799E+03 -1.64139795E+03 -1.68356799E+03 + -1.67854297E+03 -1.67854297E+03 -1.63650195E+03 -1.67854297E+03 + -1.67351904E+03 -1.67351904E+03 -1.63160498E+03 -1.67351904E+03 + -1.66849402E+03 -1.66849402E+03 -1.62670898E+03 -1.66849402E+03 + -1.67170898E+03 -1.71859900E+03 -1.67170898E+03 -1.67170898E+03 + -1.66937195E+03 -1.71665405E+03 -1.66937195E+03 -1.66937195E+03 + -1.66703503E+03 -1.71470801E+03 -1.66703503E+03 -1.66703503E+03 + -1.66469800E+03 -1.71276294E+03 -1.66469800E+03 -1.66469800E+03 + -1.66236096E+03 -1.71081799E+03 -1.66236096E+03 -1.66236096E+03 + -1.65925305E+03 -1.70670996E+03 -1.65925305E+03 -1.65925305E+03 + -1.65614502E+03 -1.70260303E+03 -1.65614502E+03 -1.65614502E+03 + -1.65303601E+03 -1.69849597E+03 -1.65303601E+03 -1.65303601E+03 + -1.64992798E+03 -1.69438904E+03 -1.64992798E+03 -1.64992798E+03 + -1.64681995E+03 -1.69028101E+03 -1.64681995E+03 -1.64681995E+03 + -1.64204602E+03 -1.68591296E+03 -1.64204602E+03 -1.64204602E+03 + -1.63727100E+03 -1.68154504E+03 -1.63727100E+03 -1.63727100E+03 + -1.63249695E+03 -1.67717700E+03 -1.63249695E+03 -1.63249695E+03 + -1.62772302E+03 -1.67280798E+03 -1.62772302E+03 -1.62772302E+03 + -1.62294800E+03 -1.66843994E+03 -1.62294800E+03 -1.62294800E+03 + -1.66819397E+03 -1.66584204E+03 -1.66348999E+03 -1.66113696E+03 + -1.65878503E+03 -1.65544702E+03 -1.65210999E+03 -1.64877197E+03 + -1.64543506E+03 -1.64209705E+03 -1.63737305E+03 -1.63264905E+03 + -1.62792505E+03 -1.62320105E+03 -1.61847705E+03 -1.66460901E+03 + -1.66221399E+03 -1.65981897E+03 -1.65742297E+03 -1.65502795E+03 + -1.65164795E+03 -1.64826697E+03 -1.64488696E+03 -1.64150598E+03 + -1.63812598E+03 -1.63309998E+03 -1.62807495E+03 -1.62305005E+03 + -1.61802502E+03 -1.61300000E+03 -1.65998206E+03 -1.65755798E+03 + -1.65513403E+03 -1.65270898E+03 -1.65028503E+03 -1.64690405E+03 + -1.64352295E+03 -1.64014197E+03 -1.63676001E+03 -1.63337903E+03 + -1.62843604E+03 -1.62349402E+03 -1.61855103E+03 -1.61360803E+03 + -1.60866602E+03 -1.66107300E+03 -1.65864294E+03 -1.65621399E+03 + -1.65378406E+03 -1.65135400E+03 -1.64796899E+03 -1.64458398E+03 + -1.64119800E+03 -1.63781299E+03 -1.63442798E+03 -1.62952295E+03 + -1.62461804E+03 -1.61971301E+03 -1.61480798E+03 -1.60990198E+03 + -1.66666101E+03 -1.66666101E+03 -1.66666101E+03 -1.66666101E+03 + -1.66415698E+03 -1.66415698E+03 -1.66415698E+03 -1.66415698E+03 + -1.66165405E+03 -1.66165405E+03 -1.66165405E+03 -1.66165405E+03 + -1.65915002E+03 -1.65915002E+03 -1.65915002E+03 -1.65915002E+03 + -1.65664697E+03 -1.65664697E+03 -1.65664697E+03 -1.65664697E+03 + -1.65317700E+03 -1.65317700E+03 -1.65317700E+03 -1.65317700E+03 + -1.64970801E+03 -1.64970801E+03 -1.64970801E+03 -1.64970801E+03 + -1.64623901E+03 -1.64623901E+03 -1.64623901E+03 -1.64623901E+03 + -1.64277002E+03 -1.64277002E+03 -1.64277002E+03 -1.64277002E+03 + -1.63930103E+03 -1.63930103E+03 -1.63930103E+03 -1.63930103E+03 + -1.63422803E+03 -1.63422803E+03 -1.63422803E+03 -1.63422803E+03 + -1.62915601E+03 -1.62915601E+03 -1.62915601E+03 -1.62915601E+03 + -1.62408301E+03 -1.62408301E+03 -1.62408301E+03 -1.62408301E+03 + -1.61901099E+03 -1.61901099E+03 -1.61901099E+03 -1.61901099E+03 + -1.61393799E+03 -1.61393799E+03 -1.61393799E+03 -1.61393799E+03 + -1.73255701E+03 -1.73255701E+03 -1.73255701E+03 -1.73255701E+03 + -1.73025500E+03 -1.73025500E+03 -1.73025500E+03 -1.73025500E+03 + -1.72795300E+03 -1.72795300E+03 -1.72795300E+03 -1.72795300E+03 + -1.72565100E+03 -1.72565100E+03 -1.72565100E+03 -1.72565100E+03 + -1.72334900E+03 -1.72334900E+03 -1.72334900E+03 -1.72334900E+03 + -1.72008997E+03 -1.72008997E+03 -1.72008997E+03 -1.72008997E+03 + -1.71683105E+03 -1.71683105E+03 -1.71683105E+03 -1.71683105E+03 + -1.71357300E+03 -1.71357300E+03 -1.71357300E+03 -1.71357300E+03 + -1.71031396E+03 -1.71031396E+03 -1.71031396E+03 -1.71031396E+03 + -1.70705603E+03 -1.70705603E+03 -1.70705603E+03 -1.70705603E+03 + -1.70233899E+03 -1.70233899E+03 -1.70233899E+03 -1.70233899E+03 + -1.69762195E+03 -1.69762195E+03 -1.69762195E+03 -1.69762195E+03 + -1.69290503E+03 -1.69290503E+03 -1.69290503E+03 -1.69290503E+03 + -1.68818896E+03 -1.68818896E+03 -1.68818896E+03 -1.68818896E+03 + -1.68347205E+03 -1.68347205E+03 -1.68347205E+03 -1.68347205E+03 + -1.72052502E+03 -1.71816602E+03 -1.71580603E+03 -1.71344604E+03 + -1.71108606E+03 -1.70781604E+03 -1.70454602E+03 -1.70127600E+03 + -1.69800598E+03 -1.69473596E+03 -1.69011804E+03 -1.68549902E+03 + -1.68088098E+03 -1.67626294E+03 -1.67164502E+03 -1.71375000E+03 + -1.71129797E+03 -1.70884595E+03 -1.70639404E+03 -1.70394202E+03 + -1.70066602E+03 -1.69739099E+03 -1.69411597E+03 -1.69083997E+03 + -1.68756494E+03 -1.68284900E+03 -1.67813403E+03 -1.67341797E+03 + -1.66870203E+03 -1.66398706E+03 -1.71060706E+03 -1.70831604E+03 + -1.70602502E+03 -1.70373401E+03 -1.70144299E+03 -1.69818799E+03 + -1.69493396E+03 -1.69167896E+03 -1.68842395E+03 -1.68516895E+03 + -1.68042004E+03 -1.67567102E+03 -1.67092102E+03 -1.66617200E+03 + -1.66142200E+03 -1.71023999E+03 -1.70802600E+03 -1.70581299E+03 + -1.70359900E+03 -1.70138501E+03 -1.69817505E+03 -1.69496594E+03 + -1.69175696E+03 -1.68854700E+03 -1.68533801E+03 -1.68048596E+03 + -1.67563306E+03 -1.67078101E+03 -1.66592896E+03 -1.66107703E+03 + -1.71097400E+03 -1.70867798E+03 -1.70638196E+03 -1.70408606E+03 + -1.70179004E+03 -1.69852502E+03 -1.69525903E+03 -1.69199402E+03 + -1.68872803E+03 -1.68546301E+03 -1.68063501E+03 -1.67580701E+03 + -1.67097900E+03 -1.66615100E+03 -1.66132300E+03 -1.71568701E+03 + -1.71338098E+03 -1.71107495E+03 -1.70876794E+03 -1.70646204E+03 + -1.70317297E+03 -1.69988501E+03 -1.69659595E+03 -1.69330701E+03 + -1.69001904E+03 -1.68504102E+03 -1.68006299E+03 -1.67508496E+03 + -1.67010596E+03 -1.66512805E+03 -1.72052600E+03 -1.71814197E+03 + -1.71575806E+03 -1.71337500E+03 -1.71099097E+03 -1.70762695E+03 + -1.70426404E+03 -1.70090002E+03 -1.69753601E+03 -1.69417200E+03 + -1.68925403E+03 -1.68433606E+03 -1.67941797E+03 -1.67450098E+03 + -1.66958301E+03 -1.72680798E+03 -1.72440002E+03 -1.72199194E+03 + -1.71958398E+03 -1.71717700E+03 -1.71382397E+03 -1.71047095E+03 + -1.70711804E+03 -1.70376501E+03 -1.70041199E+03 -1.69560400E+03 + -1.69079504E+03 -1.68598706E+03 -1.68117896E+03 -1.67637097E+03 + -1.73664197E+03 -1.73426599E+03 -1.73188904E+03 -1.72951294E+03 + -1.72713599E+03 -1.72382300E+03 -1.72051001E+03 -1.71719702E+03 + -1.71388306E+03 -1.71056995E+03 -1.70574805E+03 -1.70092603E+03 + -1.69610303E+03 -1.69128101E+03 -1.68645898E+03 -1.74326294E+03 + -1.74089697E+03 -1.73853003E+03 -1.73616394E+03 -1.73379700E+03 + -1.73048596E+03 -1.72717505E+03 -1.72386401E+03 -1.72055298E+03 + -1.71724194E+03 -1.71237805E+03 -1.70751404E+03 -1.70265100E+03 + -1.69778699E+03 -1.69292395E+03 -1.74726196E+03 -1.74488696E+03 + -1.74251099E+03 -1.74013599E+03 -1.73776001E+03 -1.73443994E+03 + -1.73112000E+03 -1.72780005E+03 -1.72447998E+03 -1.72116003E+03 + -1.71623206E+03 -1.71130298E+03 -1.70637500E+03 -1.70144604E+03 + -1.69651794E+03 -1.74850098E+03 -1.74607898E+03 -1.74365698E+03 + -1.74123499E+03 -1.73881299E+03 -1.73538599E+03 -1.73195898E+03 + -1.72853198E+03 -1.72510596E+03 -1.72167896E+03 -1.71664697E+03 + -1.71161597E+03 -1.70658398E+03 -1.70155298E+03 -1.69652100E+03 + -1.74756201E+03 -1.74511304E+03 -1.74266394E+03 -1.74021497E+03 + -1.73776599E+03 -1.73431201E+03 -1.73085901E+03 -1.72740503E+03 + -1.72395203E+03 -1.72049805E+03 -1.71535999E+03 -1.71022302E+03 + -1.70508496E+03 -1.69994800E+03 -1.69481006E+03 -1.74559204E+03 + -1.74300598E+03 -1.74042004E+03 -1.73783398E+03 -1.73524695E+03 + -1.73163306E+03 -1.72801794E+03 -1.72440295E+03 -1.72078796E+03 + -1.71717395E+03 -1.71187097E+03 -1.70656799E+03 -1.70126501E+03 + -1.69596204E+03 -1.69065906E+03 -1.74468396E+03 -1.74207605E+03 + -1.73946899E+03 -1.73686096E+03 -1.73425305E+03 -1.73061096E+03 + -1.72696802E+03 -1.72332605E+03 -1.71968298E+03 -1.71604102E+03 + -1.71068201E+03 -1.70532300E+03 -1.69996399E+03 -1.69460498E+03 + -1.68924597E+03 -1.73904102E+03 -1.73655603E+03 -1.73407104E+03 + -1.73158496E+03 -1.72909998E+03 -1.72550000E+03 -1.72189905E+03 + -1.71829797E+03 -1.71469702E+03 -1.71109705E+03 -1.70571497E+03 + -1.70033398E+03 -1.69495300E+03 -1.68957104E+03 -1.68418994E+03 + -1.73179297E+03 -1.72938000E+03 -1.72696704E+03 -1.72455396E+03 + -1.72214099E+03 -1.71861401E+03 -1.71508704E+03 -1.71155896E+03 + -1.70803198E+03 -1.70450500E+03 -1.69939795E+03 -1.69429004E+03 + -1.68918201E+03 -1.68407495E+03 -1.67896704E+03 -1.72653699E+03 + -1.72653699E+03 -1.68022205E+03 -1.72653699E+03 -1.72438196E+03 + -1.72438196E+03 -1.67790503E+03 -1.72438196E+03 -1.72222595E+03 + -1.72222595E+03 -1.67558801E+03 -1.72222595E+03 -1.72007104E+03 + -1.72007104E+03 -1.67327100E+03 -1.72007104E+03 -1.71791602E+03 + -1.71791602E+03 -1.67095398E+03 -1.71791602E+03 -1.71424902E+03 + -1.71424902E+03 -1.66757703E+03 -1.71424902E+03 -1.71058203E+03 + -1.71058203E+03 -1.66420105E+03 -1.71058203E+03 -1.70691602E+03 + -1.70691602E+03 -1.66082397E+03 -1.70691602E+03 -1.70324902E+03 + -1.70324902E+03 -1.65744800E+03 -1.70324902E+03 -1.69958203E+03 + -1.69958203E+03 -1.65407202E+03 -1.69958203E+03 -1.69518298E+03 + -1.69518298E+03 -1.64927698E+03 -1.69518298E+03 -1.69078406E+03 + -1.69078406E+03 -1.64448096E+03 -1.69078406E+03 -1.68638501E+03 + -1.68638501E+03 -1.63968604E+03 -1.68638501E+03 -1.68198596E+03 + -1.68198596E+03 -1.63489099E+03 -1.68198596E+03 -1.67758606E+03 + -1.67758606E+03 -1.63009595E+03 -1.67758606E+03 -1.67712903E+03 + -1.71559998E+03 -1.67712903E+03 -1.67712903E+03 -1.67483398E+03 + -1.71376501E+03 -1.67483398E+03 -1.67483398E+03 -1.67253894E+03 + -1.71192896E+03 -1.67253894E+03 -1.67253894E+03 -1.67024402E+03 + -1.71009399E+03 -1.67024402E+03 -1.67024402E+03 -1.66794800E+03 + -1.70825806E+03 -1.66794800E+03 -1.66794800E+03 -1.66453003E+03 + -1.70480896E+03 -1.66453003E+03 -1.66453003E+03 -1.66111096E+03 + -1.70136096E+03 -1.66111096E+03 -1.66111096E+03 -1.65769202E+03 + -1.69791199E+03 -1.65769202E+03 -1.65769202E+03 -1.65427295E+03 + -1.69446301E+03 -1.65427295E+03 -1.65427295E+03 -1.65085400E+03 + -1.69101404E+03 -1.65085400E+03 -1.65085400E+03 -1.64614099E+03 + -1.68804797E+03 -1.64614099E+03 -1.64614099E+03 -1.64142700E+03 + -1.68508105E+03 -1.64142700E+03 -1.64142700E+03 -1.63671301E+03 + -1.68211499E+03 -1.63671301E+03 -1.63671301E+03 -1.63200000E+03 + -1.67914905E+03 -1.63200000E+03 -1.63200000E+03 -1.62728601E+03 + -1.67618201E+03 -1.62728601E+03 -1.62728601E+03 -1.67419702E+03 + -1.67184705E+03 -1.66949695E+03 -1.66714697E+03 -1.66479797E+03 + -1.66121899E+03 -1.65764001E+03 -1.65406104E+03 -1.65048206E+03 + -1.64690295E+03 -1.64198096E+03 -1.63706006E+03 -1.63213904E+03 + -1.62721704E+03 -1.62229602E+03 -1.67051904E+03 -1.66806702E+03 + -1.66561597E+03 -1.66316394E+03 -1.66071204E+03 -1.65723999E+03 + -1.65376794E+03 -1.65029602E+03 -1.64682397E+03 -1.64335205E+03 + -1.63817297E+03 -1.63299402E+03 -1.62781494E+03 -1.62263501E+03 + -1.61745605E+03 -1.67181006E+03 -1.66934204E+03 -1.66687500E+03 + -1.66440698E+03 -1.66193994E+03 -1.65845898E+03 -1.65497900E+03 + -1.65149902E+03 -1.64801794E+03 -1.64453796E+03 -1.63944104E+03 + -1.63434302E+03 -1.62924597E+03 -1.62414905E+03 -1.61905200E+03 + -1.67890002E+03 -1.67890002E+03 -1.67890002E+03 -1.67890002E+03 + -1.67643994E+03 -1.67643994E+03 -1.67643994E+03 -1.67643994E+03 + -1.67398096E+03 -1.67398096E+03 -1.67398096E+03 -1.67398096E+03 + -1.67152100E+03 -1.67152100E+03 -1.67152100E+03 -1.67152100E+03 + -1.66906201E+03 -1.66906201E+03 -1.66906201E+03 -1.66906201E+03 + -1.66562695E+03 -1.66562695E+03 -1.66562695E+03 -1.66562695E+03 + -1.66219202E+03 -1.66219202E+03 -1.66219202E+03 -1.66219202E+03 + -1.65875598E+03 -1.65875598E+03 -1.65875598E+03 -1.65875598E+03 + -1.65532104E+03 -1.65532104E+03 -1.65532104E+03 -1.65532104E+03 + -1.65188599E+03 -1.65188599E+03 -1.65188599E+03 -1.65188599E+03 + -1.64685706E+03 -1.64685706E+03 -1.64685706E+03 -1.64685706E+03 + -1.64182703E+03 -1.64182703E+03 -1.64182703E+03 -1.64182703E+03 + -1.63679797E+03 -1.63679797E+03 -1.63679797E+03 -1.63679797E+03 + -1.63176794E+03 -1.63176794E+03 -1.63176794E+03 -1.63176794E+03 + -1.62673901E+03 -1.62673901E+03 -1.62673901E+03 -1.62673901E+03 + -1.73914905E+03 -1.73914905E+03 -1.73914905E+03 -1.73914905E+03 + -1.73710205E+03 -1.73710205E+03 -1.73710205E+03 -1.73710205E+03 + -1.73505396E+03 -1.73505396E+03 -1.73505396E+03 -1.73505396E+03 + -1.73300598E+03 -1.73300598E+03 -1.73300598E+03 -1.73300598E+03 + -1.73095801E+03 -1.73095801E+03 -1.73095801E+03 -1.73095801E+03 + -1.72763501E+03 -1.72763501E+03 -1.72763501E+03 -1.72763501E+03 + -1.72431299E+03 -1.72431299E+03 -1.72431299E+03 -1.72431299E+03 + -1.72098999E+03 -1.72098999E+03 -1.72098999E+03 -1.72098999E+03 + -1.71766699E+03 -1.71766699E+03 -1.71766699E+03 -1.71766699E+03 + -1.71434399E+03 -1.71434399E+03 -1.71434399E+03 -1.71434399E+03 + -1.70907104E+03 -1.70907104E+03 -1.70907104E+03 -1.70907104E+03 + -1.70379895E+03 -1.70379895E+03 -1.70379895E+03 -1.70379895E+03 + -1.69852600E+03 -1.69852600E+03 -1.69852600E+03 -1.69852600E+03 + -1.69325305E+03 -1.69325305E+03 -1.69325305E+03 -1.69325305E+03 + -1.68797998E+03 -1.68797998E+03 -1.68797998E+03 -1.68797998E+03 + -1.72764294E+03 -1.72518506E+03 -1.72272803E+03 -1.72027002E+03 + -1.71781201E+03 -1.71433301E+03 -1.71085303E+03 -1.70737402E+03 + -1.70389502E+03 -1.70041504E+03 -1.69525098E+03 -1.69008704E+03 + -1.68492200E+03 -1.67975806E+03 -1.67459399E+03 -1.71831201E+03 + -1.71585803E+03 -1.71340295E+03 -1.71094897E+03 -1.70849402E+03 + -1.70498804E+03 -1.70148206E+03 -1.69797595E+03 -1.69446997E+03 + -1.69096497E+03 -1.68586694E+03 -1.68077002E+03 -1.67567200E+03 + -1.67057495E+03 -1.66547803E+03 -1.71366296E+03 -1.71118994E+03 + -1.70871594E+03 -1.70624194E+03 -1.70376794E+03 -1.70028198E+03 + -1.69679504E+03 -1.69330896E+03 -1.68982202E+03 -1.68633606E+03 + -1.68134998E+03 -1.67636499E+03 -1.67137903E+03 -1.66639294E+03 + -1.66140796E+03 -1.71019202E+03 -1.70775500E+03 -1.70531799E+03 + -1.70288098E+03 -1.70044397E+03 -1.69698901E+03 -1.69353296E+03 + -1.69007703E+03 -1.68662195E+03 -1.68316602E+03 -1.67821899E+03 + -1.67327197E+03 -1.66832495E+03 -1.66337805E+03 -1.65843103E+03 + -1.71101196E+03 -1.70860901E+03 -1.70620605E+03 -1.70380298E+03 + -1.70140002E+03 -1.69804004E+03 -1.69468005E+03 -1.69131995E+03 + -1.68795898E+03 -1.68459900E+03 -1.67978406E+03 -1.67496997E+03 + -1.67015503E+03 -1.66533997E+03 -1.66052502E+03 -1.71691504E+03 + -1.71456702E+03 -1.71221899E+03 -1.70987097E+03 -1.70752295E+03 + -1.70420398E+03 -1.70088599E+03 -1.69756799E+03 -1.69424902E+03 + -1.69093103E+03 -1.68602795E+03 -1.68112500E+03 -1.67622095E+03 + -1.67131799E+03 -1.66641504E+03 -1.72436902E+03 -1.72193799E+03 + -1.71950696E+03 -1.71707495E+03 -1.71464404E+03 -1.71125000E+03 + -1.70785596E+03 -1.70446204E+03 -1.70106799E+03 -1.69767297E+03 + -1.69272400E+03 -1.68777405E+03 -1.68282495E+03 -1.67787500E+03 + -1.67292603E+03 -1.73245801E+03 -1.73005701E+03 -1.72765601E+03 + -1.72525500E+03 -1.72285303E+03 -1.71948901E+03 -1.71612402E+03 + -1.71275903E+03 -1.70939404E+03 -1.70603003E+03 -1.70109802E+03 + -1.69616602E+03 -1.69123499E+03 -1.68630298E+03 -1.68137097E+03 + -1.73977197E+03 -1.73741504E+03 -1.73505798E+03 -1.73270105E+03 + -1.73034399E+03 -1.72703503E+03 -1.72372595E+03 -1.72041797E+03 + -1.71710901E+03 -1.71380103E+03 -1.70894800E+03 -1.70409399E+03 + -1.69924097E+03 -1.69438794E+03 -1.68953503E+03 -1.74616003E+03 + -1.74376697E+03 -1.74137402E+03 -1.73898096E+03 -1.73658704E+03 + -1.73320898E+03 -1.72983105E+03 -1.72645300E+03 -1.72307495E+03 + -1.71969702E+03 -1.71474597E+03 -1.70979504E+03 -1.70484399E+03 + -1.69989404E+03 -1.69494299E+03 -1.75181897E+03 -1.74935205E+03 + -1.74688501E+03 -1.74441797E+03 -1.74195105E+03 -1.73849500E+03 + -1.73503894E+03 -1.73158398E+03 -1.72812805E+03 -1.72467200E+03 + -1.71964600E+03 -1.71462000E+03 -1.70959302E+03 -1.70456702E+03 + -1.69954102E+03 -1.75375195E+03 -1.75124500E+03 -1.74873804E+03 + -1.74623096E+03 -1.74372400E+03 -1.74022803E+03 -1.73673096E+03 + -1.73323499E+03 -1.72973804E+03 -1.72624194E+03 -1.72119397E+03 + -1.71614600E+03 -1.71109705E+03 -1.70604895E+03 -1.70100098E+03 + -1.75421106E+03 -1.75165405E+03 -1.74909595E+03 -1.74653894E+03 + -1.74398096E+03 -1.74045496E+03 -1.73692896E+03 -1.73340295E+03 + -1.72987598E+03 -1.72634998E+03 -1.72135400E+03 -1.71635901E+03 + -1.71136304E+03 -1.70636694E+03 -1.70137097E+03 -1.75715503E+03 + -1.75462903E+03 -1.75210303E+03 -1.74957703E+03 -1.74705103E+03 + -1.74344299E+03 -1.73983398E+03 -1.73622595E+03 -1.73261804E+03 + -1.72901001E+03 -1.72378601E+03 -1.71856201E+03 -1.71333801E+03 + -1.70811499E+03 -1.70289099E+03 -1.75128796E+03 -1.74928894E+03 + -1.74729004E+03 -1.74529102E+03 -1.74329199E+03 -1.74032495E+03 + -1.73735706E+03 -1.73439001E+03 -1.73142297E+03 -1.72845605E+03 + -1.72376501E+03 -1.71907397E+03 -1.71438306E+03 -1.70969202E+03 + -1.70500098E+03 -1.74243701E+03 -1.74073901E+03 -1.73904004E+03 + -1.73734204E+03 -1.73564404E+03 -1.73300305E+03 -1.73036304E+03 + -1.72772302E+03 -1.72508301E+03 -1.72244202E+03 -1.71805896E+03 + -1.71367505E+03 -1.70929199E+03 -1.70490796E+03 -1.70052405E+03 + -1.73949902E+03 -1.73736804E+03 -1.73523706E+03 -1.73310596E+03 + -1.73097498E+03 -1.72798804E+03 -1.72500000E+03 -1.72201294E+03 + -1.71902502E+03 -1.71603796E+03 -1.71130798E+03 -1.70657800E+03 + -1.70184705E+03 -1.69711694E+03 -1.69238696E+03 -1.73291504E+03 + -1.73085803E+03 -1.72880200E+03 -1.72674500E+03 -1.72468799E+03 + -1.72167200E+03 -1.71865503E+03 -1.71563904E+03 -1.71262195E+03 + -1.70960498E+03 -1.70537305E+03 -1.70114099E+03 -1.69690906E+03 + -1.69267700E+03 -1.68844495E+03 -1.71964795E+03 -1.71964795E+03 + -1.68995203E+03 -1.71964795E+03 -1.71794202E+03 -1.71794202E+03 + -1.68778296E+03 -1.71794202E+03 -1.71623596E+03 -1.71623596E+03 + -1.68561499E+03 -1.71623596E+03 -1.71453003E+03 -1.71453003E+03 + -1.68344604E+03 -1.71453003E+03 -1.71282397E+03 -1.71282397E+03 + -1.68127795E+03 -1.71282397E+03 -1.71001697E+03 -1.71001697E+03 + -1.67762097E+03 -1.71001697E+03 -1.70721106E+03 -1.70721106E+03 + -1.67396497E+03 -1.70721106E+03 -1.70440503E+03 -1.70440503E+03 + -1.67030798E+03 -1.70440503E+03 -1.70159802E+03 -1.70159802E+03 + -1.66665198E+03 -1.70159802E+03 -1.69879199E+03 -1.69879199E+03 + -1.66299500E+03 -1.69879199E+03 -1.69635498E+03 -1.69635498E+03 + -1.65828198E+03 -1.69635498E+03 -1.69391797E+03 -1.69391797E+03 + -1.65356897E+03 -1.69391797E+03 -1.69148096E+03 -1.69148096E+03 + -1.64885498E+03 -1.69148096E+03 -1.68904297E+03 -1.68904297E+03 + -1.64414197E+03 -1.68904297E+03 -1.68660596E+03 -1.68660596E+03 + -1.63942896E+03 -1.68660596E+03 -1.68843994E+03 -1.69921497E+03 + -1.68843994E+03 -1.69921497E+03 -1.68626599E+03 -1.69804004E+03 + -1.68626599E+03 -1.69804004E+03 -1.68409204E+03 -1.69686401E+03 + -1.68409204E+03 -1.69686401E+03 -1.68191797E+03 -1.69568799E+03 + -1.68191797E+03 -1.69568799E+03 -1.67974402E+03 -1.69451196E+03 + -1.67974402E+03 -1.69451196E+03 -1.67628198E+03 -1.69205798E+03 + -1.67628198E+03 -1.69205798E+03 -1.67281995E+03 -1.68960498E+03 + -1.67281995E+03 -1.68960498E+03 -1.66935803E+03 -1.68715100E+03 + -1.66935803E+03 -1.68715100E+03 -1.66589600E+03 -1.68469800E+03 + -1.66589600E+03 -1.68469800E+03 -1.66243396E+03 -1.68224500E+03 + -1.66243396E+03 -1.68224500E+03 -1.65769604E+03 -1.67932104E+03 + -1.65769604E+03 -1.67932104E+03 -1.65295801E+03 -1.67639697E+03 + -1.65295801E+03 -1.67639697E+03 -1.64821899E+03 -1.67347302E+03 + -1.64821899E+03 -1.67347302E+03 -1.64348096E+03 -1.67054895E+03 + -1.64348096E+03 -1.67054895E+03 -1.63874304E+03 -1.66762500E+03 + -1.63874304E+03 -1.66762500E+03 -1.68293799E+03 -1.68115796E+03 + -1.67937805E+03 -1.67759802E+03 -1.67581799E+03 -1.67307202E+03 + -1.67032605E+03 -1.66758105E+03 -1.66483496E+03 -1.66208899E+03 + -1.65770496E+03 -1.65332202E+03 -1.64893799E+03 -1.64455298E+03 + -1.64017004E+03 -1.68221301E+03 -1.68035901E+03 -1.67850598E+03 + -1.67665198E+03 -1.67479895E+03 -1.67198303E+03 -1.66916797E+03 + -1.66635303E+03 -1.66353796E+03 -1.66072302E+03 -1.65632300E+03 + -1.65192297E+03 -1.64752295E+03 -1.64312305E+03 -1.63872302E+03 + -1.69083899E+03 -1.69083899E+03 -1.69083899E+03 -1.69083899E+03 + -1.68861304E+03 -1.68861304E+03 -1.68861304E+03 -1.68861304E+03 + -1.68638794E+03 -1.68638794E+03 -1.68638794E+03 -1.68638794E+03 + -1.68416199E+03 -1.68416199E+03 -1.68416199E+03 -1.68416199E+03 + -1.68193701E+03 -1.68193701E+03 -1.68193701E+03 -1.68193701E+03 + -1.67877197E+03 -1.67877197E+03 -1.67877197E+03 -1.67877197E+03 + -1.67560803E+03 -1.67560803E+03 -1.67560803E+03 -1.67560803E+03 + -1.67244299E+03 -1.67244299E+03 -1.67244299E+03 -1.67244299E+03 + -1.66927795E+03 -1.66927795E+03 -1.66927795E+03 -1.66927795E+03 + -1.66611401E+03 -1.66611401E+03 -1.66611401E+03 -1.66611401E+03 + -1.66136401E+03 -1.66136401E+03 -1.66136401E+03 -1.66136401E+03 + -1.65661401E+03 -1.65661401E+03 -1.65661401E+03 -1.65661401E+03 + -1.65186304E+03 -1.65186304E+03 -1.65186304E+03 -1.65186304E+03 + -1.64711304E+03 -1.64711304E+03 -1.64711304E+03 -1.64711304E+03 + -1.64236304E+03 -1.64236304E+03 -1.64236304E+03 -1.64236304E+03 + -1.74920496E+03 -1.74920496E+03 -1.74920496E+03 -1.74920496E+03 + -1.74750500E+03 -1.74750500E+03 -1.74750500E+03 -1.74750500E+03 + -1.74580505E+03 -1.74580505E+03 -1.74580505E+03 -1.74580505E+03 + -1.74410498E+03 -1.74410498E+03 -1.74410498E+03 -1.74410498E+03 + -1.74240601E+03 -1.74240601E+03 -1.74240601E+03 -1.74240601E+03 + -1.73973499E+03 -1.73973499E+03 -1.73973499E+03 -1.73973499E+03 + -1.73706396E+03 -1.73706396E+03 -1.73706396E+03 -1.73706396E+03 + -1.73439294E+03 -1.73439294E+03 -1.73439294E+03 -1.73439294E+03 + -1.73172302E+03 -1.73172302E+03 -1.73172302E+03 -1.73172302E+03 + -1.72905200E+03 -1.72905200E+03 -1.72905200E+03 -1.72905200E+03 + -1.72440198E+03 -1.72440198E+03 -1.72440198E+03 -1.72440198E+03 + -1.71975098E+03 -1.71975098E+03 -1.71975098E+03 -1.71975098E+03 + -1.71510095E+03 -1.71510095E+03 -1.71510095E+03 -1.71510095E+03 + -1.71045105E+03 -1.71045105E+03 -1.71045105E+03 -1.71045105E+03 + -1.70580103E+03 -1.70580103E+03 -1.70580103E+03 -1.70580103E+03 + -1.73926599E+03 -1.73690503E+03 -1.73454297E+03 -1.73218201E+03 + -1.72982104E+03 -1.72649402E+03 -1.72316699E+03 -1.71983997E+03 + -1.71651294E+03 -1.71318604E+03 -1.70809094E+03 -1.70299695E+03 + -1.69790295E+03 -1.69280798E+03 -1.68771399E+03 -1.73046704E+03 + -1.72819299E+03 -1.72592004E+03 -1.72364600E+03 -1.72137305E+03 + -1.71792798E+03 -1.71448303E+03 -1.71103796E+03 -1.70759302E+03 + -1.70414905E+03 -1.69879504E+03 -1.69344104E+03 -1.68808801E+03 + -1.68273401E+03 -1.67738000E+03 -1.72198999E+03 -1.71941797E+03 + -1.71684595E+03 -1.71427295E+03 -1.71170105E+03 -1.70808105E+03 + -1.70445996E+03 -1.70083997E+03 -1.69721997E+03 -1.69359998E+03 + -1.68838501E+03 -1.68317102E+03 -1.67795605E+03 -1.67274097E+03 + -1.66752600E+03 -1.72006995E+03 -1.71760205E+03 -1.71513306E+03 + -1.71266394E+03 -1.71019495E+03 -1.70656201E+03 -1.70293005E+03 + -1.69929797E+03 -1.69566504E+03 -1.69203296E+03 -1.68665002E+03 + -1.68126794E+03 -1.67588501E+03 -1.67050195E+03 -1.66512000E+03 + -1.72406396E+03 -1.72148401E+03 -1.71890405E+03 -1.71632495E+03 + -1.71374500E+03 -1.71008801E+03 -1.70643103E+03 -1.70277405E+03 + -1.69911694E+03 -1.69545996E+03 -1.69000098E+03 -1.68454297E+03 + -1.67908398E+03 -1.67362500E+03 -1.66816699E+03 -1.72963000E+03 + -1.72706006E+03 -1.72448901E+03 -1.72191895E+03 -1.71934802E+03 + -1.71573303E+03 -1.71211804E+03 -1.70850195E+03 -1.70488696E+03 + -1.70127197E+03 -1.69593005E+03 -1.69058801E+03 -1.68524500E+03 + -1.67990295E+03 -1.67456104E+03 -1.73606995E+03 -1.73342798E+03 + -1.73078601E+03 -1.72814404E+03 -1.72550195E+03 -1.72189197E+03 + -1.71828198E+03 -1.71467200E+03 -1.71106201E+03 -1.70745105E+03 + -1.70218604E+03 -1.69692004E+03 -1.69165503E+03 -1.68638904E+03 + -1.68112402E+03 -1.74426501E+03 -1.74164600E+03 -1.73902698E+03 + -1.73640796E+03 -1.73378894E+03 -1.73018994E+03 -1.72658997E+03 + -1.72299097E+03 -1.71939099E+03 -1.71579199E+03 -1.71055798E+03 + -1.70532397E+03 -1.70008997E+03 -1.69485596E+03 -1.68962195E+03 + -1.75031799E+03 -1.74775696E+03 -1.74519495E+03 -1.74263403E+03 + -1.74007202E+03 -1.73651196E+03 -1.73295300E+03 -1.72939294E+03 + -1.72583398E+03 -1.72227405E+03 -1.71709302E+03 -1.71191296E+03 + -1.70673206E+03 -1.70155103E+03 -1.69637000E+03 -1.75553406E+03 + -1.75313098E+03 -1.75072803E+03 -1.74832495E+03 -1.74592200E+03 + -1.74242004E+03 -1.73891797E+03 -1.73541602E+03 -1.73191394E+03 + -1.72841199E+03 -1.72313599E+03 -1.71785999E+03 -1.71258398E+03 + -1.70730798E+03 -1.70203198E+03 -1.76315405E+03 -1.76050500E+03 + -1.75785596E+03 -1.75520703E+03 -1.75255701E+03 -1.74875500E+03 + -1.74495398E+03 -1.74115198E+03 -1.73734998E+03 -1.73354797E+03 + -1.72804895E+03 -1.72255005E+03 -1.71705103E+03 -1.71155200E+03 + -1.70605396E+03 -1.77453406E+03 -1.77154602E+03 -1.76855896E+03 + -1.76557202E+03 -1.76258496E+03 -1.75852795E+03 -1.75447095E+03 + -1.75041394E+03 -1.74635706E+03 -1.74230103E+03 -1.73680200E+03 + -1.73130298E+03 -1.72580396E+03 -1.72030505E+03 -1.71480603E+03 + -1.77342896E+03 -1.77180298E+03 -1.77017700E+03 -1.76855103E+03 + -1.76692505E+03 -1.76418201E+03 -1.76143799E+03 -1.75869495E+03 + -1.75595105E+03 -1.75320801E+03 -1.74879602E+03 -1.74438501E+03 + -1.73997302E+03 -1.73556201E+03 -1.73115002E+03 -1.77040295E+03 + -1.76857104E+03 -1.76673901E+03 -1.76490698E+03 -1.76307495E+03 + -1.76003003E+03 -1.75698499E+03 -1.75393994E+03 -1.75089502E+03 + -1.74784998E+03 -1.74292700E+03 -1.73800403E+03 -1.73308105E+03 + -1.72815796E+03 -1.72323499E+03 -1.76087903E+03 -1.75918005E+03 + -1.75748096E+03 -1.75578198E+03 -1.75408398E+03 -1.75134302E+03 + -1.74860205E+03 -1.74586096E+03 -1.74312000E+03 -1.74038000E+03 + -1.73624902E+03 -1.73211804E+03 -1.72798706E+03 -1.72385498E+03 + -1.71972400E+03 -1.75148901E+03 -1.74987402E+03 -1.74826001E+03 + -1.74664502E+03 -1.74503101E+03 -1.74249194E+03 -1.73995398E+03 + -1.73741602E+03 -1.73487695E+03 -1.73233899E+03 -1.72856494E+03 + -1.72479199E+03 -1.72101904E+03 -1.71724500E+03 -1.71347205E+03 + -1.74556006E+03 -1.74376099E+03 -1.74196301E+03 -1.74016394E+03 + -1.73836499E+03 -1.73562805E+03 -1.73289099E+03 -1.73015295E+03 + -1.72741602E+03 -1.72467896E+03 -1.72057800E+03 -1.71647705E+03 + -1.71237695E+03 -1.70827600E+03 -1.70417505E+03 -1.73746802E+03 + -1.73562000E+03 -1.73377295E+03 -1.73192505E+03 -1.73007800E+03 + -1.72721399E+03 -1.72434998E+03 -1.72148706E+03 -1.71862305E+03 + -1.71575903E+03 -1.71206494E+03 -1.70837000E+03 -1.70467505E+03 + -1.70097998E+03 -1.69728503E+03 -1.72407800E+03 -1.72245300E+03 + -1.72082898E+03 -1.71920398E+03 -1.71757898E+03 -1.71483496E+03 + -1.71208899E+03 -1.70934497E+03 -1.70659998E+03 -1.70385498E+03 + -1.70109802E+03 -1.69834094E+03 -1.69558496E+03 -1.69282800E+03 + -1.69007202E+03 -1.70792102E+03 -1.70668799E+03 -1.70545605E+03 + -1.70422302E+03 -1.70298999E+03 -1.70041602E+03 -1.69784094E+03 + -1.69526697E+03 -1.69269299E+03 -1.69011804E+03 -1.68694495E+03 + -1.68377197E+03 -1.68059900E+03 -1.67742505E+03 -1.67425195E+03 + -1.69683997E+03 -1.69553406E+03 -1.69422803E+03 -1.69292200E+03 + -1.69161597E+03 -1.68913501E+03 -1.68665405E+03 -1.68417297E+03 + -1.68169202E+03 -1.67921106E+03 -1.67539502E+03 -1.67157898E+03 + -1.66776404E+03 -1.66394800E+03 -1.66013196E+03 -1.69381006E+03 + -1.69231104E+03 -1.69081201E+03 -1.68931299E+03 -1.68781396E+03 + -1.68544995E+03 -1.68308606E+03 -1.68072095E+03 -1.67835706E+03 + -1.67599194E+03 -1.67230005E+03 -1.66860706E+03 -1.66491504E+03 + -1.66122205E+03 -1.65753003E+03 -1.69870703E+03 -1.69870703E+03 + -1.69870703E+03 -1.69870703E+03 -1.69691003E+03 -1.69691003E+03 + -1.69691003E+03 -1.69691003E+03 -1.69511304E+03 -1.69511304E+03 + -1.69511304E+03 -1.69511304E+03 -1.69331604E+03 -1.69331604E+03 + -1.69331604E+03 -1.69331604E+03 -1.69151904E+03 -1.69151904E+03 + -1.69151904E+03 -1.69151904E+03 -1.68883398E+03 -1.68883398E+03 + -1.68883398E+03 -1.68883398E+03 -1.68615002E+03 -1.68615002E+03 + -1.68615002E+03 -1.68615002E+03 -1.68346594E+03 -1.68346594E+03 + -1.68346594E+03 -1.68346594E+03 -1.68078198E+03 -1.68078198E+03 + -1.68078198E+03 -1.68078198E+03 -1.67809802E+03 -1.67809802E+03 + -1.67809802E+03 -1.67809802E+03 -1.67398901E+03 -1.67398901E+03 + -1.67398901E+03 -1.67398901E+03 -1.66988000E+03 -1.66988000E+03 + -1.66988000E+03 -1.66988000E+03 -1.66577100E+03 -1.66577100E+03 + -1.66577100E+03 -1.66577100E+03 -1.66166199E+03 -1.66166199E+03 + -1.66166199E+03 -1.66166199E+03 -1.65755396E+03 -1.65755396E+03 + -1.65755396E+03 -1.65755396E+03 -1.76056104E+03 -1.76056104E+03 + -1.76056104E+03 -1.76056104E+03 -1.75818896E+03 -1.75818896E+03 + -1.75818896E+03 -1.75818896E+03 -1.75581702E+03 -1.75581702E+03 + -1.75581702E+03 -1.75581702E+03 -1.75344495E+03 -1.75344495E+03 + -1.75344495E+03 -1.75344495E+03 -1.75107300E+03 -1.75107300E+03 + -1.75107300E+03 -1.75107300E+03 -1.74850598E+03 -1.74850598E+03 + -1.74850598E+03 -1.74850598E+03 -1.74593994E+03 -1.74593994E+03 + -1.74593994E+03 -1.74593994E+03 -1.74337402E+03 -1.74337402E+03 + -1.74337402E+03 -1.74337402E+03 -1.74080798E+03 -1.74080798E+03 + -1.74080798E+03 -1.74080798E+03 -1.73824194E+03 -1.73824194E+03 + -1.73824194E+03 -1.73824194E+03 -1.73390198E+03 -1.73390198E+03 + -1.73390198E+03 -1.73390198E+03 -1.72956299E+03 -1.72956299E+03 + -1.72956299E+03 -1.72956299E+03 -1.72522302E+03 -1.72522302E+03 + -1.72522302E+03 -1.72522302E+03 -1.72088403E+03 -1.72088403E+03 + -1.72088403E+03 -1.72088403E+03 -1.71654395E+03 -1.71654395E+03 + -1.71654395E+03 -1.71654395E+03 -1.74937000E+03 -1.74703503E+03 + -1.74469897E+03 -1.74236401E+03 -1.74002905E+03 -1.73717896E+03 + -1.73432898E+03 -1.73147998E+03 -1.72863000E+03 -1.72578003E+03 + -1.72114697E+03 -1.71651294E+03 -1.71187903E+03 -1.70724500E+03 + -1.70261206E+03 -1.74264697E+03 -1.74045300E+03 -1.73825806E+03 + -1.73606396E+03 -1.73386902E+03 -1.73087695E+03 -1.72788403E+03 + -1.72489099E+03 -1.72189905E+03 -1.71890601E+03 -1.71417896E+03 + -1.70945105E+03 -1.70472400E+03 -1.69999695E+03 -1.69526904E+03 + -1.73715295E+03 -1.73504504E+03 -1.73293701E+03 -1.73082898E+03 + -1.72872095E+03 -1.72554102E+03 -1.72235999E+03 -1.71918005E+03 + -1.71599902E+03 -1.71281897E+03 -1.70779504E+03 -1.70277002E+03 + -1.69774597E+03 -1.69272095E+03 -1.68769702E+03 -1.73114502E+03 + -1.72944299E+03 -1.72774097E+03 -1.72603796E+03 -1.72433606E+03 + -1.72142700E+03 -1.71851904E+03 -1.71560999E+03 -1.71270203E+03 + -1.70979297E+03 -1.70485400E+03 -1.69991602E+03 -1.69497705E+03 + -1.69003894E+03 -1.68509998E+03 -1.73346497E+03 -1.73162097E+03 + -1.72977698E+03 -1.72793298E+03 -1.72608899E+03 -1.72310400E+03 + -1.72012000E+03 -1.71713501E+03 -1.71415002E+03 -1.71116602E+03 + -1.70619800E+03 -1.70123096E+03 -1.69626294E+03 -1.69129602E+03 + -1.68632800E+03 -1.73789099E+03 -1.73578601E+03 -1.73368103E+03 + -1.73157495E+03 -1.72946997E+03 -1.72628796E+03 -1.72310596E+03 + -1.71992395E+03 -1.71674304E+03 -1.71356104E+03 -1.70852100E+03 + -1.70347998E+03 -1.69843994E+03 -1.69340002E+03 -1.68835999E+03 + -1.74418994E+03 -1.74186694E+03 -1.73954395E+03 -1.73722205E+03 + -1.73489905E+03 -1.73150806E+03 -1.72811694E+03 -1.72472595E+03 + -1.72133606E+03 -1.71794495E+03 -1.71287500E+03 -1.70780505E+03 + -1.70273596E+03 -1.69766602E+03 -1.69259595E+03 -1.74963196E+03 + -1.74741394E+03 -1.74519495E+03 -1.74297595E+03 -1.74075696E+03 + -1.73751904E+03 -1.73428101E+03 -1.73104297E+03 -1.72780505E+03 + -1.72456702E+03 -1.71962195E+03 -1.71467798E+03 -1.70973303E+03 + -1.70478894E+03 -1.69984399E+03 -1.75782202E+03 -1.75523499E+03 + -1.75264697E+03 -1.75006006E+03 -1.74747302E+03 -1.74389600E+03 + -1.74031995E+03 -1.73674402E+03 -1.73316699E+03 -1.72958997E+03 + -1.72443994E+03 -1.71928894E+03 -1.71413794E+03 -1.70898804E+03 + -1.70383704E+03 -1.76193994E+03 -1.76036804E+03 -1.75879504E+03 + -1.75722302E+03 -1.75565100E+03 -1.75303198E+03 -1.75041394E+03 + -1.74779602E+03 -1.74517700E+03 -1.74255896E+03 -1.73850000E+03 + -1.73443994E+03 -1.73038098E+03 -1.72632202E+03 -1.72226196E+03 + -1.77579102E+03 -1.77462695E+03 -1.77346399E+03 -1.77230005E+03 + -1.77113599E+03 -1.76907202E+03 -1.76700806E+03 -1.76494397E+03 + -1.76288000E+03 -1.76081604E+03 -1.75688196E+03 -1.75294897E+03 + -1.74901599E+03 -1.74508301E+03 -1.74115002E+03 -1.79245703E+03 + -1.79042798E+03 -1.78839905E+03 -1.78637000E+03 -1.78433997E+03 + -1.78117798E+03 -1.77801599E+03 -1.77485303E+03 -1.77169104E+03 + -1.76852795E+03 -1.76353601E+03 -1.75854395E+03 -1.75355298E+03 + -1.74856104E+03 -1.74356897E+03 -1.78893298E+03 -1.78738599E+03 + -1.78583899E+03 -1.78429199E+03 -1.78274500E+03 -1.78008997E+03 + -1.77743506E+03 -1.77478101E+03 -1.77212598E+03 -1.76947095E+03 + -1.76533203E+03 -1.76119299E+03 -1.75705298E+03 -1.75291394E+03 + -1.74877405E+03 -1.77789502E+03 -1.77647803E+03 -1.77506201E+03 + -1.77364502E+03 -1.77222803E+03 -1.76969604E+03 -1.76716504E+03 + -1.76463306E+03 -1.76210205E+03 -1.75956995E+03 -1.75559900E+03 + -1.75162903E+03 -1.74765796E+03 -1.74368701E+03 -1.73971594E+03 + -1.76891895E+03 -1.76739905E+03 -1.76587903E+03 -1.76435901E+03 + -1.76283997E+03 -1.76017102E+03 -1.75750098E+03 -1.75483203E+03 + -1.75216296E+03 -1.74949402E+03 -1.74548499E+03 -1.74147595E+03 + -1.73746802E+03 -1.73345898E+03 -1.72944995E+03 -1.76021204E+03 + -1.75862000E+03 -1.75702698E+03 -1.75543506E+03 -1.75384204E+03 + -1.75108899E+03 -1.74833496E+03 -1.74558203E+03 -1.74282800E+03 + -1.74007397E+03 -1.73613696E+03 -1.73219995E+03 -1.72826294E+03 + -1.72432605E+03 -1.72038904E+03 -1.75145398E+03 -1.74979895E+03 + -1.74814404E+03 -1.74648901E+03 -1.74483496E+03 -1.74200806E+03 + -1.73918201E+03 -1.73635498E+03 -1.73352795E+03 -1.73070203E+03 + -1.72675696E+03 -1.72281201E+03 -1.71886694E+03 -1.71492200E+03 + -1.71097705E+03 -1.74132397E+03 -1.73962305E+03 -1.73792200E+03 + -1.73621997E+03 -1.73451904E+03 -1.73159900E+03 -1.72867798E+03 + -1.72575806E+03 -1.72283801E+03 -1.71991699E+03 -1.71612903E+03 + -1.71233997E+03 -1.70855103E+03 -1.70476196E+03 -1.70097400E+03 + -1.72871204E+03 -1.72707898E+03 -1.72544702E+03 -1.72381396E+03 + -1.72218201E+03 -1.71925195E+03 -1.71632202E+03 -1.71339197E+03 + -1.71046204E+03 -1.70753198E+03 -1.70403101E+03 -1.70052905E+03 + -1.69702795E+03 -1.69352600E+03 -1.69002502E+03 -1.72033801E+03 + -1.71889600E+03 -1.71745300E+03 -1.71601099E+03 -1.71456799E+03 + -1.71171204E+03 -1.70885596E+03 -1.70600000E+03 -1.70314294E+03 + -1.70028699E+03 -1.69668994E+03 -1.69309302E+03 -1.68949597E+03 + -1.68589905E+03 -1.68230200E+03 -1.71376196E+03 -1.71235095E+03 + -1.71093994E+03 -1.70952905E+03 -1.70811694E+03 -1.70542102E+03 + -1.70272595E+03 -1.70003003E+03 -1.69733398E+03 -1.69463794E+03 + -1.69086902E+03 -1.68709998E+03 -1.68333203E+03 -1.67956299E+03 + -1.67579395E+03 -1.71148499E+03 -1.70990698E+03 -1.70832898E+03 + -1.70675098E+03 -1.70517297E+03 -1.70252795E+03 -1.69988196E+03 + -1.69723706E+03 -1.69459204E+03 -1.69194702E+03 -1.68801599E+03 + -1.68408496E+03 -1.68015405E+03 -1.67622302E+03 -1.67229199E+03 + -1.71359900E+03 -1.71359900E+03 -1.71359900E+03 -1.71359900E+03 + -1.71184094E+03 -1.71184094E+03 -1.71184094E+03 -1.71184094E+03 + -1.71008301E+03 -1.71008301E+03 -1.71008301E+03 -1.71008301E+03 + -1.70832605E+03 -1.70832605E+03 -1.70832605E+03 -1.70832605E+03 + -1.70656799E+03 -1.70656799E+03 -1.70656799E+03 -1.70656799E+03 + -1.70385706E+03 -1.70385706E+03 -1.70385706E+03 -1.70385706E+03 + -1.70114600E+03 -1.70114600E+03 -1.70114600E+03 -1.70114600E+03 + -1.69843506E+03 -1.69843506E+03 -1.69843506E+03 -1.69843506E+03 + -1.69572400E+03 -1.69572400E+03 -1.69572400E+03 -1.69572400E+03 + -1.69301196E+03 -1.69301196E+03 -1.69301196E+03 -1.69301196E+03 + -1.68889404E+03 -1.68889404E+03 -1.68889404E+03 -1.68889404E+03 + -1.68477502E+03 -1.68477502E+03 -1.68477502E+03 -1.68477502E+03 + -1.68065601E+03 -1.68065601E+03 -1.68065601E+03 -1.68065601E+03 + -1.67653699E+03 -1.67653699E+03 -1.67653699E+03 -1.67653699E+03 + -1.67241797E+03 -1.67241797E+03 -1.67241797E+03 -1.67241797E+03 + -1.77094104E+03 -1.77094104E+03 -1.77094104E+03 -1.77094104E+03 + -1.76805798E+03 -1.76805798E+03 -1.76805798E+03 -1.76805798E+03 + -1.76517603E+03 -1.76517603E+03 -1.76517603E+03 -1.76517603E+03 + -1.76229297E+03 -1.76229297E+03 -1.76229297E+03 -1.76229297E+03 + -1.75941003E+03 -1.75941003E+03 -1.75941003E+03 -1.75941003E+03 + -1.75684998E+03 -1.75684998E+03 -1.75684998E+03 -1.75684998E+03 + -1.75428894E+03 -1.75428894E+03 -1.75428894E+03 -1.75428894E+03 + -1.75172900E+03 -1.75172900E+03 -1.75172900E+03 -1.75172900E+03 + -1.74916895E+03 -1.74916895E+03 -1.74916895E+03 -1.74916895E+03 + -1.74660901E+03 -1.74660901E+03 -1.74660901E+03 -1.74660901E+03 + -1.74219604E+03 -1.74219604E+03 -1.74219604E+03 -1.74219604E+03 + -1.73778296E+03 -1.73778296E+03 -1.73778296E+03 -1.73778296E+03 + -1.73337000E+03 -1.73337000E+03 -1.73337000E+03 -1.73337000E+03 + -1.72895801E+03 -1.72895801E+03 -1.72895801E+03 -1.72895801E+03 + -1.72454504E+03 -1.72454504E+03 -1.72454504E+03 -1.72454504E+03 + -1.75891895E+03 -1.75634399E+03 -1.75376904E+03 -1.75119299E+03 + -1.74861804E+03 -1.74593896E+03 -1.74326001E+03 -1.74057996E+03 + -1.73790100E+03 -1.73522205E+03 -1.73072803E+03 -1.72623499E+03 + -1.72174194E+03 -1.71724805E+03 -1.71275500E+03 -1.75093799E+03 + -1.74870203E+03 -1.74646497E+03 -1.74422900E+03 -1.74199304E+03 + -1.73924097E+03 -1.73648901E+03 -1.73373706E+03 -1.73098499E+03 + -1.72823303E+03 -1.72375696E+03 -1.71928101E+03 -1.71480603E+03 + -1.71032996E+03 -1.70585400E+03 -1.74514001E+03 -1.74329395E+03 + -1.74144800E+03 -1.73960205E+03 -1.73775598E+03 -1.73511694E+03 + -1.73247705E+03 -1.72983704E+03 -1.72719800E+03 -1.72455798E+03 + -1.72023096E+03 -1.71590405E+03 -1.71157703E+03 -1.70725000E+03 + -1.70292200E+03 -1.74181201E+03 -1.74029504E+03 -1.73877795E+03 + -1.73726099E+03 -1.73574402E+03 -1.73334802E+03 -1.73095203E+03 + -1.72855603E+03 -1.72615906E+03 -1.72376294E+03 -1.71974500E+03 + -1.71572705E+03 -1.71170898E+03 -1.70769104E+03 -1.70367200E+03 + -1.74267004E+03 -1.74115100E+03 -1.73963196E+03 -1.73811401E+03 + -1.73659497E+03 -1.73418896E+03 -1.73178296E+03 -1.72937695E+03 + -1.72697095E+03 -1.72456494E+03 -1.72057703E+03 -1.71658801E+03 + -1.71259998E+03 -1.70861096E+03 -1.70462305E+03 -1.74572900E+03 + -1.74400500E+03 -1.74228101E+03 -1.74055603E+03 -1.73883203E+03 + -1.73617395E+03 -1.73351599E+03 -1.73085803E+03 -1.72819995E+03 + -1.72554199E+03 -1.72125903E+03 -1.71697595E+03 -1.71269202E+03 + -1.70840906E+03 -1.70412598E+03 -1.74982397E+03 -1.74804797E+03 + -1.74627197E+03 -1.74449597E+03 -1.74271997E+03 -1.73995898E+03 + -1.73719702E+03 -1.73443604E+03 -1.73167395E+03 -1.72891296E+03 + -1.72446399E+03 -1.72001501E+03 -1.71556604E+03 -1.71111694E+03 + -1.70666797E+03 -1.75425000E+03 -1.75255005E+03 -1.75084998E+03 + -1.74915002E+03 -1.74744995E+03 -1.74484802E+03 -1.74224500E+03 + -1.73964294E+03 -1.73704004E+03 -1.73443799E+03 -1.73026794E+03 + -1.72609900E+03 -1.72192896E+03 -1.71776001E+03 -1.71358997E+03 + -1.76321899E+03 -1.76097095E+03 -1.75872400E+03 -1.75647705E+03 + -1.75422900E+03 -1.75103296E+03 -1.74783704E+03 -1.74464099E+03 + -1.74144495E+03 -1.73824902E+03 -1.73332996E+03 -1.72841101E+03 + -1.72349194E+03 -1.71857300E+03 -1.71365405E+03 -1.77213098E+03 + -1.77000098E+03 -1.76787195E+03 -1.76574194E+03 -1.76361304E+03 + -1.76048303E+03 -1.75735303E+03 -1.75422302E+03 -1.75109302E+03 + -1.74796301E+03 -1.74340002E+03 -1.73883801E+03 -1.73427502E+03 + -1.72971301E+03 -1.72515002E+03 -1.78275098E+03 -1.78125500E+03 + -1.77975903E+03 -1.77826294E+03 -1.77676599E+03 -1.77455396E+03 + -1.77234094E+03 -1.77012903E+03 -1.76791602E+03 -1.76570300E+03 + -1.76237000E+03 -1.75903699E+03 -1.75570398E+03 -1.75237097E+03 + -1.74903796E+03 -1.79065198E+03 -1.78913501E+03 -1.78761694E+03 + -1.78609998E+03 -1.78458203E+03 -1.78217200E+03 -1.77976196E+03 + -1.77735205E+03 -1.77494202E+03 -1.77253198E+03 -1.76868298E+03 + -1.76483301E+03 -1.76098303E+03 -1.75713403E+03 -1.75328406E+03 + -1.78936499E+03 -1.78785706E+03 -1.78634900E+03 -1.78484094E+03 + -1.78333398E+03 -1.78076001E+03 -1.77818701E+03 -1.77561401E+03 + -1.77304102E+03 -1.77046704E+03 -1.76641602E+03 -1.76236499E+03 + -1.75831396E+03 -1.75426196E+03 -1.75021106E+03 -1.78218298E+03 + -1.78072498E+03 -1.77926697E+03 -1.77781006E+03 -1.77635205E+03 + -1.77370996E+03 -1.77106897E+03 -1.76842798E+03 -1.76578601E+03 + -1.76314502E+03 -1.75910803E+03 -1.75507202E+03 -1.75103503E+03 + -1.74699805E+03 -1.74296204E+03 -1.77390796E+03 -1.77241895E+03 + -1.77093005E+03 -1.76944202E+03 -1.76795300E+03 -1.76518201E+03 + -1.76241101E+03 -1.75964001E+03 -1.75686902E+03 -1.75409802E+03 + -1.75002100E+03 -1.74594397E+03 -1.74186694E+03 -1.73778894E+03 + -1.73371204E+03 -1.76542102E+03 -1.76385999E+03 -1.76229895E+03 + -1.76073901E+03 -1.75917798E+03 -1.75628601E+03 -1.75339502E+03 + -1.75050403E+03 -1.74761304E+03 -1.74472095E+03 -1.74061304E+03 + -1.73650500E+03 -1.73239697E+03 -1.72828796E+03 -1.72418005E+03 + -1.75596204E+03 -1.75429797E+03 -1.75263403E+03 -1.75097095E+03 + -1.74930701E+03 -1.74638599E+03 -1.74346497E+03 -1.74054504E+03 + -1.73762402E+03 -1.73470300E+03 -1.73052698E+03 -1.72634998E+03 + -1.72217395E+03 -1.71799695E+03 -1.71381995E+03 -1.74536597E+03 + -1.74378198E+03 -1.74219800E+03 -1.74061401E+03 -1.73903003E+03 + -1.73608105E+03 -1.73313196E+03 -1.73018201E+03 -1.72723303E+03 + -1.72428406E+03 -1.72014294E+03 -1.71600305E+03 -1.71186206E+03 + -1.70772095E+03 -1.70358105E+03 -1.73706396E+03 -1.73535901E+03 + -1.73365295E+03 -1.73194800E+03 -1.73024194E+03 -1.72721301E+03 + -1.72418298E+03 -1.72115405E+03 -1.71812402E+03 -1.71509497E+03 + -1.71117297E+03 -1.70725098E+03 -1.70332898E+03 -1.69940698E+03 + -1.69548499E+03 -1.73172803E+03 -1.73014001E+03 -1.72855200E+03 + -1.72696399E+03 -1.72537598E+03 -1.72237305E+03 -1.71937000E+03 + -1.71636694E+03 -1.71336401E+03 -1.71036096E+03 -1.70648303E+03 + -1.70260596E+03 -1.69872803E+03 -1.69484998E+03 -1.69097302E+03 + -1.72714197E+03 -1.72558203E+03 -1.72402197E+03 -1.72246204E+03 + -1.72090198E+03 -1.71796802E+03 -1.71503296E+03 -1.71209802E+03 + -1.70916296E+03 -1.70622803E+03 -1.70226697E+03 -1.69830701E+03 + -1.69434595E+03 -1.69038501E+03 -1.68642395E+03 -1.72523901E+03 + -1.72357104E+03 -1.72190295E+03 -1.72023401E+03 -1.71856604E+03 + -1.71571802E+03 -1.71286902E+03 -1.71002002E+03 -1.70717200E+03 + -1.70432300E+03 -1.70026904E+03 -1.69621399E+03 -1.69216003E+03 + -1.68810596E+03 -1.68405200E+03 -1.72654199E+03 -1.72654199E+03 + -1.72654199E+03 -1.72654199E+03 -1.72472595E+03 -1.72472595E+03 + -1.72472595E+03 -1.72472595E+03 -1.72290906E+03 -1.72290906E+03 + -1.72290906E+03 -1.72290906E+03 -1.72109204E+03 -1.72109204E+03 + -1.72109204E+03 -1.72109204E+03 -1.71927502E+03 -1.71927502E+03 + -1.71927502E+03 -1.71927502E+03 -1.71644604E+03 -1.71644604E+03 + -1.71644604E+03 -1.71644604E+03 -1.71361694E+03 -1.71361694E+03 + -1.71361694E+03 -1.71361694E+03 -1.71078796E+03 -1.71078796E+03 + -1.71078796E+03 -1.71078796E+03 -1.70795898E+03 -1.70795898E+03 + -1.70795898E+03 -1.70795898E+03 -1.70513000E+03 -1.70513000E+03 + -1.70513000E+03 -1.70513000E+03 -1.70096594E+03 -1.70096594E+03 + -1.70096594E+03 -1.70096594E+03 -1.69680298E+03 -1.69680298E+03 + -1.69680298E+03 -1.69680298E+03 -1.69263904E+03 -1.69263904E+03 + -1.69263904E+03 -1.69263904E+03 -1.68847595E+03 -1.68847595E+03 + -1.68847595E+03 -1.68847595E+03 -1.68431201E+03 -1.68431201E+03 + -1.68431201E+03 -1.68431201E+03 -1.77363501E+03 -1.77363501E+03 + -1.77363501E+03 -1.77363501E+03 -1.77091797E+03 -1.77091797E+03 + -1.77091797E+03 -1.77091797E+03 -1.76820203E+03 -1.76820203E+03 + -1.76820203E+03 -1.76820203E+03 -1.76548499E+03 -1.76548499E+03 + -1.76548499E+03 -1.76548499E+03 -1.76276794E+03 -1.76276794E+03 + -1.76276794E+03 -1.76276794E+03 -1.76044299E+03 -1.76044299E+03 + -1.76044299E+03 -1.76044299E+03 -1.75811694E+03 -1.75811694E+03 + -1.75811694E+03 -1.75811694E+03 -1.75579199E+03 -1.75579199E+03 + -1.75579199E+03 -1.75579199E+03 -1.75346594E+03 -1.75346594E+03 + -1.75346594E+03 -1.75346594E+03 -1.75114099E+03 -1.75114099E+03 + -1.75114099E+03 -1.75114099E+03 -1.74703796E+03 -1.74703796E+03 + -1.74703796E+03 -1.74703796E+03 -1.74293506E+03 -1.74293506E+03 + -1.74293506E+03 -1.74293506E+03 -1.73883203E+03 -1.73883203E+03 + -1.73883203E+03 -1.73883203E+03 -1.73472900E+03 -1.73472900E+03 + -1.73472900E+03 -1.73472900E+03 -1.73062695E+03 -1.73062695E+03 + -1.73062695E+03 -1.73062695E+03 -1.76163904E+03 -1.76163904E+03 + -1.76163904E+03 -1.76163904E+03 -1.75924500E+03 -1.75924500E+03 + -1.75924500E+03 -1.75924500E+03 -1.75685095E+03 -1.75685095E+03 + -1.75685095E+03 -1.75685095E+03 -1.75445605E+03 -1.75445605E+03 + -1.75445605E+03 -1.75445605E+03 -1.75206201E+03 -1.75206201E+03 + -1.75206201E+03 -1.75206201E+03 -1.74967297E+03 -1.74967297E+03 + -1.74967297E+03 -1.74967297E+03 -1.74728406E+03 -1.74728406E+03 + -1.74728406E+03 -1.74728406E+03 -1.74489502E+03 -1.74489502E+03 + -1.74489502E+03 -1.74489502E+03 -1.74250598E+03 -1.74250598E+03 + -1.74250598E+03 -1.74250598E+03 -1.74011597E+03 -1.74011597E+03 + -1.74011597E+03 -1.74011597E+03 -1.73601794E+03 -1.73601794E+03 + -1.73601794E+03 -1.73601794E+03 -1.73191895E+03 -1.73191895E+03 + -1.73191895E+03 -1.73191895E+03 -1.72781995E+03 -1.72781995E+03 + -1.72781995E+03 -1.72781995E+03 -1.72372205E+03 -1.72372205E+03 + -1.72372205E+03 -1.72372205E+03 -1.71962305E+03 -1.71962305E+03 + -1.71962305E+03 -1.71962305E+03 -1.75340503E+03 -1.75340503E+03 + -1.75340503E+03 -1.75340503E+03 -1.75134998E+03 -1.75134998E+03 + -1.75134998E+03 -1.75134998E+03 -1.74929395E+03 -1.74929395E+03 + -1.74929395E+03 -1.74929395E+03 -1.74723901E+03 -1.74723901E+03 + -1.74723901E+03 -1.74723901E+03 -1.74518396E+03 -1.74518396E+03 + -1.74518396E+03 -1.74518396E+03 -1.74276001E+03 -1.74276001E+03 + -1.74276001E+03 -1.74276001E+03 -1.74033606E+03 -1.74033606E+03 + -1.74033606E+03 -1.74033606E+03 -1.73791199E+03 -1.73791199E+03 + -1.73791199E+03 -1.73791199E+03 -1.73548901E+03 -1.73548901E+03 + -1.73548901E+03 -1.73548901E+03 -1.73306494E+03 -1.73306494E+03 + -1.73306494E+03 -1.73306494E+03 -1.72903601E+03 -1.72903601E+03 + -1.72903601E+03 -1.72903601E+03 -1.72500806E+03 -1.72500806E+03 + -1.72500806E+03 -1.72500806E+03 -1.72097900E+03 -1.72097900E+03 + -1.72097900E+03 -1.72097900E+03 -1.71695105E+03 -1.71695105E+03 + -1.71695105E+03 -1.71695105E+03 -1.71292200E+03 -1.71292200E+03 + -1.71292200E+03 -1.71292200E+03 -1.74755396E+03 -1.74755396E+03 + -1.74755396E+03 -1.74755396E+03 -1.74585803E+03 -1.74585803E+03 + -1.74585803E+03 -1.74585803E+03 -1.74416199E+03 -1.74416199E+03 + -1.74416199E+03 -1.74416199E+03 -1.74246594E+03 -1.74246594E+03 + -1.74246594E+03 -1.74246594E+03 -1.74077100E+03 -1.74077100E+03 + -1.74077100E+03 -1.74077100E+03 -1.73845105E+03 -1.73845105E+03 + -1.73845105E+03 -1.73845105E+03 -1.73613000E+03 -1.73613000E+03 + -1.73613000E+03 -1.73613000E+03 -1.73381006E+03 -1.73381006E+03 + -1.73381006E+03 -1.73381006E+03 -1.73148999E+03 -1.73148999E+03 + -1.73148999E+03 -1.73148999E+03 -1.72917004E+03 -1.72917004E+03 + -1.72917004E+03 -1.72917004E+03 -1.72531396E+03 -1.72531396E+03 + -1.72531396E+03 -1.72531396E+03 -1.72145801E+03 -1.72145801E+03 + -1.72145801E+03 -1.72145801E+03 -1.71760205E+03 -1.71760205E+03 + -1.71760205E+03 -1.71760205E+03 -1.71374597E+03 -1.71374597E+03 + -1.71374597E+03 -1.71374597E+03 -1.70989001E+03 -1.70989001E+03 + -1.70989001E+03 -1.70989001E+03 -1.74461499E+03 -1.74461499E+03 + -1.74461499E+03 -1.74461499E+03 -1.74317505E+03 -1.74317505E+03 + -1.74317505E+03 -1.74317505E+03 -1.74173499E+03 -1.74173499E+03 + -1.74173499E+03 -1.74173499E+03 -1.74029504E+03 -1.74029504E+03 + -1.74029504E+03 -1.74029504E+03 -1.73885498E+03 -1.73885498E+03 + -1.73885498E+03 -1.73885498E+03 -1.73668701E+03 -1.73668701E+03 + -1.73668701E+03 -1.73668701E+03 -1.73451794E+03 -1.73451794E+03 + -1.73451794E+03 -1.73451794E+03 -1.73234900E+03 -1.73234900E+03 + -1.73234900E+03 -1.73234900E+03 -1.73018005E+03 -1.73018005E+03 + -1.73018005E+03 -1.73018005E+03 -1.72801099E+03 -1.72801099E+03 + -1.72801099E+03 -1.72801099E+03 -1.72434998E+03 -1.72434998E+03 + -1.72434998E+03 -1.72434998E+03 -1.72068994E+03 -1.72068994E+03 + -1.72068994E+03 -1.72068994E+03 -1.71702905E+03 -1.71702905E+03 + -1.71702905E+03 -1.71702905E+03 -1.71336804E+03 -1.71336804E+03 + -1.71336804E+03 -1.71336804E+03 -1.70970703E+03 -1.70970703E+03 + -1.70970703E+03 -1.70970703E+03 -1.74529602E+03 -1.74529602E+03 + -1.74529602E+03 -1.74529602E+03 -1.74385706E+03 -1.74385706E+03 + -1.74385706E+03 -1.74385706E+03 -1.74241797E+03 -1.74241797E+03 + -1.74241797E+03 -1.74241797E+03 -1.74097900E+03 -1.74097900E+03 + -1.74097900E+03 -1.74097900E+03 -1.73954004E+03 -1.73954004E+03 + -1.73954004E+03 -1.73954004E+03 -1.73735303E+03 -1.73735303E+03 + -1.73735303E+03 -1.73735303E+03 -1.73516699E+03 -1.73516699E+03 + -1.73516699E+03 -1.73516699E+03 -1.73298096E+03 -1.73298096E+03 + -1.73298096E+03 -1.73298096E+03 -1.73079504E+03 -1.73079504E+03 + -1.73079504E+03 -1.73079504E+03 -1.72860901E+03 -1.72860901E+03 + -1.72860901E+03 -1.72860901E+03 -1.72497803E+03 -1.72497803E+03 + -1.72497803E+03 -1.72497803E+03 -1.72134595E+03 -1.72134595E+03 + -1.72134595E+03 -1.72134595E+03 -1.71771497E+03 -1.71771497E+03 + -1.71771497E+03 -1.71771497E+03 -1.71408398E+03 -1.71408398E+03 + -1.71408398E+03 -1.71408398E+03 -1.71045300E+03 -1.71045300E+03 + -1.71045300E+03 -1.71045300E+03 -1.74795898E+03 -1.74795898E+03 + -1.74795898E+03 -1.74795898E+03 -1.74638403E+03 -1.74638403E+03 + -1.74638403E+03 -1.74638403E+03 -1.74480798E+03 -1.74480798E+03 + -1.74480798E+03 -1.74480798E+03 -1.74323206E+03 -1.74323206E+03 + -1.74323206E+03 -1.74323206E+03 -1.74165698E+03 -1.74165698E+03 + -1.74165698E+03 -1.74165698E+03 -1.73932397E+03 -1.73932397E+03 + -1.73932397E+03 -1.73932397E+03 -1.73699097E+03 -1.73699097E+03 + -1.73699097E+03 -1.73699097E+03 -1.73465796E+03 -1.73465796E+03 + -1.73465796E+03 -1.73465796E+03 -1.73232397E+03 -1.73232397E+03 + -1.73232397E+03 -1.73232397E+03 -1.72999097E+03 -1.72999097E+03 + -1.72999097E+03 -1.72999097E+03 -1.72625598E+03 -1.72625598E+03 + -1.72625598E+03 -1.72625598E+03 -1.72252002E+03 -1.72252002E+03 + -1.72252002E+03 -1.72252002E+03 -1.71878406E+03 -1.71878406E+03 + -1.71878406E+03 -1.71878406E+03 -1.71504895E+03 -1.71504895E+03 + -1.71504895E+03 -1.71504895E+03 -1.71131299E+03 -1.71131299E+03 + -1.71131299E+03 -1.71131299E+03 -1.75159399E+03 -1.75159399E+03 + -1.75159399E+03 -1.75159399E+03 -1.74999194E+03 -1.74999194E+03 + -1.74999194E+03 -1.74999194E+03 -1.74839001E+03 -1.74839001E+03 + -1.74839001E+03 -1.74839001E+03 -1.74678796E+03 -1.74678796E+03 + -1.74678796E+03 -1.74678796E+03 -1.74518506E+03 -1.74518506E+03 + -1.74518506E+03 -1.74518506E+03 -1.74280505E+03 -1.74280505E+03 + -1.74280505E+03 -1.74280505E+03 -1.74042395E+03 -1.74042395E+03 + -1.74042395E+03 -1.74042395E+03 -1.73804297E+03 -1.73804297E+03 + -1.73804297E+03 -1.73804297E+03 -1.73566296E+03 -1.73566296E+03 + -1.73566296E+03 -1.73566296E+03 -1.73328198E+03 -1.73328198E+03 + -1.73328198E+03 -1.73328198E+03 -1.72950903E+03 -1.72950903E+03 + -1.72950903E+03 -1.72950903E+03 -1.72573596E+03 -1.72573596E+03 + -1.72573596E+03 -1.72573596E+03 -1.72196399E+03 -1.72196399E+03 + -1.72196399E+03 -1.72196399E+03 -1.71819104E+03 -1.71819104E+03 + -1.71819104E+03 -1.71819104E+03 -1.71441797E+03 -1.71441797E+03 + -1.71441797E+03 -1.71441797E+03 -1.75654700E+03 -1.75654700E+03 + -1.75654700E+03 -1.75654700E+03 -1.75490906E+03 -1.75490906E+03 + -1.75490906E+03 -1.75490906E+03 -1.75327002E+03 -1.75327002E+03 + -1.75327002E+03 -1.75327002E+03 -1.75163098E+03 -1.75163098E+03 + -1.75163098E+03 -1.75163098E+03 -1.74999304E+03 -1.74999304E+03 + -1.74999304E+03 -1.74999304E+03 -1.74754797E+03 -1.74754797E+03 + -1.74754797E+03 -1.74754797E+03 -1.74510303E+03 -1.74510303E+03 + -1.74510303E+03 -1.74510303E+03 -1.74265796E+03 -1.74265796E+03 + -1.74265796E+03 -1.74265796E+03 -1.74021301E+03 -1.74021301E+03 + -1.74021301E+03 -1.74021301E+03 -1.73776794E+03 -1.73776794E+03 + -1.73776794E+03 -1.73776794E+03 -1.73386902E+03 -1.73386902E+03 + -1.73386902E+03 -1.73386902E+03 -1.72996997E+03 -1.72996997E+03 + -1.72996997E+03 -1.72996997E+03 -1.72607104E+03 -1.72607104E+03 + -1.72607104E+03 -1.72607104E+03 -1.72217102E+03 -1.72217102E+03 + -1.72217102E+03 -1.72217102E+03 -1.71827197E+03 -1.71827197E+03 + -1.71827197E+03 -1.71827197E+03 -1.76482605E+03 -1.76482605E+03 + -1.76482605E+03 -1.76482605E+03 -1.76278003E+03 -1.76278003E+03 + -1.76278003E+03 -1.76278003E+03 -1.76073303E+03 -1.76073303E+03 + -1.76073303E+03 -1.76073303E+03 -1.75868701E+03 -1.75868701E+03 + -1.75868701E+03 -1.75868701E+03 -1.75664001E+03 -1.75664001E+03 + -1.75664001E+03 -1.75664001E+03 -1.75380005E+03 -1.75380005E+03 + -1.75380005E+03 -1.75380005E+03 -1.75095996E+03 -1.75095996E+03 + -1.75095996E+03 -1.75095996E+03 -1.74812000E+03 -1.74812000E+03 + -1.74812000E+03 -1.74812000E+03 -1.74528003E+03 -1.74528003E+03 + -1.74528003E+03 -1.74528003E+03 -1.74243994E+03 -1.74243994E+03 + -1.74243994E+03 -1.74243994E+03 -1.73815198E+03 -1.73815198E+03 + -1.73815198E+03 -1.73815198E+03 -1.73386401E+03 -1.73386401E+03 + -1.73386401E+03 -1.73386401E+03 -1.72957605E+03 -1.72957605E+03 + -1.72957605E+03 -1.72957605E+03 -1.72528796E+03 -1.72528796E+03 + -1.72528796E+03 -1.72528796E+03 -1.72100000E+03 -1.72100000E+03 + -1.72100000E+03 -1.72100000E+03 -1.77354504E+03 -1.77354504E+03 + -1.77354504E+03 -1.77354504E+03 -1.77156006E+03 -1.77156006E+03 + -1.77156006E+03 -1.77156006E+03 -1.76957397E+03 -1.76957397E+03 + -1.76957397E+03 -1.76957397E+03 -1.76758899E+03 -1.76758899E+03 + -1.76758899E+03 -1.76758899E+03 -1.76560303E+03 -1.76560303E+03 + -1.76560303E+03 -1.76560303E+03 -1.76277905E+03 -1.76277905E+03 + -1.76277905E+03 -1.76277905E+03 -1.75995496E+03 -1.75995496E+03 + -1.75995496E+03 -1.75995496E+03 -1.75713098E+03 -1.75713098E+03 + -1.75713098E+03 -1.75713098E+03 -1.75430701E+03 -1.75430701E+03 + -1.75430701E+03 -1.75430701E+03 -1.75148303E+03 -1.75148303E+03 + -1.75148303E+03 -1.75148303E+03 -1.74728406E+03 -1.74728406E+03 + -1.74728406E+03 -1.74728406E+03 -1.74308398E+03 -1.74308398E+03 + -1.74308398E+03 -1.74308398E+03 -1.73888501E+03 -1.73888501E+03 + -1.73888501E+03 -1.73888501E+03 -1.73468506E+03 -1.73468506E+03 + -1.73468506E+03 -1.73468506E+03 -1.73048596E+03 -1.73048596E+03 + -1.73048596E+03 -1.73048596E+03 -1.78334094E+03 -1.78334094E+03 + -1.78334094E+03 -1.78334094E+03 -1.78177002E+03 -1.78177002E+03 + -1.78177002E+03 -1.78177002E+03 -1.78019995E+03 -1.78019995E+03 + -1.78019995E+03 -1.78019995E+03 -1.77862903E+03 -1.77862903E+03 + -1.77862903E+03 -1.77862903E+03 -1.77705896E+03 -1.77705896E+03 + -1.77705896E+03 -1.77705896E+03 -1.77470996E+03 -1.77470996E+03 + -1.77470996E+03 -1.77470996E+03 -1.77235999E+03 -1.77235999E+03 + -1.77235999E+03 -1.77235999E+03 -1.77001099E+03 -1.77001099E+03 + -1.77001099E+03 -1.77001099E+03 -1.76766101E+03 -1.76766101E+03 + -1.76766101E+03 -1.76766101E+03 -1.76531201E+03 -1.76531201E+03 + -1.76531201E+03 -1.76531201E+03 -1.76165503E+03 -1.76165503E+03 + -1.76165503E+03 -1.76165503E+03 -1.75799805E+03 -1.75799805E+03 + -1.75799805E+03 -1.75799805E+03 -1.75434094E+03 -1.75434094E+03 + -1.75434094E+03 -1.75434094E+03 -1.75068506E+03 -1.75068506E+03 + -1.75068506E+03 -1.75068506E+03 -1.74702795E+03 -1.74702795E+03 + -1.74702795E+03 -1.74702795E+03 -1.79019995E+03 -1.79019995E+03 + -1.79019995E+03 -1.79019995E+03 -1.78868506E+03 -1.78868506E+03 + -1.78868506E+03 -1.78868506E+03 -1.78716895E+03 -1.78716895E+03 + -1.78716895E+03 -1.78716895E+03 -1.78565295E+03 -1.78565295E+03 + -1.78565295E+03 -1.78565295E+03 -1.78413696E+03 -1.78413696E+03 + -1.78413696E+03 -1.78413696E+03 -1.78173206E+03 -1.78173206E+03 + -1.78173206E+03 -1.78173206E+03 -1.77932703E+03 -1.77932703E+03 + -1.77932703E+03 -1.77932703E+03 -1.77692102E+03 -1.77692102E+03 + -1.77692102E+03 -1.77692102E+03 -1.77451599E+03 -1.77451599E+03 + -1.77451599E+03 -1.77451599E+03 -1.77211096E+03 -1.77211096E+03 + -1.77211096E+03 -1.77211096E+03 -1.76831006E+03 -1.76831006E+03 + -1.76831006E+03 -1.76831006E+03 -1.76450903E+03 -1.76450903E+03 + -1.76450903E+03 -1.76450903E+03 -1.76070801E+03 -1.76070801E+03 + -1.76070801E+03 -1.76070801E+03 -1.75690601E+03 -1.75690601E+03 + -1.75690601E+03 -1.75690601E+03 -1.75310498E+03 -1.75310498E+03 + -1.75310498E+03 -1.75310498E+03 -1.78921802E+03 -1.78921802E+03 + -1.78921802E+03 -1.78921802E+03 -1.78770605E+03 -1.78770605E+03 + -1.78770605E+03 -1.78770605E+03 -1.78619299E+03 -1.78619299E+03 + -1.78619299E+03 -1.78619299E+03 -1.78468103E+03 -1.78468103E+03 + -1.78468103E+03 -1.78468103E+03 -1.78316797E+03 -1.78316797E+03 + -1.78316797E+03 -1.78316797E+03 -1.78058105E+03 -1.78058105E+03 + -1.78058105E+03 -1.78058105E+03 -1.77799500E+03 -1.77799500E+03 + -1.77799500E+03 -1.77799500E+03 -1.77540796E+03 -1.77540796E+03 + -1.77540796E+03 -1.77540796E+03 -1.77282104E+03 -1.77282104E+03 + -1.77282104E+03 -1.77282104E+03 -1.77023401E+03 -1.77023401E+03 + -1.77023401E+03 -1.77023401E+03 -1.76617200E+03 -1.76617200E+03 + -1.76617200E+03 -1.76617200E+03 -1.76211096E+03 -1.76211096E+03 + -1.76211096E+03 -1.76211096E+03 -1.75804895E+03 -1.75804895E+03 + -1.75804895E+03 -1.75804895E+03 -1.75398706E+03 -1.75398706E+03 + -1.75398706E+03 -1.75398706E+03 -1.74992603E+03 -1.74992603E+03 + -1.74992603E+03 -1.74992603E+03 -1.78266797E+03 -1.78266797E+03 + -1.78266797E+03 -1.78266797E+03 -1.78121106E+03 -1.78121106E+03 + -1.78121106E+03 -1.78121106E+03 -1.77975500E+03 -1.77975500E+03 + -1.77975500E+03 -1.77975500E+03 -1.77829797E+03 -1.77829797E+03 + -1.77829797E+03 -1.77829797E+03 -1.77684094E+03 -1.77684094E+03 + -1.77684094E+03 -1.77684094E+03 -1.77417798E+03 -1.77417798E+03 + -1.77417798E+03 -1.77417798E+03 -1.77151501E+03 -1.77151501E+03 + -1.77151501E+03 -1.77151501E+03 -1.76885205E+03 -1.76885205E+03 + -1.76885205E+03 -1.76885205E+03 -1.76618896E+03 -1.76618896E+03 + -1.76618896E+03 -1.76618896E+03 -1.76352600E+03 -1.76352600E+03 + -1.76352600E+03 -1.76352600E+03 -1.75944397E+03 -1.75944397E+03 + -1.75944397E+03 -1.75944397E+03 -1.75536206E+03 -1.75536206E+03 + -1.75536206E+03 -1.75536206E+03 -1.75128003E+03 -1.75128003E+03 + -1.75128003E+03 -1.75128003E+03 -1.74719800E+03 -1.74719800E+03 + -1.74719800E+03 -1.74719800E+03 -1.74311597E+03 -1.74311597E+03 + -1.74311597E+03 -1.74311597E+03 -1.77469702E+03 -1.77469702E+03 + -1.77469702E+03 -1.77469702E+03 -1.77323401E+03 -1.77323401E+03 + -1.77323401E+03 -1.77323401E+03 -1.77177100E+03 -1.77177100E+03 + -1.77177100E+03 -1.77177100E+03 -1.77030798E+03 -1.77030798E+03 + -1.77030798E+03 -1.77030798E+03 -1.76884497E+03 -1.76884497E+03 + -1.76884497E+03 -1.76884497E+03 -1.76607898E+03 -1.76607898E+03 + -1.76607898E+03 -1.76607898E+03 -1.76331299E+03 -1.76331299E+03 + -1.76331299E+03 -1.76331299E+03 -1.76054700E+03 -1.76054700E+03 + -1.76054700E+03 -1.76054700E+03 -1.75778101E+03 -1.75778101E+03 + -1.75778101E+03 -1.75778101E+03 -1.75501599E+03 -1.75501599E+03 + -1.75501599E+03 -1.75501599E+03 -1.75092395E+03 -1.75092395E+03 + -1.75092395E+03 -1.75092395E+03 -1.74683301E+03 -1.74683301E+03 + -1.74683301E+03 -1.74683301E+03 -1.74274097E+03 -1.74274097E+03 + -1.74274097E+03 -1.74274097E+03 -1.73865002E+03 -1.73865002E+03 + -1.73865002E+03 -1.73865002E+03 -1.73455896E+03 -1.73455896E+03 + -1.73455896E+03 -1.73455896E+03 -1.76626697E+03 -1.76626697E+03 + -1.76626697E+03 -1.76626697E+03 -1.76473901E+03 -1.76473901E+03 + -1.76473901E+03 -1.76473901E+03 -1.76321106E+03 -1.76321106E+03 + -1.76321106E+03 -1.76321106E+03 -1.76168298E+03 -1.76168298E+03 + -1.76168298E+03 -1.76168298E+03 -1.76015503E+03 -1.76015503E+03 + -1.76015503E+03 -1.76015503E+03 -1.75728699E+03 -1.75728699E+03 + -1.75728699E+03 -1.75728699E+03 -1.75442004E+03 -1.75442004E+03 + -1.75442004E+03 -1.75442004E+03 -1.75155200E+03 -1.75155200E+03 + -1.75155200E+03 -1.75155200E+03 -1.74868506E+03 -1.74868506E+03 + -1.74868506E+03 -1.74868506E+03 -1.74581799E+03 -1.74581799E+03 + -1.74581799E+03 -1.74581799E+03 -1.74166296E+03 -1.74166296E+03 + -1.74166296E+03 -1.74166296E+03 -1.73750903E+03 -1.73750903E+03 + -1.73750903E+03 -1.73750903E+03 -1.73335498E+03 -1.73335498E+03 + -1.73335498E+03 -1.73335498E+03 -1.72920105E+03 -1.72920105E+03 + -1.72920105E+03 -1.72920105E+03 -1.72504700E+03 -1.72504700E+03 + -1.72504700E+03 -1.72504700E+03 -1.75675195E+03 -1.75675195E+03 + -1.75675195E+03 -1.75675195E+03 -1.75510205E+03 -1.75510205E+03 + -1.75510205E+03 -1.75510205E+03 -1.75345105E+03 -1.75345105E+03 + -1.75345105E+03 -1.75345105E+03 -1.75180103E+03 -1.75180103E+03 + -1.75180103E+03 -1.75180103E+03 -1.75015100E+03 -1.75015100E+03 + -1.75015100E+03 -1.75015100E+03 -1.74727600E+03 -1.74727600E+03 + -1.74727600E+03 -1.74727600E+03 -1.74440100E+03 -1.74440100E+03 + -1.74440100E+03 -1.74440100E+03 -1.74152600E+03 -1.74152600E+03 + -1.74152600E+03 -1.74152600E+03 -1.73865002E+03 -1.73865002E+03 + -1.73865002E+03 -1.73865002E+03 -1.73577502E+03 -1.73577502E+03 + -1.73577502E+03 -1.73577502E+03 -1.73146802E+03 -1.73146802E+03 + -1.73146802E+03 -1.73146802E+03 -1.72716003E+03 -1.72716003E+03 + -1.72716003E+03 -1.72716003E+03 -1.72285205E+03 -1.72285205E+03 + -1.72285205E+03 -1.72285205E+03 -1.71854395E+03 -1.71854395E+03 + -1.71854395E+03 -1.71854395E+03 -1.71423596E+03 -1.71423596E+03 + -1.71423596E+03 -1.71423596E+03 -1.74636401E+03 -1.74636401E+03 + -1.74636401E+03 -1.74636401E+03 -1.74486401E+03 -1.74486401E+03 + -1.74486401E+03 -1.74486401E+03 -1.74336499E+03 -1.74336499E+03 + -1.74336499E+03 -1.74336499E+03 -1.74186597E+03 -1.74186597E+03 + -1.74186597E+03 -1.74186597E+03 -1.74036694E+03 -1.74036694E+03 + -1.74036694E+03 -1.74036694E+03 -1.73753101E+03 -1.73753101E+03 + -1.73753101E+03 -1.73753101E+03 -1.73469495E+03 -1.73469495E+03 + -1.73469495E+03 -1.73469495E+03 -1.73185901E+03 -1.73185901E+03 + -1.73185901E+03 -1.73185901E+03 -1.72902295E+03 -1.72902295E+03 + -1.72902295E+03 -1.72902295E+03 -1.72618701E+03 -1.72618701E+03 + -1.72618701E+03 -1.72618701E+03 -1.72199500E+03 -1.72199500E+03 + -1.72199500E+03 -1.72199500E+03 -1.71780298E+03 -1.71780298E+03 + -1.71780298E+03 -1.71780298E+03 -1.71361096E+03 -1.71361096E+03 + -1.71361096E+03 -1.71361096E+03 -1.70941895E+03 -1.70941895E+03 + -1.70941895E+03 -1.70941895E+03 -1.70522705E+03 -1.70522705E+03 + -1.70522705E+03 -1.70522705E+03 -1.73961206E+03 -1.73961206E+03 + -1.73961206E+03 -1.73961206E+03 -1.73800000E+03 -1.73800000E+03 + -1.73800000E+03 -1.73800000E+03 -1.73638904E+03 -1.73638904E+03 + -1.73638904E+03 -1.73638904E+03 -1.73477795E+03 -1.73477795E+03 + -1.73477795E+03 -1.73477795E+03 -1.73316699E+03 -1.73316699E+03 + -1.73316699E+03 -1.73316699E+03 -1.73031604E+03 -1.73031604E+03 + -1.73031604E+03 -1.73031604E+03 -1.72746399E+03 -1.72746399E+03 + -1.72746399E+03 -1.72746399E+03 -1.72461304E+03 -1.72461304E+03 + -1.72461304E+03 -1.72461304E+03 -1.72176196E+03 -1.72176196E+03 + -1.72176196E+03 -1.72176196E+03 -1.71891101E+03 -1.71891101E+03 + -1.71891101E+03 -1.71891101E+03 -1.71513794E+03 -1.71513794E+03 + -1.71513794E+03 -1.71513794E+03 -1.71136499E+03 -1.71136499E+03 + -1.71136499E+03 -1.71136499E+03 -1.70759094E+03 -1.70759094E+03 + -1.70759094E+03 -1.70759094E+03 -1.70381799E+03 -1.70381799E+03 + -1.70381799E+03 -1.70381799E+03 -1.70004395E+03 -1.70004395E+03 + -1.70004395E+03 -1.70004395E+03 -1.73488196E+03 -1.73488196E+03 + -1.73488196E+03 -1.73488196E+03 -1.73336096E+03 -1.73336096E+03 + -1.73336096E+03 -1.73336096E+03 -1.73184094E+03 -1.73184094E+03 + -1.73184094E+03 -1.73184094E+03 -1.73032104E+03 -1.73032104E+03 + -1.73032104E+03 -1.73032104E+03 -1.72880005E+03 -1.72880005E+03 + -1.72880005E+03 -1.72880005E+03 -1.72596301E+03 -1.72596301E+03 + -1.72596301E+03 -1.72596301E+03 -1.72312500E+03 -1.72312500E+03 + -1.72312500E+03 -1.72312500E+03 -1.72028699E+03 -1.72028699E+03 + -1.72028699E+03 -1.72028699E+03 -1.71744897E+03 -1.71744897E+03 + -1.71744897E+03 -1.71744897E+03 -1.71461206E+03 -1.71461206E+03 + -1.71461206E+03 -1.71461206E+03 -1.71089197E+03 -1.71089197E+03 + -1.71089197E+03 -1.71089197E+03 -1.70717200E+03 -1.70717200E+03 + -1.70717200E+03 -1.70717200E+03 -1.70345203E+03 -1.70345203E+03 + -1.70345203E+03 -1.70345203E+03 -1.69973206E+03 -1.69973206E+03 + -1.69973206E+03 -1.69973206E+03 -1.69601196E+03 -1.69601196E+03 + -1.69601196E+03 -1.69601196E+03 -1.73094800E+03 -1.73094800E+03 + -1.73094800E+03 -1.73094800E+03 -1.72945300E+03 -1.72945300E+03 + -1.72945300E+03 -1.72945300E+03 -1.72795801E+03 -1.72795801E+03 + -1.72795801E+03 -1.72795801E+03 -1.72646399E+03 -1.72646399E+03 + -1.72646399E+03 -1.72646399E+03 -1.72496899E+03 -1.72496899E+03 + -1.72496899E+03 -1.72496899E+03 -1.72217004E+03 -1.72217004E+03 + -1.72217004E+03 -1.72217004E+03 -1.71937097E+03 -1.71937097E+03 + -1.71937097E+03 -1.71937097E+03 -1.71657300E+03 -1.71657300E+03 + -1.71657300E+03 -1.71657300E+03 -1.71377405E+03 -1.71377405E+03 + -1.71377405E+03 -1.71377405E+03 -1.71097498E+03 -1.71097498E+03 + -1.71097498E+03 -1.71097498E+03 -1.70719495E+03 -1.70719495E+03 + -1.70719495E+03 -1.70719495E+03 -1.70341504E+03 -1.70341504E+03 + -1.70341504E+03 -1.70341504E+03 -1.69963403E+03 -1.69963403E+03 + -1.69963403E+03 -1.69963403E+03 -1.69585400E+03 -1.69585400E+03 + -1.69585400E+03 -1.69585400E+03 -1.69207300E+03 -1.69207300E+03 + -1.69207300E+03 -1.69207300E+03 -1.72934094E+03 -1.72934094E+03 + -1.72934094E+03 -1.72934094E+03 -1.72773499E+03 -1.72773499E+03 + -1.72773499E+03 -1.72773499E+03 -1.72612903E+03 -1.72612903E+03 + -1.72612903E+03 -1.72612903E+03 -1.72452295E+03 -1.72452295E+03 + -1.72452295E+03 -1.72452295E+03 -1.72291699E+03 -1.72291699E+03 + -1.72291699E+03 -1.72291699E+03 -1.72017102E+03 -1.72017102E+03 + -1.72017102E+03 -1.72017102E+03 -1.71742505E+03 -1.71742505E+03 + -1.71742505E+03 -1.71742505E+03 -1.71467896E+03 -1.71467896E+03 + -1.71467896E+03 -1.71467896E+03 -1.71193298E+03 -1.71193298E+03 + -1.71193298E+03 -1.71193298E+03 -1.70918701E+03 -1.70918701E+03 + -1.70918701E+03 -1.70918701E+03 -1.70531799E+03 -1.70531799E+03 + -1.70531799E+03 -1.70531799E+03 -1.70144800E+03 -1.70144800E+03 + -1.70144800E+03 -1.70144800E+03 -1.69757800E+03 -1.69757800E+03 + -1.69757800E+03 -1.69757800E+03 -1.69370898E+03 -1.69370898E+03 + -1.69370898E+03 -1.69370898E+03 -1.68983899E+03 -1.68983899E+03 + -1.68983899E+03 -1.68983899E+03 -1.73056006E+03 -1.73056006E+03 + -1.73056006E+03 -1.73056006E+03 -1.72879895E+03 -1.72879895E+03 + -1.72879895E+03 -1.72879895E+03 -1.72703796E+03 -1.72703796E+03 + -1.72703796E+03 -1.72703796E+03 -1.72527698E+03 -1.72527698E+03 + -1.72527698E+03 -1.72527698E+03 -1.72351697E+03 -1.72351697E+03 + -1.72351697E+03 -1.72351697E+03 -1.72077197E+03 -1.72077197E+03 + -1.72077197E+03 -1.72077197E+03 -1.71802698E+03 -1.71802698E+03 + -1.71802698E+03 -1.71802698E+03 -1.71528198E+03 -1.71528198E+03 + -1.71528198E+03 -1.71528198E+03 -1.71253699E+03 -1.71253699E+03 + -1.71253699E+03 -1.71253699E+03 -1.70979199E+03 -1.70979199E+03 + -1.70979199E+03 -1.70979199E+03 -1.70581006E+03 -1.70581006E+03 + -1.70581006E+03 -1.70581006E+03 -1.70182800E+03 -1.70182800E+03 + -1.70182800E+03 -1.70182800E+03 -1.69784595E+03 -1.69784595E+03 + -1.69784595E+03 -1.69784595E+03 -1.69386401E+03 -1.69386401E+03 + -1.69386401E+03 -1.69386401E+03 -1.68988098E+03 -1.68988098E+03 + -1.68988098E+03 -1.68988098E+03 +endtag +tag active +array bool data 6762 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 +endtag +tag parameter +char name "PORO" +array float data 6762 + 2.41788685E-01 4.91252802E-02 4.59601581E-02 3.61381993E-02 + 4.98965196E-02 3.64209451E-02 4.11389349E-03 1.51000157E-01 + 2.35325009E-01 2.59780526E-01 1.79500535E-01 2.13721171E-01 + 2.30844289E-01 2.29940221E-01 1.80194765E-01 8.04148987E-02 + 4.80895042E-02 3.49820405E-02 6.17310405E-02 3.67205366E-02 + 4.54921275E-03 8.95670652E-02 2.36135572E-01 2.13315636E-01 + 8.81088972E-02 1.47657976E-01 1.99560612E-01 1.46246627E-01 + 1.79412857E-01 2.06468746E-01 1.59837201E-01 2.07172900E-01 + 5.97213320E-02 4.81284037E-02 2.73287240E-02 4.70332801E-02 + 1.59023941E-01 2.03723863E-01 1.29850700E-01 1.53471172E-01 + 1.98849529E-01 1.44413173E-01 1.95800334E-01 2.47484714E-01 + 2.73942530E-01 2.41104841E-01 2.07971990E-01 7.95118883E-02 + 3.82877178E-02 4.89975922E-02 1.03229366E-01 1.88628301E-01 + 1.53316185E-01 1.49035528E-01 2.01432422E-01 1.44999087E-01 + 1.99011326E-01 2.33266637E-01 2.75879532E-01 2.87110418E-01 + 2.74098486E-01 1.70731246E-01 4.29658443E-02 6.87101856E-02 + 8.68929103E-02 1.01052403E-01 1.40843824E-01 1.55559704E-01 + 1.62043333E-01 1.39521748E-01 2.48329133E-01 2.66940236E-01 + 2.69215405E-01 2.16068387E-01 2.50769198E-01 1.82632104E-01 + 8.45324323E-02 7.83903301E-02 7.25324079E-02 9.71930325E-02 + 1.70058906E-01 1.51065648E-01 1.05198480E-01 1.58086658E-01 + 1.52862146E-01 2.86905885E-01 2.38826498E-01 2.11809501E-01 + 2.44192809E-01 1.14342898E-01 1.20468423E-01 1.25453815E-01 + 8.41192529E-02 1.06457502E-01 2.14790687E-01 1.65622875E-01 + 1.45429388E-01 2.00058401E-01 1.91763878E-01 2.03827754E-01 + 2.22971752E-01 2.10365593E-01 2.22589493E-01 2.02151552E-01 + 1.38698757E-01 1.50126204E-01 5.59645332E-02 5.01190796E-02 + 8.81762505E-02 1.88191578E-01 2.15027526E-01 2.42533594E-01 + 2.04249367E-01 2.11517677E-01 2.00376436E-01 1.74581349E-01 + 2.17504740E-01 2.17542589E-01 1.72150880E-01 1.10321850E-01 + 4.06427532E-02 1.41129177E-02 6.15222566E-02 7.66112655E-02 + 6.81064948E-02 1.72556192E-01 2.44587094E-01 2.03375936E-01 + 2.34684914E-01 2.46216118E-01 2.51138240E-01 2.42416263E-01 + 2.33746409E-01 1.86971381E-01 1.17859967E-01 3.65282334E-02 + 9.23408642E-02 1.48272261E-01 5.10617904E-02 1.24841161E-01 + 1.55106813E-01 2.19422489E-01 2.27475062E-01 2.46912077E-01 + 3.05059165E-01 3.00776720E-01 2.80078441E-01 2.52973467E-01 + 2.17700377E-01 1.68301880E-01 2.11040795E-01 2.08234549E-01 + 9.39548090E-02 1.49272606E-01 1.21828549E-01 2.37594441E-01 + 2.40312919E-01 2.42126882E-01 2.64866084E-01 2.65928656E-01 + 2.37044469E-01 2.28311226E-01 2.25568637E-01 2.64378995E-01 + 3.25910389E-01 3.01215857E-01 1.66106880E-01 1.28820047E-01 + 1.70353308E-01 2.14848444E-01 2.67801702E-01 2.79246002E-01 + 2.88261354E-01 2.74641067E-01 2.82160580E-01 2.97495812E-01 + 2.77523577E-01 2.89143533E-01 3.01065832E-01 3.02816540E-01 + 2.52922177E-01 1.73159316E-01 2.41468057E-01 2.46206388E-01 + 3.05265099E-01 3.28490198E-01 1.76263526E-01 1.91896677E-01 + 2.54449159E-01 2.74747193E-01 2.40487143E-01 2.60261327E-01 + 2.17263266E-01 2.58920312E-01 2.78520405E-01 2.30598629E-01 + 2.31508449E-01 3.10181260E-01 2.53561348E-01 2.30256483E-01 + 7.04813674E-02 1.82715818E-01 2.77032256E-01 2.28501037E-01 + 2.67592728E-01 2.78180927E-01 2.43447736E-01 2.11815238E-01 + 2.46401802E-01 2.29822144E-01 2.76539505E-01 2.49305069E-01 + 2.66739905E-01 2.58688062E-01 2.05725610E-01 2.47736454E-01 + 1.36843860E-01 1.22370914E-01 2.57067740E-01 2.51370698E-01 + 2.16942787E-01 2.24674955E-01 2.40207225E-01 2.31182188E-01 + 2.38585830E-01 2.50944436E-01 3.02366674E-01 2.76617050E-01 + 2.59673148E-01 2.66866565E-01 1.14048153E-01 9.13342759E-02 + 1.00707635E-01 2.53544241E-01 1.95510700E-01 1.92601621E-01 + 1.92941219E-01 2.53192544E-01 2.82691568E-01 2.75949210E-01 + 2.22298041E-01 2.05768585E-01 2.18536034E-01 1.72061667E-01 + 6.47427812E-02 1.20297395E-01 1.98822945E-01 2.99944639E-01 + 2.44152263E-01 1.96960345E-01 1.43405646E-01 1.92478374E-01 + 2.52311498E-01 2.37528518E-01 2.65099883E-01 2.12432891E-01 + 2.18004405E-01 2.31137782E-01 1.90505967E-01 1.12468220E-01 + 3.33463028E-02 1.12377346E-01 2.38935873E-01 2.11646214E-01 + 2.15375647E-01 2.38893479E-01 2.75897413E-01 2.37054855E-01 + 3.00422817E-01 2.28068143E-01 1.76303670E-01 1.31983429E-01 + 9.35090110E-02 2.41278745E-02 4.46572676E-02 2.21665025E-01 + 2.23348066E-01 1.76670790E-01 1.78471178E-01 2.44212702E-01 + 2.32814342E-01 2.28017375E-01 2.36647040E-01 1.53804511E-01 + 1.41918793E-01 1.09414250E-01 1.02066167E-01 3.80377099E-02 + 9.88534614E-02 2.39364758E-01 2.33432025E-01 1.36502787E-01 + 1.76115230E-01 2.61786371E-01 2.72890776E-01 2.74353802E-01 + 2.85777867E-01 2.22178891E-01 1.30808070E-01 1.20479770E-01 + 1.00131303E-01 7.62085021E-02 1.39298826E-01 2.63660491E-01 + 2.54520178E-01 1.52750999E-01 1.39867976E-01 2.60596305E-01 + 2.48008326E-01 2.64575839E-01 2.85904825E-01 2.05692172E-01 + 1.78608924E-01 1.60116926E-01 1.94745213E-01 1.35967135E-01 + 2.24071994E-01 2.68566161E-01 2.53563523E-01 1.13185868E-01 + 5.48003986E-02 2.48775467E-01 2.77558714E-01 5.02403006E-02 + 4.44858335E-02 2.90635265E-02 6.51521608E-02 4.72939946E-02 + 5.40671386E-02 1.42255768E-01 2.04685241E-01 1.98098436E-01 + 2.18354806E-01 2.44074732E-01 2.85821289E-01 2.67998725E-01 + 1.76947236E-01 3.52456234E-02 2.26156451E-02 3.02943718E-02 + 5.78933693E-02 3.65821421E-02 4.89616506E-02 1.27102807E-01 + 2.45406821E-01 1.97865441E-01 1.65812373E-01 1.50257915E-01 + 2.17767626E-01 1.99171573E-01 2.00379848E-01 9.58017185E-02 + 3.26887295E-02 1.10503994E-01 6.01015016E-02 5.96631430E-02 + 7.89220259E-02 1.01496063E-01 1.90564513E-01 2.32151777E-01 + 1.38566270E-01 1.20175116E-01 2.45790586E-01 1.73310563E-01 + 2.04138011E-01 2.33082771E-01 2.07172692E-01 1.94875956E-01 + 4.92668524E-02 6.35698587E-02 9.26009864E-02 1.08347125E-01 + 1.54723436E-01 1.96876109E-01 2.05546275E-01 1.27261624E-01 + 2.02482596E-01 2.36096784E-01 2.36066580E-01 2.42992923E-01 + 2.81354129E-01 3.06080520E-01 1.93764195E-01 9.81088057E-02 + 8.90687779E-02 9.99948606E-02 1.07106902E-01 9.70842093E-02 + 1.61101237E-01 1.11412883E-01 1.17157213E-01 1.94816291E-01 + 2.01183826E-01 2.29646832E-01 2.62335598E-01 2.56176770E-01 + 2.89700001E-01 1.85262069E-01 1.07332185E-01 1.38214543E-01 + 1.17818765E-01 1.12002105E-01 1.33667812E-01 6.79171160E-02 + 4.76978570E-02 1.44946709E-01 2.20468655E-01 2.35400826E-01 + 2.54198104E-01 2.17146143E-01 2.20362082E-01 1.31439507E-01 + 1.19938836E-01 1.65194273E-01 6.13566488E-02 6.84136525E-02 + 1.69479415E-01 9.47936475E-02 8.63501281E-02 1.75189748E-01 + 1.98030129E-01 2.01116443E-01 2.48330012E-01 1.92975953E-01 + 2.08581835E-01 1.62940308E-01 1.26047254E-01 1.49823099E-01 + 3.63762006E-02 4.74796854E-02 1.05586693E-01 1.36791393E-01 + 1.31311268E-01 2.40334466E-01 2.14957118E-01 2.21215531E-01 + 1.50437504E-01 1.36601582E-01 1.93010584E-01 2.25113973E-01 + 1.28902063E-01 9.68892425E-02 3.41019072E-02 1.17716510E-02 + 4.03347872E-02 1.07710704E-01 1.56076372E-01 2.37236038E-01 + 2.69105881E-01 2.63239652E-01 2.10826814E-01 2.31432065E-01 + 2.30262950E-01 1.91040665E-01 1.92049995E-01 1.22104339E-01 + 3.58210430E-02 3.36585492E-02 3.88380475E-02 3.95626388E-02 + 4.32443172E-02 2.02946857E-01 1.36856928E-01 2.23963454E-01 + 2.07450077E-01 1.97148710E-01 1.97744548E-01 2.02222407E-01 + 2.38231882E-01 2.38540709E-01 2.11140692E-01 9.57215652E-02 + 2.12951705E-01 1.93605006E-01 8.14876258E-02 1.71654746E-01 + 6.85537830E-02 1.84554175E-01 2.38306239E-01 1.92731023E-01 + 2.42871299E-01 2.19936475E-01 2.30974540E-01 2.13392824E-01 + 2.16556564E-01 2.70021975E-01 2.51513869E-01 2.12168917E-01 + 1.34584025E-01 1.68925643E-01 8.55179429E-02 2.27079675E-01 + 3.10884327E-01 2.57313877E-01 2.80479163E-01 2.54495442E-01 + 2.72269934E-01 2.28926480E-01 1.69908598E-01 2.52367228E-01 + 2.40881100E-01 2.08076298E-01 1.90601870E-01 1.85363546E-01 + 2.07423985E-01 2.48317540E-01 2.70741671E-01 2.94320285E-01 + 2.49271214E-01 2.17142835E-01 2.32199386E-01 2.62304753E-01 + 1.78803578E-01 1.83110163E-01 2.02641785E-01 1.98679626E-01 + 2.47466728E-01 1.84620753E-01 1.73968345E-01 2.21807718E-01 + 2.10840106E-01 2.17090279E-01 1.56882137E-01 2.32383043E-01 + 2.34058321E-01 2.29125217E-01 1.80217266E-01 1.89976692E-01 + 2.08131045E-01 2.12657392E-01 2.44309053E-01 2.43480235E-01 + 2.68931687E-01 2.59874344E-01 2.24073753E-01 2.16381088E-01 + 1.88693255E-01 2.73215532E-01 2.40694538E-01 2.12371945E-01 + 2.85876930E-01 2.39812896E-01 1.95581988E-01 2.00492352E-01 + 2.28853583E-01 2.63062507E-01 2.52692580E-01 2.71023452E-01 + 2.66685218E-01 2.35969752E-01 2.26124302E-01 2.61620700E-01 + 8.45688656E-02 8.21920037E-02 2.44879007E-01 2.53652930E-01 + 2.11546749E-01 2.50024080E-01 2.55699486E-01 2.62421519E-01 + 2.71362036E-01 2.54433393E-01 2.85646915E-01 2.93427587E-01 + 2.55309492E-01 2.71020859E-01 1.00616269E-01 1.10952660E-01 + 1.73533633E-01 2.43796661E-01 2.45216534E-01 2.07815275E-01 + 1.96285099E-01 2.32230410E-01 2.65310585E-01 3.11452538E-01 + 2.95638144E-01 2.43346944E-01 2.27831408E-01 1.56587660E-01 + 8.69998038E-02 1.20926596E-01 1.70589700E-01 2.20706627E-01 + 2.32141227E-01 2.32368141E-01 2.08356306E-01 2.13597387E-01 + 2.65552163E-01 2.43597373E-01 2.68449783E-01 2.32755974E-01 + 2.00084284E-01 1.71076044E-01 1.82627335E-01 1.08888745E-01 + 6.23613484E-02 1.10866562E-01 2.24695876E-01 2.01364622E-01 + 2.22198263E-01 2.25200519E-01 2.45643094E-01 2.39186868E-01 + 2.38860056E-01 2.17266560E-01 1.54606462E-01 1.71299979E-01 + 8.62979442E-02 5.89510314E-02 9.87767130E-02 2.87394434E-01 + 2.35950828E-01 1.93265826E-01 2.16191664E-01 2.23802850E-01 + 2.53093094E-01 2.81018794E-01 2.49989554E-01 2.25672767E-01 + 1.41683355E-01 9.69657749E-02 5.13970219E-02 9.34094116E-02 + 1.45909235E-01 2.50202149E-01 2.48693749E-01 1.26404703E-01 + 1.55352548E-01 2.51708210E-01 2.19049796E-01 2.64467031E-01 + 2.32457295E-01 2.10653305E-01 1.48211822E-01 1.00793503E-01 + 8.48413929E-02 9.58762020E-02 1.98005795E-01 2.63795763E-01 + 2.60678440E-01 1.04979418E-01 6.80188388E-02 2.31094465E-01 + 2.85597056E-01 1.53018072E-01 3.96334305E-02 4.90273088E-02 + 1.74004175E-02 5.85575961E-02 8.32628533E-02 1.21430695E-01 + 2.34963909E-01 2.56847769E-01 2.33539537E-01 2.51235068E-01 + 2.58913189E-01 2.67248809E-01 1.41797736E-01 6.52805939E-02 + 4.00090888E-02 5.88720664E-02 1.75643153E-02 7.16765597E-02 + 1.01806141E-01 1.98803708E-01 2.87303418E-01 2.36119300E-01 + 1.95335537E-01 1.79238558E-01 2.52259225E-01 2.66344577E-01 + 1.01409785E-01 6.23998046E-02 4.56291251E-02 8.05796683E-02 + 5.96352667E-02 9.59314853E-02 1.27508521E-01 2.17549413E-01 + 2.02734649E-01 2.31973305E-01 1.51495039E-01 1.54493198E-01 + 2.94659466E-01 2.66815841E-01 2.58593678E-01 1.37553543E-01 + 1.11503772E-01 1.28976986E-01 5.30506074E-02 1.09646834E-01 + 1.29428759E-01 1.54609770E-01 1.86155140E-01 2.29211211E-01 + 1.81547374E-01 8.20803121E-02 2.56080359E-01 2.14335382E-01 + 2.33884960E-01 2.70828187E-01 2.61683673E-01 2.84779012E-01 + 5.10453098E-02 1.22631282E-01 1.51422739E-01 1.68273747E-01 + 1.33369446E-01 1.50569558E-01 1.85055450E-01 8.46145824E-02 + 1.66074440E-01 1.86731875E-01 2.56985754E-01 2.16432929E-01 + 2.58998424E-01 2.83881932E-01 1.60764709E-01 1.09333888E-01 + 1.45403817E-01 1.74939096E-01 1.46091670E-01 9.56789628E-02 + 8.93988907E-02 5.29574230E-02 6.67984709E-02 1.43900141E-01 + 2.51409769E-01 2.03560635E-01 2.20553845E-01 2.23340988E-01 + 2.64194220E-01 1.70030951E-01 1.38729930E-01 1.38678625E-01 + 9.25404057E-02 6.62533864E-02 6.41463250E-02 4.52772379E-02 + 8.09599385E-02 1.86828569E-01 2.68624544E-01 2.39087865E-01 + 1.82078004E-01 1.89496949E-01 1.90905392E-01 1.68563962E-01 + 1.38467535E-01 1.07447445E-01 7.91949630E-02 7.33628199E-02 + 1.86746433E-01 7.82048404E-02 5.78942858E-02 2.18663573E-01 + 2.13461235E-01 2.26886496E-01 1.69277772E-01 1.90217912E-01 + 2.05692500E-01 2.36684263E-01 1.08184427E-01 9.16784406E-02 + 7.82531947E-02 4.88471240E-02 4.59774956E-03 1.42939404E-01 + 9.25739482E-02 2.41921887E-01 2.77226597E-01 2.63401061E-01 + 2.19497338E-01 2.64632970E-01 2.58672684E-01 2.60946035E-01 + 2.15502352E-01 7.79388696E-02 7.29989111E-02 4.00246903E-02 + 1.47933736E-02 7.31006414E-02 3.73735316E-02 1.88675895E-01 + 1.52840361E-01 2.62384355E-01 2.50835836E-01 2.55336225E-01 + 2.59810746E-01 2.71314085E-01 2.39849418E-01 2.16046885E-01 + 1.84410706E-01 8.34162161E-02 1.42824665E-01 1.58740178E-01 + 6.53602779E-02 1.42364874E-01 3.64135280E-02 1.98309764E-01 + 2.39222959E-01 1.68971017E-01 2.70979166E-01 2.23427728E-01 + 2.59404302E-01 2.67343849E-01 2.15925276E-01 1.94315687E-01 + 2.29650870E-01 2.11137965E-01 1.15818702E-01 1.01318978E-01 + 5.05263470E-02 1.87144861E-01 2.48415604E-01 2.27828279E-01 + 2.22723186E-01 2.20324576E-01 2.32588798E-01 2.02501342E-01 + 1.76432177E-01 2.31058508E-01 1.91965938E-01 2.15065554E-01 + 1.75401866E-01 9.01296884E-02 9.00236294E-02 2.37741917E-01 + 2.62051553E-01 2.71416545E-01 2.48070627E-01 2.33832896E-01 + 1.93679556E-01 2.10560411E-01 2.08965078E-01 2.24552110E-01 + 1.83415815E-01 1.99646041E-01 2.03768477E-01 1.68428048E-01 + 1.47686347E-01 1.90884918E-01 2.34968737E-01 2.64820695E-01 + 2.45630175E-01 2.29900748E-01 2.00520545E-01 2.19102338E-01 + 2.02891678E-01 2.22194552E-01 2.19019130E-01 2.67463952E-01 + 2.73843765E-01 2.62057424E-01 2.28751868E-01 2.37591118E-01 + 1.95539951E-01 2.33796850E-01 2.41732910E-01 2.73844332E-01 + 2.98093617E-01 2.88127244E-01 2.68613636E-01 2.32430682E-01 + 1.85098127E-01 2.04377860E-01 2.58042306E-01 2.53549308E-01 + 2.12219343E-01 2.57632822E-01 2.31417462E-01 2.24315554E-01 + 2.16595083E-01 2.33321577E-01 2.82341838E-01 1.99716732E-01 + 2.91131914E-01 2.45792687E-01 2.19265580E-01 2.25071952E-01 + 2.30531678E-01 2.18057811E-01 2.82756388E-01 2.51111716E-01 + 2.60033727E-01 3.12578291E-01 2.17611670E-01 1.94349542E-01 + 1.69820517E-01 1.27884179E-01 1.20308779E-01 2.10139588E-01 + 2.41523430E-01 2.34657273E-01 2.77143419E-01 2.21885532E-01 + 2.57985771E-01 2.58281559E-01 2.77381331E-01 3.03200394E-01 + 2.58982241E-01 2.52663344E-01 1.53090894E-01 1.42048880E-01 + 5.93073703E-02 1.86608061E-01 2.36519650E-01 2.34434292E-01 + 2.63645023E-01 2.69703507E-01 2.26572022E-01 2.37024114E-01 + 2.76118129E-01 2.88431466E-01 2.33921111E-01 2.27086008E-01 + 1.16824202E-01 1.00702442E-01 1.46834582E-01 2.91403443E-01 + 2.72701681E-01 2.15619609E-01 1.81740433E-01 2.77058512E-01 + 2.14208350E-01 1.99531168E-01 2.28195921E-01 2.55712807E-01 + 2.42919758E-01 1.43064111E-01 1.42916262E-01 1.49573848E-01 + 7.27757663E-02 7.48710185E-02 2.03603938E-01 2.13088512E-01 + 2.03214705E-01 1.59346402E-01 2.35170230E-01 3.09389442E-01 + 3.15162629E-01 2.85629421E-01 1.54781625E-01 1.08257815E-01 + 8.39018524E-02 8.60955045E-02 1.21504210E-01 2.49735549E-01 + 2.34055012E-01 2.00443774E-01 1.29101112E-01 2.30320141E-01 + 2.05645189E-01 2.50933468E-01 2.64812917E-01 2.13862896E-01 + 1.53691754E-01 9.40194130E-02 9.33356658E-02 7.62412474E-02 + 1.65503278E-01 2.58822590E-01 2.56827623E-01 1.25274763E-01 + 1.13877699E-01 2.20493332E-01 1.94463894E-01 2.47165635E-01 + 1.98235452E-01 1.68672994E-01 4.26901989E-02 8.44329894E-02 + 8.50830227E-02 3.40536349E-02 1.60227612E-01 1.33046612E-01 + 1.83874503E-01 2.39086822E-01 2.51104385E-01 2.48628706E-01 + 1.66695029E-01 8.40354189E-02 1.05754115E-01 1.88700855E-01 + 3.19213048E-02 7.49969110E-02 1.07045732E-01 9.84849632E-02 + 1.74893603E-01 1.99072748E-01 1.98397517E-01 1.99167982E-01 + 2.44089589E-01 2.86972582E-01 1.56669259E-01 1.09695189E-01 + 1.01686038E-01 9.85708758E-02 5.85407615E-02 1.11193068E-01 + 1.66449293E-01 1.54241890E-01 1.50590166E-01 1.21514276E-01 + 1.82855785E-01 2.39642248E-01 3.10281724E-01 2.74327785E-01 + 2.80411452E-01 2.64009297E-01 1.91645727E-01 1.45529643E-01 + 1.12839788E-01 1.58218712E-01 1.84007272E-01 1.90665051E-01 + 1.26106590E-01 6.23688810E-02 1.52485460E-01 1.66760445E-01 + 2.08842918E-01 2.39713237E-01 2.26363629E-01 2.72593468E-01 + 2.45006204E-01 2.33280763E-01 1.84352964E-01 1.87810093E-01 + 2.09947526E-01 1.76869228E-01 1.15268052E-01 4.15289290E-02 + 1.47271663E-01 1.24087006E-01 1.49171516E-01 2.06017941E-01 + 2.58340091E-01 2.34509632E-01 2.67835289E-01 2.72053212E-01 + 1.67069986E-01 1.80700168E-01 2.16386452E-01 2.06610590E-01 + 1.20934434E-01 4.49081771E-02 8.55654255E-02 8.50711167E-02 + 1.42820626E-01 2.06936404E-01 2.43179664E-01 1.93154410E-01 + 1.97344765E-01 2.09059060E-01 2.46855035E-01 1.75913244E-01 + 1.89509407E-01 1.31058753E-01 1.26397550E-01 7.72418156E-02 + 2.84335576E-02 6.45587295E-02 1.31026164E-01 1.38688311E-01 + 2.32337162E-01 2.14995831E-01 1.58822462E-01 1.81270078E-01 + 2.18535244E-01 1.88129440E-01 1.38079628E-01 1.34893537E-01 + 9.55391452E-02 7.86018968E-02 2.85328925E-02 3.41281332E-02 + 7.67374411E-02 1.50863528E-01 2.03698874E-01 2.55901068E-01 + 1.99540913E-01 2.25724950E-01 2.56288946E-01 2.03938231E-01 + 1.48325205E-01 1.39324337E-01 9.14945826E-02 4.55498956E-02 + 3.80566064E-03 5.79387285E-02 6.16491213E-02 1.01088330E-01 + 1.19810395E-01 2.03436166E-01 2.38225549E-01 2.48872668E-01 + 2.11444452E-01 2.01034129E-01 2.33383864E-01 1.54483125E-01 + 1.46378815E-01 8.45572501E-02 1.29575813E-02 1.15098119E-01 + 1.15972519E-01 1.09380931E-01 6.94710165E-02 1.87188253E-01 + 2.31747657E-01 2.24746957E-01 2.24678144E-01 2.25019306E-01 + 2.61207312E-01 2.37519041E-01 2.36395746E-01 1.74115002E-01 + 1.03121683E-01 7.28344619E-02 1.21728703E-01 1.03071421E-01 + 3.51326168E-02 1.28296167E-01 2.11053938E-01 1.48877695E-01 + 1.80254936E-01 1.97662979E-01 2.05064163E-01 2.04513758E-01 + 2.59461403E-01 2.22145230E-01 2.04071447E-01 1.70276731E-01 + 1.89092666E-01 1.69160604E-01 4.34722640E-02 1.08839430E-01 + 1.27151772E-01 1.49902552E-01 1.32240623E-01 1.64129674E-01 + 1.35377109E-01 1.67613238E-01 1.92380980E-01 1.92974344E-01 + 2.03655005E-01 2.19722077E-01 2.03052536E-01 2.01661557E-01 + 8.80058184E-02 1.27407402E-01 1.37064219E-01 1.70596555E-01 + 1.81255847E-01 1.75257146E-01 1.41524553E-01 1.78513154E-01 + 2.16573149E-01 1.88740134E-01 1.98640451E-01 2.23474324E-01 + 2.38123894E-01 2.23263204E-01 9.39432532E-02 1.56604558E-01 + 1.86754167E-01 1.68135077E-01 1.54068738E-01 1.74326375E-01 + 1.80937037E-01 2.17896730E-01 2.30496794E-01 2.25238711E-01 + 2.08645985E-01 2.23610699E-01 2.27716655E-01 2.25065097E-01 + 1.65812612E-01 2.21438110E-01 2.29128748E-01 2.47821659E-01 + 2.51822174E-01 2.31101632E-01 2.01526850E-01 2.23352045E-01 + 1.98183432E-01 2.39755675E-01 2.40673915E-01 2.01012269E-01 + 2.04142898E-01 2.41588742E-01 2.04729244E-01 2.47945726E-01 + 2.30302200E-01 2.21516371E-01 2.67271787E-01 2.81628162E-01 + 2.94007957E-01 3.15180004E-01 3.12312156E-01 1.95067063E-01 + 2.36033142E-01 2.35690475E-01 2.42741361E-01 2.42757991E-01 + 2.51897901E-01 2.30399564E-01 2.59091377E-01 3.01372409E-01 + 1.95734054E-01 2.64979452E-01 2.41544142E-01 1.63885742E-01 + 1.26232818E-01 2.05781773E-01 2.60589659E-01 2.62442768E-01 + 2.80219972E-01 2.46293038E-01 2.47064948E-01 2.48422861E-01 + 2.59649962E-01 3.00512820E-01 2.01500371E-01 2.70477384E-01 + 1.89449936E-01 1.28284812E-01 8.90869945E-02 1.90842330E-01 + 2.60486424E-01 2.52294272E-01 2.44222015E-01 2.34719694E-01 + 2.04303354E-01 2.41522282E-01 2.42492780E-01 2.88271517E-01 + 1.87059268E-01 2.72895962E-01 1.69956475E-01 1.18086979E-01 + 9.76396799E-02 2.59047568E-01 2.77768791E-01 2.57308751E-01 + 2.07483411E-01 1.71257824E-01 1.76857471E-01 2.36554429E-01 + 2.61104345E-01 2.20216602E-01 1.94953889E-01 1.99131206E-01 + 8.45902488E-02 1.14477970E-01 1.99898034E-01 2.67932534E-01 + 2.49007791E-01 2.29924157E-01 1.41073138E-01 1.74233288E-01 + 1.92236155E-01 2.53766656E-01 2.51588523E-01 2.95689076E-01 + 2.86311060E-01 1.71675459E-01 1.05714187E-01 1.27875909E-01 + 1.24372631E-01 9.36747193E-02 1.58636227E-01 2.16371045E-01 + 1.83719382E-01 1.55535266E-01 2.26127982E-01 2.09522635E-01 + 1.79465279E-01 2.18182012E-01 1.54676154E-01 1.22707538E-01 + 8.31907615E-02 6.94929585E-02 1.09477676E-01 2.28230059E-01 + 2.57802993E-01 2.40664765E-01 1.67472616E-01 1.91456318E-01 + 1.42118827E-01 1.57692641E-01 1.61410585E-01 1.69641092E-01 + 1.85440823E-01 1.72710732E-01 1.65768728E-01 2.24034354E-01 + 2.32280284E-01 2.32443839E-01 2.05226615E-01 1.64847374E-01 + 1.70183018E-01 1.43597484E-01 8.33870620E-02 3.05685960E-02 + 1.50293991E-01 1.78520590E-01 1.54475644E-01 1.81457773E-01 + 1.88910708E-01 2.21766740E-01 2.29678869E-01 1.90538615E-01 + 1.69211224E-01 1.80314839E-01 1.38802961E-01 1.98611170E-01 + 5.95117249E-02 5.71074970E-02 1.30854860E-01 1.73253611E-01 + 9.58050936E-02 1.52011395E-01 1.86955810E-01 2.17923686E-01 + 1.91884175E-01 1.73253715E-01 1.90493613E-01 2.20251620E-01 + 1.86356291E-01 2.49854431E-01 7.64444247E-02 8.12371597E-02 + 1.10064164E-01 1.04805030E-01 3.20694633E-02 1.49620235E-01 + 1.61335513E-01 2.12307125E-01 1.95478857E-01 1.88341588E-01 + 2.21755236E-01 2.26486430E-01 1.90122068E-01 1.93644553E-01 + 4.84388061E-02 9.57462564E-02 1.31958425E-01 4.30702306E-02 + 1.74637333E-01 1.93048507E-01 2.05046296E-01 2.23778307E-01 + 1.78593621E-01 1.40676022E-01 2.22564444E-01 1.40707269E-01 + 1.80396900E-01 2.02324077E-01 1.11974999E-01 1.38233557E-01 + 1.54937014E-01 7.12060705E-02 9.82689038E-02 1.64655536E-01 + 2.03280792E-01 1.64514422E-01 1.15716495E-01 1.40900493E-01 + 1.02545574E-01 9.47460160E-02 1.93468854E-01 1.86858371E-01 + 1.10343792E-01 1.88587993E-01 1.87983349E-01 1.59059837E-01 + 1.48248881E-01 1.61017239E-01 1.89375997E-01 1.54589131E-01 + 1.85092658E-01 1.19809352E-01 9.28084715E-04 1.17725395E-01 + 2.25034103E-01 1.97277665E-01 1.62495703E-01 1.74606875E-01 + 2.05698341E-01 1.35849074E-01 1.09638385E-01 1.25173256E-01 + 2.04764038E-01 2.02029362E-01 1.63327664E-01 1.12323292E-01 + 1.57284722E-01 2.01948658E-01 1.93674877E-01 2.03530282E-01 + 2.87053347E-01 2.54968494E-01 2.07366005E-01 2.36369178E-01 + 1.85756147E-01 1.79374680E-01 1.80111066E-01 1.81872457E-01 + 1.59714848E-01 9.31361392E-02 1.03142224E-01 7.83685744E-02 + 9.21015516E-02 9.20402184E-02 1.86029658E-01 1.79015800E-01 + 2.09493056E-01 2.16214180E-01 2.23898962E-01 1.78531617E-01 + 1.50327504E-01 1.19942039E-01 1.53339222E-01 8.31879005E-02 + 6.94402754E-02 6.41010702E-02 1.20877817E-01 1.85112581E-01 + 2.71328151E-01 2.36902192E-01 2.76994318E-01 2.62508720E-01 + 1.93391636E-01 1.29607171E-01 8.19961429E-02 1.11284286E-01 + 1.56470358E-01 1.23091593E-01 7.94202462E-02 6.22050837E-02 + 2.01948568E-01 1.80135831E-01 2.64572620E-01 2.38814160E-01 + 2.41940886E-01 2.31333256E-01 2.16072574E-01 1.47827208E-01 + 1.49515808E-01 1.89067006E-01 2.12958708E-01 1.29926071E-01 + 8.01059678E-02 8.15485865E-02 2.64294654E-01 1.89251930E-01 + 1.54695660E-01 2.33915657E-01 2.66004741E-01 2.36535296E-01 + 2.62477934E-01 2.28936315E-01 2.09203824E-01 2.01424494E-01 + 1.79605365E-01 1.32259712E-01 1.03367813E-01 9.97186527E-02 + 1.72482520E-01 1.78241268E-01 1.43358931E-01 2.07137376E-01 + 2.49857172E-01 2.33940244E-01 2.38634050E-01 2.30797991E-01 + 2.09037319E-01 2.17475474E-01 2.09084511E-01 1.66071907E-01 + 1.13143377E-01 8.30505416E-02 8.69364962E-02 1.33346885E-01 + 1.77837640E-01 2.51955122E-01 2.87668884E-01 2.72773743E-01 + 2.21512243E-01 2.06237271E-01 1.95831448E-01 2.07641229E-01 + 2.28456393E-01 2.22010642E-01 1.22154512E-01 1.15845658E-01 + 1.43145010E-01 1.18302718E-01 2.37091124E-01 2.40513891E-01 + 2.49825403E-01 2.77421534E-01 2.29336038E-01 2.11373627E-01 + 2.34943256E-01 2.32300654E-01 2.01291054E-01 2.01913163E-01 + 1.81459293E-01 1.14706807E-01 1.03659056E-01 1.43089250E-01 + 1.83716044E-01 2.47163847E-01 1.93618283E-01 2.15245619E-01 + 2.24692136E-01 2.15429381E-01 2.36133099E-01 2.72976369E-01 + 2.43762806E-01 1.71880394E-01 1.87964454E-01 2.71374136E-01 + 2.71772206E-01 2.49162987E-01 2.66219109E-01 2.45927215E-01 + 2.08107337E-01 2.26395428E-01 1.98711574E-01 2.73571461E-01 + 2.39138350E-01 2.45565787E-01 1.69644848E-01 1.43621668E-01 + 2.36394942E-01 2.23060429E-01 2.43102834E-01 2.68321931E-01 + 2.35396057E-01 2.52858162E-01 2.90203214E-01 2.80042738E-01 + 1.75365165E-01 2.34076589E-01 2.25616932E-01 1.55674040E-01 + 1.01947412E-01 2.14448184E-01 3.09558809E-01 2.55695164E-01 + 2.24705130E-01 1.98470220E-01 2.11431116E-01 2.84407318E-01 + 3.46300900E-01 2.81627715E-01 1.62374616E-01 2.42892385E-01 + 1.79300338E-01 1.37449786E-01 1.10805534E-01 2.52400935E-01 + 2.62919307E-01 2.33439997E-01 1.77134469E-01 1.78433925E-01 + 2.10840672E-01 2.47845516E-01 2.58687615E-01 2.12847143E-01 + 1.73543572E-01 2.79756755E-01 1.40957162E-01 1.21261753E-01 + 1.16230272E-01 2.57309765E-01 2.36162171E-01 2.38843173E-01 + 1.86637893E-01 1.84203207E-01 2.57434607E-01 2.26504058E-01 + 2.07597733E-01 1.48528159E-01 1.56001553E-01 1.68916807E-01 + 8.28320533E-02 1.18579887E-01 1.87882721E-01 2.26261765E-01 + 2.40835741E-01 2.12210998E-01 2.21201003E-01 2.07000807E-01 + 2.32057065E-01 1.83320016E-01 1.73198834E-01 1.90205157E-01 + 2.09054917E-01 1.96493015E-01 2.46747345E-01 2.42441908E-01 + 2.52912402E-01 2.74963856E-01 1.97363853E-01 2.30928823E-01 + 2.27391571E-01 2.21687883E-01 2.97758400E-01 2.76816785E-01 + 2.95930982E-01 2.38453701E-01 1.12047248E-01 1.26689777E-01 + 1.08620271E-01 8.90732333E-02 8.75542387E-02 7.10672885E-02 + 1.59635365E-01 2.44731173E-01 2.67424077E-01 2.55403936E-01 + 3.23275179E-01 2.84557760E-01 1.61968231E-01 1.43450990E-01 + 5.54931983E-02 1.10231258E-01 9.89423841E-02 1.10273436E-01 + 1.52485639E-01 8.99936333E-02 1.41815558E-01 1.76722527E-01 + 2.10999906E-01 2.57348835E-01 1.95540532E-01 2.79373787E-02 + 6.59851357E-02 1.05974793E-01 2.87144557E-02 8.61456022E-02 + 9.45255384E-02 1.80778012E-01 2.14172438E-01 1.82287350E-01 + 1.77769646E-01 2.11115718E-01 2.53269285E-01 2.93836355E-01 + 6.33243769E-02 2.30567213E-02 8.58441740E-02 7.76354074E-02 + 2.03673504E-02 6.91668019E-02 1.40289530E-01 2.15355888E-01 + 2.10901454E-01 2.21407384E-01 2.18157887E-01 2.11839423E-01 + 2.40490958E-01 2.23109826E-01 2.32317988E-02 5.37818223E-02 + 1.12411201E-01 6.95259273E-02 5.44045009E-02 1.22233286E-01 + 1.98751748E-01 2.06700742E-01 1.97137594E-01 1.29939884E-01 + 2.03234553E-01 1.63934708E-01 2.19185069E-01 2.21504539E-01 + 8.54385868E-02 1.16866067E-01 1.48070484E-01 8.83525610E-02 + 1.92713067E-01 1.65543750E-01 1.74393147E-01 1.69286594E-01 + 1.43093824E-01 1.20961145E-01 9.13351923E-02 7.90700167E-02 + 2.00289875E-01 1.59792259E-01 2.51870602E-01 2.63487726E-01 + 1.93990022E-01 1.00446880E-01 8.98307860E-02 1.27959535E-01 + 1.68303058E-01 1.81424201E-01 1.06817804E-01 8.03868324E-02 + 5.48850261E-02 4.96906750E-02 1.52755439E-01 1.66283369E-01 + 2.92901218E-01 2.25012302E-01 2.12280661E-01 1.43563494E-01 + 7.00069219E-02 1.17650367E-01 1.74544334E-01 1.42477810E-01 + 8.71412531E-02 5.36611937E-02 1.28941834E-02 4.21606041E-02 + 1.60537601E-01 1.59409523E-01 2.74958014E-01 2.72729278E-01 + 2.21290573E-01 1.87613741E-01 8.96084458E-02 1.23165406E-01 + 1.51154384E-01 1.26226246E-01 7.20206052E-02 7.50368759E-02 + 9.34656560E-02 9.60831270E-02 1.22203514E-01 1.70885310E-01 + 1.92722708E-01 1.84687778E-01 1.74719244E-01 1.37325227E-01 + 1.05745144E-01 1.39058888E-01 1.51884392E-01 1.37317657E-01 + 9.68655199E-02 1.27934963E-01 1.11461528E-01 1.39417663E-01 + 1.42957211E-01 1.35648191E-01 1.70350060E-01 2.05673754E-01 + 1.85624465E-01 2.27976054E-01 1.92490920E-01 1.69857904E-01 + 1.61346778E-01 1.52905151E-01 1.53081626E-01 1.39758348E-01 + 9.89051610E-02 9.74873081E-02 1.27315432E-01 1.26250729E-01 + 1.71847299E-01 1.64402813E-01 1.92351952E-01 2.05788821E-01 + 2.42490217E-01 2.27637604E-01 1.19162738E-01 1.15387402E-01 + 1.70329973E-01 1.37775242E-01 8.67487639E-02 3.70631889E-02 + 1.22525066E-01 2.16487512E-01 7.07725435E-02 1.81881204E-01 + 2.29570448E-01 2.39173442E-01 2.42092937E-01 1.93707794E-01 + 1.46662995E-01 2.07882926E-01 2.44315267E-01 2.38413602E-01 + 1.70898885E-01 9.10810009E-02 1.50311366E-01 2.71255314E-01 + 7.76973814E-02 1.14616401E-01 2.06013963E-01 1.31598160E-01 + 1.96989179E-01 1.64573386E-01 1.75157264E-01 1.62793919E-01 + 1.56002536E-01 8.07873681E-02 1.11215413E-01 9.29034874E-02 + 9.65126976E-02 1.25810027E-01 9.67639461E-02 5.68541102E-02 + 7.34047145E-02 9.40804482E-02 1.89739123E-01 2.28316933E-01 + 2.41499975E-01 2.34806657E-01 2.37411857E-01 2.22972050E-01 + 2.20806986E-01 1.48185551E-01 8.87482539E-02 1.18143089E-01 + 9.81481150E-02 9.89615619E-02 1.27302930E-01 1.69898942E-01 + 2.04124868E-01 2.69175440E-01 2.73560673E-01 2.97536492E-01 + 2.51104265E-01 2.16290712E-01 2.27093279E-01 1.78246230E-01 + 2.15803131E-01 1.22885548E-01 2.20254675E-01 1.86346009E-01 + 2.27380395E-01 2.31494382E-01 2.49648958E-01 3.05546016E-01 + 3.38182092E-01 3.28366995E-01 2.83381611E-01 2.46715412E-01 + 2.35906020E-01 2.64451861E-01 2.12620810E-01 2.09877819E-01 + 1.75952733E-01 1.50225133E-01 2.11351335E-01 2.16808528E-01 + 1.86501652E-01 2.23038539E-01 1.96296483E-01 2.48342171E-01 + 2.25898996E-01 1.91272333E-01 2.09325850E-01 1.97306424E-01 + 1.59598127E-01 2.29108229E-01 2.73306310E-01 2.52964020E-01 + 2.29726449E-01 2.02978969E-01 1.17508397E-01 2.07837269E-01 + 2.08995387E-01 1.82158604E-01 1.32757261E-01 1.18488275E-01 + 2.25613698E-01 2.41915241E-01 2.28770867E-01 2.41223574E-01 + 2.46549606E-01 3.00442010E-01 2.15587735E-01 1.88393489E-01 + 1.80627733E-01 2.78288841E-01 2.13684186E-01 1.40455827E-01 + 9.46482271E-02 1.71832010E-01 2.15973616E-01 2.25255072E-01 + 2.25615069E-01 1.96497336E-01 2.53470033E-01 3.14640999E-01 + 2.73847282E-01 2.46333092E-01 1.47983253E-01 2.63641953E-01 + 2.02874675E-01 1.25900373E-01 9.82797220E-02 2.07526386E-01 + 2.42939323E-01 2.83844411E-01 2.54982054E-01 2.26689875E-01 + 2.77410924E-01 2.49032453E-01 2.42363513E-01 1.52650520E-01 + 1.60504729E-01 1.88315421E-01 9.98786390E-02 1.05182700E-01 + 1.17532000E-01 1.90039411E-01 2.23317251E-01 2.39367634E-01 + 2.74311215E-01 2.25304633E-01 2.66391844E-01 2.29858413E-01 + 2.09855065E-01 1.59182340E-01 1.57750145E-01 1.14265949E-01 + 6.44962564E-02 1.29964560E-01 1.81075722E-01 2.22290337E-01 + 2.47456372E-01 1.52330115E-01 1.52621061E-01 2.03384548E-01 + 2.37609297E-01 2.16992900E-01 2.68355280E-01 2.77023643E-01 + 1.55275464E-01 1.42860442E-01 8.91118869E-02 6.34098798E-02 + 8.76416788E-02 7.91569203E-02 1.29504412E-01 3.04056108E-01 + 2.93448180E-01 2.41247088E-01 2.36380726E-01 2.39086598E-01 + 2.25175470E-01 2.03769714E-01 4.61251847E-02 9.08334926E-02 + 8.22598636E-02 6.40301853E-02 1.52452692E-01 1.12831391E-01 + 2.09545597E-01 2.07991481E-01 2.21277535E-01 2.13223591E-01 + 1.95062190E-01 1.20254405E-01 2.57186648E-02 6.07316606E-02 + 1.56203145E-02 5.13221584E-02 1.05606325E-01 1.53559148E-01 + 2.42790580E-01 2.60619074E-01 2.45615795E-01 2.51281828E-01 + 2.52451986E-01 2.67580926E-01 1.24530628E-01 1.72283016E-02 + 4.69151810E-02 6.29582256E-02 2.03494765E-02 8.54059830E-02 + 1.15603849E-01 2.04977766E-01 2.64984012E-01 2.91166693E-01 + 2.80644357E-01 2.53588557E-01 2.81650275E-01 2.40559489E-01 + 6.03462234E-02 4.37241457E-02 7.73422718E-02 6.35597482E-02 + 2.84106769E-02 7.75744990E-02 1.63600713E-01 2.53277570E-01 + 2.30577484E-01 1.59295052E-01 2.70048708E-01 2.60604024E-01 + 2.89682776E-01 2.54400045E-01 2.86394823E-02 7.82154575E-02 + 1.23588547E-01 6.91042840E-02 1.59630448E-01 1.51059940E-01 + 2.49545187E-01 2.10733727E-01 1.92758232E-01 8.55757222E-02 + 2.53819048E-01 7.19192550E-02 2.09699333E-01 2.30321661E-01 + 1.66759863E-01 1.64778858E-01 1.56820819E-01 6.22959659E-02 + 1.53732717E-01 1.22997977E-01 1.96784407E-01 1.53750822E-01 + 1.16887495E-01 4.74256314E-02 1.44797534E-01 6.13673590E-02 + 1.32948101E-01 2.17172101E-01 2.27509081E-01 2.46431336E-01 + 1.95281416E-01 1.01130992E-01 7.70300627E-02 1.39116377E-01 + 1.96315289E-01 1.33981481E-01 1.18664190E-01 6.17888533E-02 + 7.38555044E-02 3.74904647E-02 9.10323337E-02 2.39764929E-01 + 2.70150900E-01 2.45266095E-01 2.15908274E-01 1.91740498E-01 + 8.26750323E-02 1.48134917E-01 1.85115874E-01 1.24600410E-01 + 1.18365884E-01 8.03645849E-02 7.50747398E-02 4.07804772E-02 + 8.02426189E-02 2.20863298E-01 2.80595183E-01 2.58712143E-01 + 2.43132055E-01 2.40858525E-01 1.85673967E-01 1.38261855E-01 + 1.31511599E-01 1.21707901E-01 1.04707271E-01 8.92545804E-02 + 1.07907735E-01 5.48795797E-02 9.56872329E-02 2.03870207E-01 + 2.42462337E-01 2.72948295E-01 2.41347298E-01 2.56201714E-01 + 1.87950954E-01 1.57547474E-01 1.11746632E-01 8.97441134E-02 + 1.17528014E-01 1.17104203E-01 1.26735479E-01 1.29954055E-01 + 1.31542936E-01 1.63724631E-01 1.70761600E-01 1.48310676E-01 + 1.29013836E-01 2.11293727E-01 1.47208035E-01 1.54250205E-01 + 1.89050227E-01 1.17474392E-01 1.52717724E-01 1.47169858E-01 + 1.06226966E-01 1.04987547E-01 1.12179555E-01 1.37998879E-01 + 1.65021285E-01 4.55291569E-02 1.21303760E-01 2.03305885E-01 + 1.92175835E-01 1.73972815E-01 2.16986462E-01 2.15795949E-01 + 1.32999346E-01 1.03869617E-01 1.72380075E-01 2.01955527E-01 + 1.51973635E-01 1.88630834E-01 1.30558908E-01 1.16419204E-01 + 1.45796210E-01 8.04464817E-02 1.73935130E-01 2.05951601E-01 + 2.15324581E-01 2.19724238E-01 1.93332165E-01 1.69567242E-01 + 1.82130992E-01 1.93476886E-01 1.69973329E-01 1.75248057E-01 + 1.12412520E-01 1.02041468E-01 1.11162744E-01 4.26988676E-02 + 9.76154953E-02 2.25168869E-01 2.36404583E-01 2.49132380E-01 + 2.23558798E-01 1.97985336E-01 2.13521719E-01 1.84589863E-01 + 1.11775532E-01 1.55617550E-01 7.69227967E-02 1.09018311E-01 + 1.40362367E-01 5.75932376E-02 1.15133859E-01 2.40265504E-01 + 2.80477464E-01 3.13720703E-01 2.75651723E-01 2.45245054E-01 + 2.83300132E-01 3.23539555E-01 1.63597077E-01 2.23688290E-01 + 3.00192535E-02 8.23272988E-02 1.32571429E-01 1.45901829E-01 + 1.94272786E-01 2.58673042E-01 3.02897364E-01 3.32017362E-01 + 2.94541121E-01 2.56478399E-01 2.59731650E-01 2.83863008E-01 + 2.19844580E-01 1.94810495E-01 2.12238923E-01 2.64106005E-01 + 2.55483627E-01 1.93815425E-01 2.10439801E-01 2.67780751E-01 + 2.64789969E-01 2.60587752E-01 2.73503721E-01 2.36863226E-01 + 2.76995718E-01 2.70527214E-01 2.05473632E-01 1.69128880E-01 + 1.39128909E-01 2.18187928E-01 2.33170792E-01 1.99627012E-01 + 1.69302762E-01 1.79045692E-01 1.47410274E-01 1.94037139E-01 + 2.18769133E-01 1.66889399E-01 1.45800248E-01 1.43018708E-01 + 1.73504487E-01 2.17774928E-01 2.18415499E-01 2.92376041E-01 + 1.96735784E-01 1.56037509E-01 1.29073143E-01 2.19398603E-01 + 1.83770463E-01 1.58798620E-01 8.04123059E-02 1.10380836E-01 + 2.10137963E-01 2.67409623E-01 2.75914907E-01 2.68791437E-01 + 2.53099054E-01 2.78905690E-01 2.09625542E-01 1.88604295E-01 + 1.55325890E-01 2.52072543E-01 1.75982088E-01 1.12175152E-01 + 1.12265371E-01 2.12880179E-01 2.47847423E-01 2.50326157E-01 + 2.64429003E-01 2.45244727E-01 2.48455748E-01 2.22676903E-01 + 1.96090773E-01 1.18725173E-01 1.34283528E-01 2.73558557E-01 + 1.17678449E-01 8.46072584E-02 1.04987644E-01 2.27410898E-01 + 2.35718399E-01 2.59556800E-01 2.87034124E-01 2.71710068E-01 + 2.31894031E-01 2.33556539E-01 1.87930599E-01 7.03973621E-02 + 1.18986674E-01 9.33711082E-02 6.87689036E-02 1.13155790E-01 + 1.31978855E-01 2.49134898E-01 2.78505474E-01 1.94766700E-01 + 1.34298116E-01 2.65438497E-01 2.55197525E-01 2.64434189E-01 + 2.36112610E-01 2.41366416E-01 2.04687193E-01 9.66594070E-02 + 5.11962287E-02 9.15687159E-02 1.60113573E-01 1.07918449E-01 + 9.98168662E-02 1.68734327E-01 2.14835107E-01 2.02536285E-01 + 1.47548154E-01 2.02924177E-01 2.15151027E-01 2.46808529E-01 + 1.21753201E-01 8.02310780E-02 4.60761264E-02 1.05134740E-01 + 1.61376715E-01 1.29647523E-01 2.05546781E-01 2.45740965E-01 + 1.93365648E-01 1.80872083E-01 1.66280091E-01 1.81749836E-01 + 1.58256009E-01 1.31861299E-01 4.02984656E-02 7.06841648E-02 + 1.12640277E-01 1.40551642E-01 2.47247085E-01 2.42038250E-01 + 3.14318061E-01 2.36905426E-01 2.33533427E-01 2.29756817E-01 + 1.80547029E-01 7.60434344E-02 5.74021451E-02 4.51112613E-02 + 3.35474089E-02 7.19145387E-02 1.18651539E-01 1.75043941E-01 + 2.66977787E-01 2.75645673E-01 2.89784789E-01 2.61604667E-01 + 2.26747423E-01 2.22534299E-01 4.88052927E-02 6.23642318E-02 + 7.87006095E-02 3.27319913E-02 5.32675497E-02 7.26841912E-02 + 1.20640613E-01 2.31183052E-01 2.09597424E-01 1.81020692E-01 + 2.49344721E-01 3.17255527E-01 2.56946743E-01 2.23717526E-01 + 4.15956713E-02 7.39227235E-02 1.06176555E-01 3.64569984E-02 + 9.12279189E-02 1.21231236E-01 2.12154999E-01 1.95041612E-01 + 1.10013105E-01 6.42688423E-02 2.64696211E-01 2.29891062E-01 + 2.61633635E-01 2.25240335E-01 6.44725040E-02 6.32941499E-02 + 1.17913231E-01 7.04566613E-02 1.80755183E-01 1.80826634E-01 + 2.41557419E-01 1.51842535E-01 8.90490115E-02 7.32557476E-02 + 2.24929571E-01 3.47331092E-02 1.80570617E-01 1.93904340E-01 + 1.80993050E-01 1.73115000E-01 1.52687117E-01 9.48983952E-02 + 1.14620253E-01 1.64216816E-01 1.99786559E-01 1.44096807E-01 + 9.93146375E-02 6.66537955E-02 1.68144643E-01 2.21722275E-02 + 8.48343968E-02 2.09446371E-01 2.01755434E-01 2.04528883E-01 + 2.04925805E-01 9.00014862E-02 8.95237625E-02 1.55805185E-01 + 1.96646169E-01 1.30268365E-01 1.33380324E-01 8.57800394E-02 + 8.80402476E-02 1.44004868E-02 6.09156899E-02 2.48289675E-01 + 2.69279838E-01 2.48722330E-01 2.59139001E-01 1.89581737E-01 + 6.86708912E-02 1.32587716E-01 1.43844470E-01 1.38163194E-01 + 1.15940191E-01 8.97731856E-02 1.14403017E-01 3.69402282E-02 + 9.00979564E-02 2.18498006E-01 2.69209236E-01 2.73124009E-01 + 2.75379777E-01 2.35410705E-01 1.48131087E-01 1.13332152E-01 + 9.43356082E-02 1.09189175E-01 1.23785727E-01 1.47838995E-01 + 1.22254081E-01 8.43347833E-02 6.23207986E-02 1.92238033E-01 + 2.15162739E-01 2.52772927E-01 2.61828035E-01 2.61459857E-01 + 2.42419899E-01 1.98618099E-01 7.91322067E-02 8.38763267E-02 + 1.15545623E-01 1.00825198E-01 7.35328421E-02 6.79370090E-02 + 7.93469697E-02 1.93242684E-01 1.67974159E-01 2.13217899E-01 + 2.63990462E-01 3.51595014E-01 2.24837855E-01 1.73273996E-01 + 1.34634942E-01 1.42378956E-01 1.86574250E-01 1.34270862E-01 + 8.48218426E-02 7.75660053E-02 9.13800821E-02 1.66669324E-01 + 2.11240709E-01 2.50922024E-01 2.39824459E-01 2.53564030E-01 + 1.98345914E-01 1.58554167E-01 1.87344790E-01 1.97883680E-01 + 1.64449796E-01 1.42011389E-01 1.12800784E-01 1.26496181E-01 + 1.00590326E-01 1.61777213E-01 1.25595316E-01 1.59146860E-01 + 1.59180403E-01 9.45423096E-02 3.42419222E-02 8.58239457E-02 + 1.25249416E-01 1.71925306E-01 1.17351890E-01 1.48362234E-01 + 1.82072416E-01 1.55774772E-01 1.58953592E-01 2.08963469E-01 + 1.17918722E-01 1.38599500E-01 1.36303216E-01 1.05311446E-01 + 8.05943012E-02 1.32607207E-01 1.93845004E-01 2.45075911E-01 + 2.23663509E-01 1.88839287E-01 1.97801381E-01 2.56586283E-01 + 2.18097508E-01 1.86786503E-01 3.53153571E-02 8.04102868E-02 + 8.36288482E-02 1.21203020E-01 1.38589084E-01 2.92986691E-01 + 2.96720743E-01 2.68582016E-01 2.50819921E-01 2.29706272E-01 + 2.39394128E-01 2.33965650E-01 1.78289443E-01 2.06500009E-01 + 1.59571264E-02 6.74557686E-02 1.15683123E-01 2.40222469E-01 + 2.46305242E-01 2.45346606E-01 2.70381838E-01 2.26072162E-01 + 2.25665018E-01 1.93095401E-01 2.17071727E-01 2.30822742E-01 + 2.26104841E-01 2.39621073E-01 2.46155828E-01 2.46292204E-01 + 2.67226815E-01 2.54664063E-01 2.28139013E-01 2.76829898E-01 + 2.76149124E-01 2.38110721E-01 2.53067523E-01 1.85824379E-01 + 1.98369563E-01 2.53084153E-01 2.47721016E-01 2.35030308E-01 + 1.63745806E-01 2.54168481E-01 2.22619861E-01 2.00518429E-01 + 1.89951062E-01 1.70682162E-01 1.70876965E-01 1.71632856E-01 + 1.71132982E-01 1.27196893E-01 1.87505886E-01 2.08758056E-01 + 2.14149654E-01 2.50689894E-01 2.02945933E-01 2.87158668E-01 + 2.16880262E-01 1.51726082E-01 1.65192500E-01 2.19861016E-01 + 1.65738314E-01 1.41502127E-01 1.08340956E-01 1.51164651E-01 + 2.32225761E-01 2.51261055E-01 2.20386490E-01 2.76751041E-01 + 2.11944118E-01 1.75248742E-01 2.02761769E-01 1.38610676E-01 + 1.48275197E-01 2.47762233E-01 1.38862401E-01 1.29245788E-01 + 1.18918329E-01 1.61358222E-01 2.24242479E-01 2.36672685E-01 + 2.52393723E-01 2.29912430E-01 1.96754709E-01 1.85095593E-01 + 1.49870127E-01 6.87093288E-02 1.15125448E-01 1.41863078E-01 + 1.19170196E-01 1.11679778E-01 1.12255670E-01 1.91871569E-01 + 2.16604427E-01 1.97085723E-01 1.85479283E-01 1.99216828E-01 + 2.10318059E-01 2.31504947E-01 2.21608415E-01 2.32060060E-01 + 2.30206817E-01 9.40246135E-02 3.66537012E-02 1.00214615E-01 + 1.35439530E-01 1.01554401E-01 5.68220392E-02 5.55765182E-02 + 1.37934849E-01 1.78439736E-01 2.14466840E-01 2.17601404E-01 + 2.20358372E-01 2.67283708E-01 1.95794106E-01 7.63714761E-02 + 4.44657281E-02 1.06430210E-01 1.37337491E-01 1.13883965E-01 + 1.18590683E-01 1.72134727E-01 2.15832815E-01 2.10870296E-01 + 2.14512587E-01 1.99736640E-01 1.71112031E-01 2.26518184E-01 + 1.00604512E-01 8.43058079E-02 5.85318692E-02 9.94326025E-02 + 1.79161623E-01 1.59475848E-01 2.18343154E-01 2.38521516E-01 + 2.19037786E-01 2.40291253E-01 2.17452124E-01 1.99562222E-01 + 1.23022445E-01 2.99059823E-02 7.13488981E-02 8.26725140E-02 + 9.32337493E-02 1.43002763E-01 2.94105977E-01 2.70394295E-01 + 2.49419764E-01 2.43709072E-01 2.15700686E-01 2.30322435E-01 + 1.15932114E-01 8.69690776E-02 8.98104459E-02 1.69489570E-02 + 2.86555178E-02 5.25443293E-02 9.71912518E-02 1.83550119E-01 + 2.69594431E-01 2.58614719E-01 2.82377511E-01 2.62775511E-01 + 2.42250144E-01 2.12607890E-01 7.28184357E-02 7.68959001E-02 + 1.20624252E-01 4.06238064E-02 4.09390926E-02 7.23347664E-02 + 1.44264549E-01 1.69092521E-01 1.60338208E-01 9.24688876E-02 + 2.04204515E-01 2.83746988E-01 2.29406863E-01 2.13980049E-01 + 1.04443714E-01 6.80765584E-02 1.14574961E-01 6.87430948E-02 + 1.56753004E-01 1.89897090E-01 2.64849722E-01 2.17654049E-01 + 1.31795138E-01 1.02330633E-01 2.36153677E-01 1.56970263E-01 + 2.02886805E-01 2.16278836E-01 1.01480030E-01 9.38543901E-02 + 1.21532194E-01 5.01345135E-02 1.93657279E-01 1.65820643E-01 + 2.20928743E-01 1.52123556E-01 1.27540842E-01 1.28267437E-01 + 2.18872339E-01 4.40405495E-02 1.15333639E-01 1.89845800E-01 + 1.58796072E-01 1.20644420E-01 1.47902980E-01 5.90812638E-02 + 7.57243633E-02 1.24563128E-01 1.81313321E-01 1.37153581E-01 + 1.24559186E-01 1.11809947E-01 1.54143482E-01 9.00315307E-03 + 4.71780337E-02 2.22283125E-01 2.65109658E-01 2.48989388E-01 + 2.45000288E-01 1.00756034E-01 8.41429532E-02 1.22655921E-01 + 1.38423830E-01 1.42508581E-01 1.13756552E-01 9.85545143E-02 + 1.13248438E-01 1.52622554E-02 6.34529367E-02 2.20042735E-01 + 2.66303927E-01 2.91415453E-01 2.84276724E-01 1.62362769E-01 + 1.18506916E-01 1.04484953E-01 9.95754153E-02 1.20302387E-01 + 9.79793221E-02 1.09752811E-01 1.21494807E-01 7.45429397E-02 + 8.44121352E-02 2.34448537E-01 2.97212064E-01 2.83897609E-01 + 3.08805168E-01 2.92341799E-01 2.37762302E-01 1.04344890E-01 + 6.38675243E-02 7.43941441E-02 8.80739614E-02 1.00561589E-01 + 9.78171080E-02 7.97120780E-02 4.44174372E-02 2.27902636E-01 + 2.06733808E-01 2.70411074E-01 2.75722086E-01 2.81798750E-01 + 2.66541749E-01 1.84680536E-01 7.38258809E-02 6.87644705E-02 + 7.73503557E-02 1.78548351E-01 1.09022178E-01 5.07024750E-02 + 2.84533817E-02 1.94613010E-01 1.08253457E-01 1.23996720E-01 + 1.73849374E-01 2.88735837E-01 2.63840228E-01 2.16475546E-01 + 1.92094237E-01 9.08304229E-02 1.38104752E-01 2.24506661E-01 + 1.87543422E-01 5.57367392E-02 5.60868233E-02 2.19358861E-01 + 9.82817188E-02 1.23221315E-01 1.91334695E-01 2.03882694E-01 + 2.51446843E-01 2.09821790E-01 2.23500803E-01 2.25641847E-01 + 2.56817460E-01 2.50319839E-01 2.20104501E-01 1.07521154E-01 + 1.11215584E-01 1.86493814E-01 1.61004454E-01 1.42349437E-01 + 1.69798300E-01 1.59575433E-01 2.24030539E-01 2.11325556E-01 + 2.03866914E-01 2.01157495E-01 1.79307133E-01 1.97357431E-01 + 1.67670503E-01 1.61946669E-01 1.25492886E-01 1.64872825E-01 + 2.18584254E-01 2.03176349E-01 2.56538212E-01 2.51373619E-01 + 2.22328633E-01 1.94033056E-01 2.23521218E-01 2.09877148E-01 + 1.75419152E-01 1.81244716E-01 2.24343792E-01 2.01869041E-01 + 1.52032539E-01 1.94116786E-01 1.38009802E-01 1.03335269E-01 + 1.22453056E-01 2.19353005E-01 1.66429430E-01 1.72143221E-01 + 1.95574194E-01 2.26385742E-01 1.70026466E-01 1.47737414E-01 + 1.81938991E-01 2.10201114E-01 2.10211948E-01 2.64496833E-01 + 1.26981273E-01 1.16307713E-01 2.15511516E-01 2.21310526E-01 + 1.83224633E-01 2.12570712E-01 2.45925620E-01 2.45891705E-01 + 1.82572424E-01 1.65891379E-01 1.69635430E-01 2.47676969E-01 + 2.59180009E-01 2.79066831E-01 2.45076895E-01 2.83806592E-01 + 3.02948117E-01 2.33669817E-01 2.48093501E-01 2.82774568E-01 + 2.20992878E-01 2.21423596E-01 2.12956011E-01 1.96462929E-01 + 2.57390201E-01 2.92326659E-01 2.89489478E-01 2.94964343E-01 + 2.54943967E-01 3.14226061E-01 2.78631926E-01 1.68247074E-01 + 1.92948326E-01 2.05407083E-01 2.00050697E-01 1.43916070E-01 + 1.20717354E-01 1.31127551E-01 2.45058253E-01 2.86172181E-01 + 2.64329940E-01 2.80829787E-01 2.44612008E-01 2.26566717E-01 + 2.17084453E-01 1.12668619E-01 1.36469021E-01 2.16881827E-01 + 1.52260140E-01 1.23685680E-01 1.38133645E-01 1.80260882E-01 + 2.51076669E-01 2.55243331E-01 2.09061742E-01 2.22000390E-01 + 2.64202505E-01 2.07730219E-01 1.73030987E-01 7.08893165E-02 + 1.17959008E-01 1.44228026E-01 9.64804739E-02 8.14293325E-02 + 1.12916186E-01 2.21328869E-01 2.35309482E-01 2.27456555E-01 + 2.05758050E-01 1.93624958E-01 2.28522807E-01 2.33790353E-01 + 2.11088583E-01 2.60172904E-01 1.95860609E-01 8.29101503E-02 + 1.82257891E-02 3.27576362E-02 1.08505391E-01 9.22462270E-02 + 5.37001230E-02 2.35781670E-02 9.21188965E-02 1.69216886E-01 + 2.20409423E-01 2.20260397E-01 2.02170625E-01 2.46559843E-01 + 2.20390141E-01 7.28784725E-02 3.43815386E-02 4.99081165E-02 + 8.76621753E-02 7.59703666E-02 4.40287404E-02 8.58699307E-02 + 1.82753354E-01 1.70497045E-01 2.36595392E-01 2.31052950E-01 + 1.96782887E-01 2.10408181E-01 1.28826097E-01 6.39833882E-02 + 3.47544514E-02 8.83888900E-02 1.15256809E-01 7.98986107E-02 + 1.77071556E-01 2.51291156E-01 1.98271424E-01 2.60497063E-01 + 2.68429428E-01 2.13772088E-01 1.89661697E-01 1.29965454E-01 + 7.34932199E-02 5.66804819E-02 5.43820933E-02 1.10723548E-01 + 2.55978167E-01 2.23780781E-01 2.72107303E-01 2.53797144E-01 + 2.31127769E-01 2.89834648E-01 2.01479927E-01 1.45300910E-01 + 9.68078002E-02 5.74278571E-02 3.61011475E-02 5.83763011E-02 + 8.08694661E-02 1.69669852E-01 2.88123995E-01 3.23327929E-01 + 2.96017379E-01 2.80509233E-01 2.24451512E-01 2.36891344E-01 + 6.43079877E-02 9.21581984E-02 1.10952072E-01 5.78468256E-02 + 2.92595904E-02 4.25536633E-02 8.09389725E-02 2.01920912E-01 + 2.38734543E-01 1.87933624E-01 2.81079143E-01 2.90624946E-01 + 2.34922126E-01 2.19359979E-01 1.05948515E-01 1.14095122E-01 + 1.02389447E-01 3.77961062E-02 7.52629787E-02 1.36336803E-01 + 2.11086690E-01 2.40031973E-01 1.17220812E-01 1.15642704E-01 + 2.51837283E-01 2.50156760E-01 2.80746043E-01 2.74093360E-01 + 1.17421649E-01 1.07975081E-01 1.08877547E-01 1.20576462E-02 + 1.87104657E-01 1.79564282E-01 2.30059534E-01 1.94534153E-01 + 1.10815965E-01 1.38116688E-01 2.14031115E-01 5.05559035E-02 + 1.99848443E-01 2.33483478E-01 9.33441073E-02 9.55251157E-02 + 9.04593989E-02 4.08019796E-02 1.12826131E-01 1.09332576E-01 + 1.73306331E-01 1.26937538E-01 8.81784633E-02 8.67298692E-02 + 1.74865618E-01 2.33843420E-02 6.76336065E-02 2.16538861E-01 + 2.24149033E-01 2.47410551E-01 1.30554348E-01 6.00936115E-02 + 6.85240403E-02 9.26524103E-02 1.66719034E-01 1.35154724E-01 + 1.02357127E-01 9.31769609E-02 1.35977477E-01 4.56140079E-02 + 6.42250031E-02 2.08298504E-01 2.96141773E-01 2.87347823E-01 + 2.20455065E-01 1.29162475E-01 1.37614921E-01 1.34647653E-01 + 1.43210724E-01 1.21966749E-01 1.14979349E-01 1.15686759E-01 + 1.11738659E-01 9.67555642E-02 1.08661488E-01 2.15475261E-01 + 2.90731519E-01 2.64437795E-01 2.41467521E-01 1.78105071E-01 + 1.37660637E-01 1.03109300E-01 7.13847652E-02 1.00187965E-01 + 1.32899240E-01 1.16320066E-01 9.71773490E-02 7.15773404E-02 + 8.98106024E-02 1.84275880E-01 2.26192608E-01 2.37343848E-01 + 1.92392960E-01 1.92204297E-01 2.20637038E-01 1.57527030E-01 + 6.29790053E-02 1.14439905E-01 1.15998104E-01 1.19796515E-01 + 1.11049935E-01 4.47340496E-02 4.97757047E-02 2.50898451E-01 + 8.42293724E-02 1.17156006E-01 1.18388839E-01 2.31752694E-01 + 2.25880474E-01 2.03996629E-01 1.13727398E-01 1.08396940E-01 + 1.07572146E-01 2.21533507E-01 1.45048082E-01 3.71412337E-02 + 5.84836639E-02 2.02357411E-01 8.71535093E-02 7.82863498E-02 + 1.29523695E-01 1.81777284E-01 2.37993404E-01 1.94439709E-01 + 2.14093328E-01 1.83392629E-01 2.46821180E-01 2.56850332E-01 + 2.61785954E-01 7.80101418E-02 6.86122552E-02 1.91527620E-01 + 1.42059490E-01 7.92679414E-02 9.01140645E-02 1.28852338E-01 + 2.36506417E-01 2.69761056E-01 2.83389926E-01 2.56845534E-01 + 2.60415524E-01 2.40332007E-01 2.51467049E-01 1.42294109E-01 + 9.58268121E-02 1.94761142E-01 1.32459044E-01 8.54657292E-02 + 9.29341093E-02 1.94081813E-01 2.37310544E-01 2.38859802E-01 + 2.35965118E-01 2.39338785E-01 2.63780862E-01 3.01657021E-01 + 2.54580200E-01 1.59753934E-01 1.22185014E-01 2.13043153E-01 + 1.37310088E-01 1.67589679E-01 1.67073324E-01 2.16497019E-01 + 2.57867247E-01 2.91360110E-01 2.68442184E-01 2.57260650E-01 + 2.73215741E-01 2.02836990E-01 2.25463152E-01 1.84877485E-01 + 1.45383850E-01 2.15008721E-01 2.19987527E-01 2.84007907E-01 + 3.24666262E-01 2.47607440E-01 2.63223797E-01 2.79152721E-01 + 2.61032641E-01 2.58264035E-01 2.43526265E-01 2.00495735E-01 + 2.33581871E-01 1.80715263E-01 1.83216110E-01 1.66010156E-01 + 1.61014155E-01 1.73073813E-01 2.94513136E-01 2.74894744E-01 + 1.44206539E-01 2.24856898E-01 2.61544615E-01 2.83094823E-01 + 2.28021950E-01 2.08009675E-01 1.62646145E-01 1.21027738E-01 + 1.44104078E-01 2.16693252E-01 1.92915335E-01 2.19901696E-01 + 2.68323362E-01 1.96867988E-01 1.64231360E-01 2.43974790E-01 + 2.74081707E-01 1.88767731E-01 2.15955347E-01 1.63245931E-01 + 2.32229725E-01 2.56094605E-01 2.33303770E-01 2.14566752E-01 + 2.82842815E-01 2.84033805E-01 2.44376063E-01 1.02433495E-01 + 1.21022731E-01 2.71030366E-01 1.75417066E-01 1.33816376E-01 + 1.42562851E-01 1.76307350E-01 2.40986481E-01 2.43536815E-01 + 2.56611735E-01 2.57043332E-01 2.93910980E-01 2.42240235E-01 + 1.98728129E-01 7.57120028E-02 8.36329013E-02 1.79535791E-01 + 1.76594242E-01 1.26299664E-01 1.31568551E-01 2.09260210E-01 + 2.56809950E-01 2.35634550E-01 2.40904167E-01 3.18142861E-01 + 2.16331050E-01 2.17473134E-01 1.78060904E-01 1.95755050E-01 + 1.20628215E-01 5.75691983E-02 1.97824035E-02 7.09960163E-02 + 1.54109806E-01 1.03402510E-01 4.75594364E-02 5.39240837E-02 + 8.17626268E-02 9.82395038E-02 2.20089152E-01 2.22041979E-01 + 2.04285204E-01 1.94056511E-01 1.49375677E-01 3.94675620E-02 + 5.57772443E-02 7.38753155E-02 9.48807225E-02 5.70441894E-02 + 4.54709120E-02 2.75565423E-02 1.31769761E-01 1.36767447E-01 + 2.60898411E-01 2.39359185E-01 2.30206415E-01 2.19325319E-01 + 1.38787970E-01 6.73163682E-02 4.56511900E-02 9.18927789E-02 + 6.01500161E-02 6.63560405E-02 1.10453568E-01 2.08075404E-01 + 2.40363643E-01 2.37370268E-01 2.95664221E-01 2.74415761E-01 + 2.29798317E-01 2.08199203E-01 7.13117197E-02 8.79893601E-02 + 6.02671131E-02 7.28183910E-02 1.87917098E-01 1.54164195E-01 + 2.45753080E-01 2.79107660E-01 2.51222134E-01 2.69424736E-01 + 2.68157452E-01 2.25424260E-01 1.44220203E-01 7.95266852E-02 + 4.64180298E-02 9.67214033E-02 9.57581624E-02 1.16561510E-01 + 3.04483950E-01 3.04144621E-01 2.93502271E-01 2.38786697E-01 + 2.00789526E-01 1.99681625E-01 1.05378777E-01 1.21663570E-01 + 1.18532971E-01 8.06309953E-02 4.08915281E-02 6.21819347E-02 + 7.63968453E-02 2.13370040E-01 2.83461630E-01 2.07530707E-01 + 2.47922882E-01 2.38523796E-01 2.23054618E-01 2.16880798E-01 + 1.11751758E-01 1.11624055E-01 9.97085497E-02 7.00022578E-02 + 6.52630031E-02 6.92953542E-02 1.50688961E-01 2.96274900E-01 + 1.95931077E-01 1.54999375E-01 2.25126132E-01 2.24901453E-01 + 2.05712855E-01 2.02897400E-01 1.06638134E-01 9.43470448E-02 + 8.31146613E-02 1.41987083E-02 1.36062235E-01 1.54856578E-01 + 2.64613479E-01 2.90056258E-01 1.00765549E-01 1.35674730E-01 + 2.05902830E-01 1.65999636E-01 2.48171657E-01 2.34625489E-01 + 1.14380941E-01 1.03210822E-01 8.82775038E-02 5.32306097E-02 + 1.70373216E-01 1.37572363E-01 2.08023384E-01 1.05852559E-01 + 8.10119510E-02 9.57790166E-02 2.18452632E-01 5.84801696E-02 + 1.97532177E-01 2.50961840E-01 1.69344962E-01 1.47822320E-01 + 5.85375503E-02 2.04460863E-02 7.32220784E-02 1.23760693E-01 + 2.04653665E-01 1.25236914E-01 1.04000419E-01 7.74058625E-02 + 1.67027384E-01 6.31483719E-02 8.75246748E-02 2.25811005E-01 + 2.65669882E-01 2.76927561E-01 1.29259691E-01 8.10806602E-02 + 9.90888104E-02 1.27737254E-01 1.70630887E-01 1.09058499E-01 + 1.31801665E-01 1.02691412E-01 1.71202943E-01 1.16782255E-01 + 1.19797282E-01 2.36926883E-01 2.45169640E-01 2.20527261E-01 + 1.69739172E-01 1.34184107E-01 1.18982770E-01 9.90429521E-02 + 1.09045878E-01 1.19460419E-01 1.25779957E-01 1.20910734E-01 + 1.02503955E-01 1.05145551E-01 1.29055262E-01 1.92191422E-01 + 2.33530670E-01 2.37537757E-01 1.50956050E-01 1.28583565E-01 + 1.21859148E-01 1.05783693E-01 9.83754992E-02 1.57810345E-01 + 1.18099056E-01 1.36020049E-01 1.09379008E-01 6.68695047E-02 + 7.45541826E-02 1.62233576E-01 1.60999015E-01 1.59230232E-01 + 1.07828297E-01 1.39321074E-01 1.78579018E-01 2.01921001E-01 + 7.83331916E-02 1.42575502E-01 7.89171010E-02 1.89868361E-01 + 1.29098147E-01 5.53047955E-02 7.59168193E-02 1.64064214E-01 + 8.86954665E-02 8.52990001E-02 1.12557419E-01 1.50751770E-01 + 2.10333377E-01 2.20614702E-01 1.93164855E-01 1.44333005E-01 + 1.43376008E-01 2.44116575E-01 1.92473173E-01 4.62572873E-02 + 6.05456755E-02 1.86380237E-01 1.20525330E-01 6.08331375E-02 + 6.65044785E-02 1.34726033E-01 2.04153374E-01 2.67041445E-01 + 2.60576814E-01 2.52402276E-01 2.64738530E-01 2.47151494E-01 + 2.58783847E-01 1.31537691E-01 6.65225908E-02 1.82154775E-01 + 1.32498503E-01 8.33939314E-02 2.83616912E-02 1.25072345E-01 + 1.95527762E-01 2.76023000E-01 2.85944402E-01 2.86343396E-01 + 2.30508938E-01 2.62504339E-01 3.00846279E-01 2.16609165E-01 + 7.34772682E-02 1.08364463E-01 1.09170429E-01 5.19188344E-02 + 2.78712865E-02 1.25133589E-01 2.35631198E-01 2.83829659E-01 + 2.69107521E-01 2.63586342E-01 2.51368523E-01 2.06241652E-01 + 2.37728789E-01 2.92915016E-01 7.36651048E-02 1.11121923E-01 + 1.17644921E-01 3.42427939E-02 7.08637983E-02 1.80847734E-01 + 2.72596508E-01 2.66435534E-01 2.45738894E-01 2.22659826E-01 + 2.41024435E-01 2.33633026E-01 2.38686636E-01 2.12302744E-01 + 1.00105353E-01 2.04891279E-01 1.71472460E-01 1.87314108E-01 + 2.06586018E-01 2.28332281E-01 2.29102924E-01 2.61657029E-01 + 2.30703533E-01 2.03444272E-01 2.05954716E-01 2.25314960E-01 + 2.28017271E-01 2.25818634E-01 2.11219460E-01 2.16688424E-01 + 1.28596842E-01 1.23466566E-01 1.37529984E-01 1.66386589E-01 + 1.75572574E-01 2.28374064E-01 1.86056957E-01 1.75013423E-01 + 2.26751104E-01 2.32583180E-01 2.20654443E-01 2.01327547E-01 + 1.03535734E-01 1.18098155E-01 2.77223676E-01 2.74876595E-01 + 2.26412803E-01 1.05226241E-01 1.23892881E-01 2.07088783E-01 + 2.07404479E-01 1.66765541E-01 1.78121716E-01 1.63875192E-01 + 2.37851650E-01 2.69490063E-01 2.17160851E-01 2.49381080E-01 + 2.49836639E-01 2.19311491E-01 1.71143189E-01 9.09367576E-02 + 1.12937704E-01 1.96439981E-01 1.83505133E-01 1.53195396E-01 + 1.47535905E-01 1.77419856E-01 2.03791514E-01 2.59583324E-01 + 2.49192223E-01 3.05641145E-01 1.92573816E-01 1.87189937E-01 + 1.85141832E-01 1.54028684E-01 1.28200427E-01 1.38353199E-01 + 9.96365249E-02 9.32066217E-02 1.19290486E-01 1.25972196E-01 + 9.40362588E-02 7.02948421E-02 9.71920565E-02 8.71957541E-02 + 1.89044893E-01 1.82186782E-01 1.59371883E-01 1.00463621E-01 + 6.43201917E-02 6.75492808E-02 1.52105510E-01 1.51706591E-01 + 8.28621238E-02 5.97356595E-02 7.76493400E-02 4.40560058E-02 + 7.51013234E-02 8.10357258E-02 1.61425605E-01 2.08202302E-01 + 2.06289038E-01 1.84344128E-01 1.21760175E-01 1.30966276E-01 + 1.20225869E-01 1.17410980E-01 2.34824941E-01 1.33078814E-01 + 1.56937137E-01 1.65433452E-01 1.79324895E-01 1.59807071E-01 + 1.99179366E-01 2.39828363E-01 1.93724126E-01 1.63620070E-01 + 5.91756739E-02 1.15265034E-01 1.49876669E-01 1.52648747E-01 + 2.43365303E-01 1.44603938E-01 2.21429586E-01 2.46880084E-01 + 2.32962683E-01 2.53971785E-01 2.29283735E-01 2.22184703E-01 + 1.98137254E-01 1.26007780E-01 4.31347638E-02 8.80153850E-02 + 9.80511457E-02 1.89583614E-01 2.29595482E-01 2.30811402E-01 + 2.54259169E-01 2.42413893E-01 1.93718836E-01 1.98608875E-01 + 1.77519798E-01 9.90236849E-02 1.44540280E-01 9.48120877E-02 + 5.51192686E-02 8.31430182E-02 7.29317218E-02 2.10151985E-01 + 2.12607831E-01 1.65508389E-01 1.79544345E-01 1.72463983E-01 + 1.41943932E-01 1.61908463E-01 1.34780675E-01 8.86906609E-02 + 1.08577125E-01 9.20439586E-02 6.77705333E-02 9.73166153E-02 + 7.85444900E-02 2.91608542E-01 2.89725095E-01 1.89095065E-01 + 2.11449429E-01 1.95582032E-01 1.64045855E-01 1.82854712E-01 + 1.17773488E-01 9.65225548E-02 6.66889697E-02 4.99619246E-02 + 4.34043072E-02 1.20402329E-01 2.19656646E-01 2.71810949E-01 + 2.03447193E-01 1.17525592E-01 2.21074119E-01 2.49287203E-01 + 2.67047971E-01 2.83404440E-01 1.16834939E-01 9.90008116E-02 + 7.58811533E-02 3.62500958E-02 1.51764676E-01 1.71087906E-01 + 2.42903739E-01 2.13176161E-01 8.88733268E-02 9.82981101E-02 + 2.54324108E-01 8.96352604E-02 2.33166158E-01 2.57102758E-01 + 1.28765076E-01 1.01127490E-01 5.52581735E-02 5.25099821E-02 + 1.37724981E-01 1.53132126E-01 1.69852346E-01 1.09932229E-01 + 9.53333527E-02 7.42491484E-02 2.29904488E-01 8.46269652E-02 + 1.28710628E-01 2.24556446E-01 1.92549348E-01 2.32459128E-01 + 1.36893883E-01 1.16403036E-01 1.08730793E-01 1.21956930E-01 + 1.77621126E-01 1.24952182E-01 1.13399789E-01 7.78351352E-02 + 1.93786398E-01 1.35303140E-01 1.31484807E-01 1.80477023E-01 + 2.59863466E-01 2.59321481E-01 1.83395430E-01 1.52212769E-01 + 1.21761873E-01 9.36501250E-02 1.13257013E-01 1.43471539E-01 + 1.28850386E-01 1.01540066E-01 1.38679832E-01 1.17547624E-01 + 1.14305913E-01 1.90014929E-01 1.91920832E-01 2.80376554E-01 + 1.83605000E-01 1.38577223E-01 1.15510225E-01 5.99053837E-02 + 7.56111145E-02 1.25847906E-01 1.09556764E-01 1.27680942E-01 + 1.38281673E-01 6.98676333E-02 6.56116977E-02 1.89325526E-01 + 1.98110536E-01 1.84580624E-01 1.10806711E-01 1.02574028E-01 + 1.01924710E-01 1.32767737E-01 8.05054232E-02 1.13558210E-01 + 7.39829987E-02 1.91546306E-01 1.36353433E-01 5.06750233E-02 + 4.12321091E-02 2.08044618E-01 1.23183608E-01 9.52623785E-02 + 7.69028217E-02 1.17196880E-01 1.33473694E-01 2.20244616E-01 + 1.42351329E-01 1.02288336E-01 7.09854960E-02 2.00697094E-01 + 1.35710090E-01 3.00790649E-02 5.54257520E-02 1.87102661E-01 + 1.30951509E-01 7.27104843E-02 6.18919209E-02 1.65409893E-01 + 2.07622513E-01 3.02609056E-01 2.77031273E-01 1.68694153E-01 + 1.93169102E-01 2.37174615E-01 2.42061555E-01 6.86896518E-02 + 8.14562961E-02 2.14734465E-01 1.49710774E-01 6.12781867E-02 + 6.98312670E-02 1.79266930E-01 2.51938403E-01 2.64625043E-01 + 2.52192289E-01 2.24495471E-01 2.26720035E-01 2.32592925E-01 + 2.91406840E-01 1.80873632E-01 7.00467825E-02 1.35424003E-01 + 1.30522907E-01 4.42506634E-02 7.44001120E-02 1.39532447E-01 + 2.48993084E-01 2.61180818E-01 2.29545310E-01 2.42917567E-01 + 2.61227965E-01 2.43301779E-01 2.30454922E-01 1.78149283E-01 + 1.11783780E-01 7.72074759E-02 1.20605543E-01 2.85251830E-02 + 2.58408710E-02 8.89946222E-02 2.54635304E-01 2.40339726E-01 + 2.20337778E-01 2.51864076E-01 2.12837934E-01 2.20780849E-01 + 2.33945847E-01 2.24207312E-01 8.76482651E-02 7.91963041E-02 + 7.72762671E-02 3.16247232E-02 5.02347760E-02 1.57479122E-01 + 2.22438395E-01 2.29079798E-01 2.14033157E-01 2.33780697E-01 + 2.09147349E-01 2.55028278E-01 2.94056296E-01 2.85041422E-01 + 1.02580428E-01 1.39462069E-01 1.28355876E-01 1.73782900E-01 + 1.82488173E-01 2.64357924E-01 2.27048725E-01 2.07191095E-01 + 2.41122007E-01 2.55794495E-01 2.35314399E-01 2.18830377E-01 + 2.31235504E-01 1.98534817E-01 1.88396811E-01 2.25009531E-01 + 1.60506606E-01 1.59798339E-01 1.49925232E-01 1.30912840E-01 + 1.46392331E-01 2.13423982E-01 2.06188306E-01 1.79360613E-01 + 2.05802709E-01 1.99238151E-01 1.80420741E-01 1.37119770E-01 + 1.12099729E-01 2.32326135E-01 2.14093134E-01 2.14315191E-01 + 1.89384460E-01 1.76580429E-01 1.04680143E-01 2.53827393E-01 + 2.34483227E-01 1.94466040E-01 1.59172490E-01 1.69139177E-01 + 1.86180159E-01 2.64396161E-01 1.98876426E-01 2.36164436E-01 + 2.08555356E-01 2.10841894E-01 2.35642448E-01 1.13422789E-01 + 3.74653675E-02 9.68400091E-02 1.00686491E-01 1.27520129E-01 + 2.29216278E-01 1.64584294E-01 1.21236101E-01 6.53822720E-02 + 6.36389479E-02 8.65337029E-02 2.25200474E-01 2.19450325E-01 + 2.32767507E-01 2.31459841E-01 4.97838072E-02 8.48336145E-02 + 1.14927314E-01 1.22352883E-01 1.73557431E-01 1.63620457E-01 + 1.29160643E-01 4.88587134E-02 5.70229404E-02 1.07368678E-01 + 2.22008690E-01 2.44959116E-01 2.36953244E-01 2.16161758E-01 + 1.80642620E-01 1.35769412E-01 1.16140112E-01 1.48269281E-01 + 1.11492664E-01 7.94218257E-02 9.86459777E-02 6.25433251E-02 + 7.32234567E-02 1.24098450E-01 2.03280151E-01 2.37397045E-01 + 2.60545939E-01 2.09003314E-01 2.02839106E-01 1.86093345E-01 + 1.76054358E-01 1.62151501E-01 1.46516919E-01 1.03506424E-01 + 1.01625413E-01 7.78390765E-02 1.19154945E-01 1.59066439E-01 + 1.95917040E-01 2.46803954E-01 2.49910370E-01 2.42031887E-01 + 1.78789333E-01 1.84897646E-01 1.77850872E-01 1.45192400E-01 + 1.47165120E-01 1.23030439E-01 9.80146453E-02 1.33640110E-01 + 7.30071366E-02 1.23896994E-01 1.56854630E-01 2.01143444E-01 + 2.42655769E-01 2.13014185E-01 2.02187598E-01 2.27393284E-01 + 2.61534899E-01 2.49872714E-01 2.40576535E-01 2.53666133E-01 + 2.10870311E-01 1.76756784E-01 1.29320249E-01 1.18558735E-01 + 1.75881445E-01 1.70935214E-01 2.07463890E-01 1.67002797E-01 + 1.69083551E-01 1.73911318E-01 2.50633806E-01 2.79761463E-01 + 2.38058567E-01 2.20012650E-01 1.99408337E-01 2.17464626E-01 + 1.61114693E-01 1.55228361E-01 1.39875501E-01 1.26372904E-01 + 1.13661684E-01 1.50781736E-01 7.11731464E-02 2.13698283E-01 + 2.48375744E-01 2.45993301E-01 2.58135051E-01 1.54613122E-01 + 2.39722908E-01 2.36784056E-01 2.97727197E-01 2.16584042E-01 + 1.02011889E-01 8.10622275E-02 3.79715711E-02 7.26253316E-02 + 1.46360368E-01 2.29603440E-01 2.28915319E-01 2.44922131E-01 + 1.92909002E-01 1.49054036E-01 2.26588160E-01 1.92685515E-01 + 1.92841947E-01 2.05967009E-01 1.07656524E-01 8.57794210E-02 + 5.73848523E-02 7.07754716E-02 2.02800423E-01 1.57722160E-01 + 1.50884598E-01 1.35002047E-01 1.85804531E-01 1.49134070E-01 + 1.61888227E-01 1.30089924E-01 1.68121427E-01 1.54417202E-01 + 1.22224443E-01 1.28281683E-01 1.05113551E-01 1.19733840E-01 + 1.14722744E-01 1.08928896E-01 1.05137296E-01 1.39896214E-01 + 1.59860089E-01 2.01132625E-01 1.35191306E-01 1.46656901E-01 + 1.65310979E-01 1.97252706E-01 2.02596650E-01 2.17249826E-01 + 1.42388880E-01 1.49263173E-01 1.27938420E-01 7.63463154E-02 + 1.08367629E-01 1.56601667E-01 1.57662675E-01 1.75342366E-01 + 1.08305015E-01 1.22207291E-01 1.49886817E-01 2.40206599E-01 + 2.21228093E-01 1.91766173E-01 1.33303478E-01 1.60210714E-01 + 1.03433415E-01 6.09460175E-02 5.93393445E-02 9.39016268E-02 + 1.12161621E-01 1.67481512E-01 1.17763869E-01 1.12255573E-01 + 8.70487019E-02 2.35711768E-01 2.56152898E-01 1.82809547E-01 + 1.08422756E-01 1.24391437E-01 7.69280046E-02 9.67611074E-02 + 7.30163157E-02 9.43074077E-02 8.10500830E-02 1.68320686E-01 + 1.26588896E-01 6.43121526E-02 2.99652368E-02 2.28575498E-01 + 1.36764199E-01 1.14678711E-01 7.21420422E-02 1.15319900E-01 + 1.13209732E-01 1.47883475E-01 8.37962702E-02 8.01094994E-02 + 6.20477721E-02 1.92284793E-01 1.13907292E-01 3.43017541E-02 + 6.07642531E-02 2.16551051E-01 1.29691571E-01 9.57323611E-02 + 7.07518756E-02 1.44102558E-01 1.78849116E-01 2.33133316E-01 + 1.83015779E-01 9.66936052E-02 1.68256506E-01 2.26640508E-01 + 1.80385426E-01 3.50905694E-02 1.05195381E-01 1.86476842E-01 + 1.67947158E-01 6.89969137E-02 8.38018730E-02 1.37571916E-01 + 1.63701236E-01 1.68813542E-01 2.82632917E-01 2.67961919E-01 + 2.47982472E-01 2.29998589E-01 2.26777419E-01 9.11079273E-02 + 9.57908779E-02 1.53867021E-01 1.25524104E-01 4.48283292E-02 + 6.86317161E-02 1.25353619E-01 1.94365352E-01 2.46733144E-01 + 2.79778630E-01 2.79557914E-01 2.32204646E-01 2.31329143E-01 + 2.20570803E-01 1.38372332E-01 1.38004035E-01 1.26015827E-01 + 1.17161609E-01 3.87529470E-02 5.18314205E-02 9.20669734E-02 + 2.41872430E-01 2.55570531E-01 2.62369901E-01 3.02672923E-01 + 2.55188942E-01 2.19004512E-01 2.44617060E-01 1.89486742E-01 + 1.44565314E-01 9.42570046E-02 9.84002948E-02 7.07980543E-02 + 3.71774696E-02 8.49543959E-02 2.22129658E-01 2.31469855E-01 + 2.28120789E-01 2.21420079E-01 1.95625022E-01 2.31675506E-01 + 2.72649407E-01 2.29841173E-01 1.34344444E-01 1.22346930E-01 + 1.09811313E-01 7.43081570E-02 5.01541868E-02 1.35248303E-01 + 2.15821087E-01 2.23028854E-01 1.93477869E-01 2.17054963E-01 + 2.14943677E-01 1.79209620E-01 2.37689257E-01 2.41178036E-01 + 1.06355458E-01 1.95177853E-01 1.15804508E-01 1.35939389E-01 + 1.58374876E-01 2.23187879E-01 2.05116868E-01 1.89615965E-01 + 2.09050670E-01 2.25298047E-01 2.02609211E-01 2.29912862E-01 + 2.15041161E-01 1.74679056E-01 1.78679198E-01 1.97146058E-01 + 1.96514815E-01 1.42270401E-01 1.51109830E-01 2.01755866E-01 + 1.98175997E-01 2.18767270E-01 1.85883641E-01 1.87238216E-01 + 2.05689251E-01 1.97737262E-01 1.49305984E-01 1.88742191E-01 + 1.48103029E-01 1.58320218E-01 1.59679934E-01 1.70858160E-01 + 2.20053613E-01 1.72362223E-01 5.74371740E-02 1.07702106E-01 + 1.17003597E-01 1.25957936E-01 2.18744263E-01 2.11789608E-01 + 1.37493178E-01 9.55152810E-02 9.93561819E-02 1.07181571E-01 + 1.73337817E-01 2.13628232E-01 1.83054224E-01 2.02108040E-01 + 5.62178791E-02 1.10853836E-01 1.34622708E-01 1.44815162E-01 + 2.20847532E-01 1.90029249E-01 1.55640215E-01 7.47773647E-02 + 7.21002594E-02 1.55616283E-01 2.40308523E-01 2.46016055E-01 + 2.47088969E-01 2.13750392E-01 1.24672212E-01 8.76252949E-02 + 1.14699416E-01 1.50793925E-01 1.94918454E-01 1.20785251E-01 + 1.15324624E-01 8.32351148E-02 5.95173091E-02 1.15811057E-01 + 2.28377268E-01 2.58379519E-01 2.47824714E-01 1.76275298E-01 + 2.12631509E-01 1.16733581E-01 1.23314641E-01 1.10244021E-01 + 1.53639466E-01 1.06283166E-01 1.47718698E-01 1.40753135E-01 + 1.72972962E-01 1.55727848E-01 2.01710075E-01 1.85823619E-01 + 1.75643608E-01 2.00085804E-01 1.35226190E-01 1.12900220E-01 + 1.35908693E-01 1.08360305E-01 1.67449713E-01 1.46356165E-01 + 1.16797090E-01 2.27289870E-01 1.86951563E-01 1.77039579E-01 + 1.94289580E-01 2.03769028E-01 2.41506636E-01 1.88865066E-01 + 1.13562502E-01 1.30406275E-01 1.35351330E-01 1.63164139E-01 + 2.43350923E-01 2.41524324E-01 2.12406278E-01 1.98659226E-01 + 1.76790893E-01 1.68100119E-01 1.68155342E-01 1.47706136E-01 + 1.01419099E-01 7.81829879E-02 1.02491245E-01 9.07802582E-02 + 1.11634038E-01 1.59503594E-01 2.08952412E-01 1.99825063E-01 + 1.88145936E-01 2.32065350E-01 2.19814211E-01 2.24978268E-01 + 6.75658733E-02 1.83069892E-02 4.99667339E-02 4.52653542E-02 + 7.54402205E-02 1.03967182E-01 1.14988707E-01 1.73447475E-01 + 1.84838250E-01 1.94346324E-01 1.85415342E-01 2.27436408E-01 + 2.32757613E-01 2.46336192E-01 8.48375484E-02 2.50372235E-02 + 1.56380348E-02 2.63871197E-02 7.90741891E-02 1.16687968E-01 + 1.19601227E-01 1.91254765E-01 2.24391982E-01 1.82301730E-01 + 1.87880948E-01 2.05701947E-01 2.45137334E-01 2.53440738E-01 + 1.35189369E-01 8.44102949E-02 8.49294588E-02 8.74892771E-02 + 1.82795018E-01 1.16163723E-01 1.18230522E-01 1.41032681E-01 + 2.15687513E-01 1.51349992E-01 1.72865957E-01 1.38437748E-01 + 1.10408768E-01 1.59527197E-01 1.74433276E-01 1.73609927E-01 + 1.58992007E-01 2.05466807E-01 2.15597972E-01 1.63493395E-01 + 1.26850203E-01 1.67036295E-01 2.10681289E-01 1.79397151E-01 + 1.24232516E-01 1.52914286E-01 1.05429977E-01 1.22187451E-01 + 1.72928423E-01 1.99037254E-01 1.68902159E-01 1.88715443E-01 + 1.76750079E-01 1.74203098E-01 1.83985829E-01 2.02539027E-01 + 1.91359505E-01 1.86874345E-01 1.38427109E-01 1.03771672E-01 + 1.35486528E-01 9.73144248E-02 1.40001193E-01 1.76529631E-01 + 1.79460809E-01 1.61878511E-01 1.66714117E-01 1.08198002E-01 + 1.81648269E-01 1.42325193E-01 1.64363563E-01 1.58839256E-01 + 1.45656183E-01 2.11080015E-01 1.80693969E-01 1.33954659E-01 + 1.70162827E-01 1.62478402E-01 1.69477269E-01 1.20088175E-01 + 1.19602211E-01 1.36643663E-01 1.26295149E-01 1.48067862E-01 + 1.78583309E-01 1.17276676E-01 1.24803707E-01 9.64563116E-02 + 1.70666799E-01 1.71921402E-01 1.28262803E-01 1.55826539E-01 + 1.34940654E-01 2.63817281E-01 1.62843645E-01 9.26060006E-02 + 1.09547816E-01 4.94904295E-02 9.03493762E-02 1.30115479E-01 + 1.12282500E-01 8.16418454E-02 9.13742408E-02 1.69388160E-01 + 1.65324107E-01 1.66907445E-01 1.78617209E-01 2.56497592E-01 + 1.90672964E-01 1.34340644E-01 1.19919896E-01 1.27318531E-01 + 1.80629149E-01 1.45796612E-01 9.48037654E-02 5.79959899E-02 + 1.34122178E-01 1.62608445E-01 1.38533905E-01 7.68947676E-02 + 1.64289832E-01 1.91646740E-01 2.10266411E-01 2.13602602E-01 + 2.06359833E-01 2.45558009E-01 2.52906531E-01 2.78311491E-01 + 2.10861102E-01 6.80826753E-02 1.07531793E-01 1.71340615E-01 + 1.26473576E-01 6.96489066E-02 6.90840632E-02 8.25755224E-02 + 1.89765990E-01 2.34343424E-01 2.84349918E-01 2.92163283E-01 + 2.44762763E-01 2.65405387E-01 2.99633443E-01 1.29871562E-01 + 1.55188590E-01 1.51893646E-01 7.88864121E-02 9.03397575E-02 + 6.11580759E-02 6.22767992E-02 1.61964834E-01 2.61410356E-01 + 3.11576486E-01 2.90716559E-01 2.48442680E-01 2.84655839E-01 + 3.02768111E-01 2.15051234E-01 1.32175371E-01 1.45670488E-01 + 8.37266371E-02 8.07956681E-02 6.00548685E-02 7.09229857E-02 + 1.97506875E-01 2.47641012E-01 2.45708123E-01 2.62808353E-01 + 2.21874908E-01 2.43261680E-01 2.23541051E-01 2.19734281E-01 + 1.32738546E-01 1.40480772E-01 1.09604917E-01 9.07077789E-02 + 7.49193281E-02 1.08087130E-01 2.09763005E-01 2.55648285E-01 + 2.24341840E-01 2.13365585E-01 2.56823212E-01 2.45582134E-01 + 2.32395440E-01 2.36865342E-01 1.05373465E-01 1.25835046E-01 + 1.18045874E-01 6.25053793E-02 1.03618681E-01 1.58321559E-01 + 2.42807150E-01 2.50532955E-01 2.26810008E-01 2.67959118E-01 + 2.87788630E-01 1.60882637E-01 1.81297317E-01 2.14220524E-01 + 8.66121724E-02 1.79260075E-01 1.80800334E-01 1.18942164E-01 + 1.97248995E-01 2.35998422E-01 2.14870587E-01 2.25688562E-01 + 2.49397486E-01 2.28106469E-01 2.22926661E-01 1.97255060E-01 + 1.88566506E-01 1.79022014E-01 1.86794534E-01 2.15711966E-01 + 1.27088070E-01 1.84249401E-01 2.48261705E-01 9.32223871E-02 + 3.68994363E-02 9.08542052E-02 1.38598278E-01 1.32720590E-01 + 2.39890307E-01 1.98403940E-01 1.55952260E-01 1.18976191E-01 + 1.11339577E-01 1.33366570E-01 1.68558672E-01 2.33306393E-01 + 2.77379334E-01 2.70036727E-01 5.53219207E-02 1.12936273E-01 + 1.76734313E-01 1.59588426E-01 2.40858778E-01 1.74120963E-01 + 1.65370211E-01 1.20484032E-01 1.02762699E-01 1.45806730E-01 + 1.80164725E-01 2.40599334E-01 2.93201178E-01 2.89978087E-01 + 9.80196670E-02 1.33148819E-01 1.75948218E-01 1.62767231E-01 + 2.15421483E-01 1.74830958E-01 1.32314190E-01 1.41846403E-01 + 1.00327052E-01 1.41394496E-01 2.05270186E-01 2.30800331E-01 + 2.99213409E-01 2.34888628E-01 2.30758309E-01 1.21597297E-01 + 1.33744568E-01 1.48730516E-01 1.91139534E-01 1.01215757E-01 + 1.46431729E-01 1.99798048E-01 1.17123127E-01 1.63981721E-01 + 1.65613994E-01 1.99951962E-01 2.14297250E-01 1.94890842E-01 + 1.95639089E-01 1.11984558E-01 1.31856263E-01 1.50690854E-01 + 2.19218135E-01 1.30428135E-01 1.72204614E-01 2.16809317E-01 + 1.95565104E-01 1.81005970E-01 2.00495631E-01 2.43510574E-01 + 2.22417474E-01 2.11478055E-01 1.33270368E-01 1.26652762E-01 + 1.14986807E-01 1.84468955E-01 2.32128724E-01 2.07597807E-01 + 1.98499173E-01 1.92549109E-01 2.26707667E-01 1.86450154E-01 + 2.13874489E-01 1.50775596E-01 9.95590538E-02 7.55920634E-02 + 1.20417945E-01 1.25362977E-01 1.02871269E-01 1.99898422E-01 + 2.00633496E-01 2.28770092E-01 2.09413245E-01 1.93593755E-01 + 2.00634718E-01 2.07565978E-01 4.25771922E-02 1.52801909E-03 + 6.35758489E-02 9.73584726E-02 1.08837746E-01 1.56960726E-01 + 1.65061682E-01 2.03559518E-01 2.11686701E-01 2.08448291E-01 + 2.05886543E-01 1.80840284E-01 2.26879090E-01 2.24939927E-01 + 6.97714910E-02 3.23900767E-02 4.14893329E-02 1.00254364E-01 + 9.35143083E-02 1.43949464E-01 1.99673563E-01 2.19579056E-01 + 2.29150474E-01 2.12187350E-01 2.05060691E-01 1.99973807E-01 + 2.77688891E-01 2.54770964E-01 8.24014246E-02 2.60538142E-02 + 2.06312221E-02 5.68771325E-02 1.19376473E-01 1.23578407E-01 + 1.65830284E-01 2.52745211E-01 2.85077244E-01 2.07626104E-01 + 1.81341633E-01 1.54046834E-01 2.54204839E-01 1.74213976E-01 + 7.55989105E-02 1.00565121E-01 6.63851053E-02 1.14059769E-01 + 1.60663188E-01 1.55936614E-01 1.48948804E-01 1.81192607E-01 + 2.31403485E-01 1.39964014E-01 2.00419292E-01 1.13801561E-01 + 1.72789484E-01 1.99655041E-01 8.82096738E-02 1.33415297E-01 + 9.78572220E-02 8.31643194E-02 1.27067372E-01 1.33806437E-01 + 1.46409616E-01 1.42124549E-01 2.09837228E-01 1.69854507E-01 + 2.15094358E-01 9.37532037E-02 1.01099685E-01 1.89076275E-01 + 1.35335580E-01 1.72190756E-01 1.41990751E-01 1.00706287E-01 + 1.06072322E-01 1.02447644E-01 1.05059214E-01 9.74029526E-02 + 1.38360664E-01 1.55762970E-01 2.07919061E-01 1.11810274E-01 + 1.27713665E-01 2.21117884E-01 1.45021141E-01 2.14708924E-01 + 1.80979401E-01 1.03229828E-01 1.25221521E-01 1.16215542E-01 + 1.15979575E-01 8.99886787E-02 8.47441256E-02 1.19580060E-01 + 2.06272975E-01 1.14300005E-01 1.43719956E-01 2.16024369E-01 + 1.72187358E-01 1.48358583E-01 1.07307807E-01 9.87760499E-02 + 9.85257030E-02 1.11162856E-01 1.09246403E-01 5.16266599E-02 + 4.63481359E-02 1.11189380E-01 1.29327476E-01 8.94981325E-02 + 9.60547328E-02 1.24966845E-01 1.56984344E-01 1.38510972E-01 + 1.12906829E-01 1.11184269E-01 9.58382934E-02 5.88144474E-02 + 5.88113479E-02 4.82259914E-02 4.00888883E-02 1.27090544E-01 + 1.13283031E-01 7.62755275E-02 1.38158038E-01 1.41745791E-01 + 1.64458767E-01 1.64141715E-01 1.17628582E-01 6.14199042E-02 + 5.92395999E-02 5.15106991E-02 4.61386405E-02 5.16348705E-02 + 8.25608298E-02 7.38490894E-02 1.64815500E-01 2.17638910E-01 + 1.43482894E-01 1.78496912E-01 1.58415124E-01 1.71485007E-01 + 1.52890056E-01 2.01209038E-01 2.30148599E-01 2.35680357E-01 + 2.53874302E-01 2.44583368E-01 2.19498351E-01 2.19670072E-01 + 1.82343394E-01 1.37780160E-01 1.20166346E-01 1.55445233E-01 + 1.19182669E-01 1.19992882E-01 9.50701535E-02 1.11314900E-01 + 1.90837920E-01 2.62601823E-01 2.96538264E-01 2.48333618E-01 + 2.55405098E-01 2.49950275E-01 2.96724170E-01 1.66942641E-01 + 1.23009205E-01 1.23015821E-01 9.40902978E-02 8.11983645E-02 + 1.28880545E-01 6.59251809E-02 1.90582648E-01 2.38419369E-01 + 2.18898401E-01 2.08803147E-01 2.49784157E-01 2.86847502E-01 + 2.68939316E-01 1.88686416E-01 1.26009196E-01 1.05237253E-01 + 1.50324270E-01 1.15149982E-01 1.32701322E-01 1.03706963E-01 + 2.22602352E-01 2.71799296E-01 2.31249660E-01 2.05401197E-01 + 2.89969444E-01 2.64872760E-01 2.29176119E-01 1.81011781E-01 + 1.17247246E-01 1.40658647E-01 1.50109321E-01 9.17695984E-02 + 1.08864300E-01 1.20023087E-01 2.35279322E-01 2.84487963E-01 + 1.97761267E-01 1.91650152E-01 1.87682122E-01 1.40877426E-01 + 1.64961576E-01 1.84335023E-01 9.34977755E-02 1.51140377E-01 + 1.37077481E-01 9.66778770E-02 9.97685269E-02 1.33104578E-01 + 2.30316132E-01 2.65185833E-01 2.18501449E-01 2.34311566E-01 + 2.12560952E-01 6.93471059E-02 1.62006423E-01 1.71978161E-01 + 1.40010387E-01 1.80635110E-01 1.41866595E-01 2.30963826E-01 + 2.46074155E-01 5.08169904E-02 3.14819776E-02 1.07552812E-01 + 1.72439143E-01 1.44718289E-01 1.85305595E-01 2.03398407E-01 + 1.45760298E-01 1.56519577E-01 1.02804288E-01 1.61255434E-01 + 1.38349771E-01 2.06964210E-01 2.35196978E-01 1.86720476E-01 + 7.07251430E-02 1.26214415E-01 1.56261489E-01 1.62506342E-01 + 2.22594589E-01 2.04621062E-01 1.45161167E-01 1.87383100E-01 + 1.00975394E-01 1.35529056E-01 1.66312844E-01 1.85043201E-01 + 2.34772369E-01 3.00872177E-01 1.23635396E-01 1.27937913E-01 + 1.56959161E-01 1.87240273E-01 2.20847964E-01 2.23522574E-01 + 1.52574793E-01 1.98613167E-01 1.16324410E-01 1.38055041E-01 + 1.89824790E-01 2.39875317E-01 2.38654658E-01 2.50839591E-01 + 1.74359053E-01 8.95287842E-02 1.51348785E-01 1.81701258E-01 + 2.00094372E-01 1.60995200E-01 1.65723711E-01 2.19817698E-01 + 1.41379774E-01 1.50358692E-01 2.00845778E-01 1.59606978E-01 + 1.93946049E-01 1.86734453E-01 1.81116998E-01 9.16227847E-02 + 1.43094018E-01 1.54213682E-01 1.99862570E-01 1.50915772E-01 + 1.61064744E-01 2.02909514E-01 1.89077452E-01 1.33546561E-01 + 2.24757239E-01 2.43171558E-01 2.44406819E-01 2.32603446E-01 + 1.45464644E-01 1.10395849E-01 1.61439806E-01 1.70510247E-01 + 2.62979448E-01 2.07310095E-01 1.99753657E-01 2.36134425E-01 + 2.45476767E-01 2.22405031E-01 2.13505462E-01 2.18887791E-01 + 1.81279287E-01 1.54150128E-01 1.09480977E-01 1.08462192E-01 + 1.37743339E-01 2.70761818E-01 2.93154866E-01 3.14346582E-01 + 2.43709683E-01 2.09689245E-01 2.23180473E-01 1.86744258E-01 + 1.48725793E-01 6.99391514E-02 5.11968732E-02 1.19664788E-01 + 1.06881291E-01 1.35208875E-01 1.33360803E-01 2.35589802E-01 + 2.52405435E-01 2.47783035E-01 2.05614790E-01 2.48104796E-01 + 2.46228397E-01 2.22856089E-01 6.27767965E-02 4.68759388E-02 + 8.29169378E-02 1.23601206E-01 1.27497077E-01 1.34107307E-01 + 1.70754030E-01 2.44786695E-01 2.87820697E-01 2.99380153E-01 + 2.50463158E-01 2.36908928E-01 2.86179870E-01 2.54264414E-01 + 7.85118863E-02 4.62917648E-02 7.35332444E-02 1.17057852E-01 + 1.39213130E-01 1.50162548E-01 1.61834463E-01 2.51118004E-01 + 3.21498543E-01 2.41671979E-01 2.10339934E-01 1.82319880E-01 + 2.31175065E-01 2.48272344E-01 9.04732570E-02 6.17197193E-02 + 9.38182026E-02 1.12558052E-01 1.63910151E-01 1.59047753E-01 + 2.07602113E-01 2.33888164E-01 2.52376199E-01 1.71534956E-01 + 2.31692061E-01 1.54329553E-01 2.25269794E-01 1.79115862E-01 + 7.64331669E-02 8.71256217E-02 1.19162977E-01 1.20452181E-01 + 1.68869153E-01 1.57130241E-01 1.70241073E-01 1.50250584E-01 + 2.41312116E-01 1.80517420E-01 2.22688407E-01 1.32968783E-01 + 1.34492889E-01 1.66016236E-01 8.87104943E-02 1.04884095E-01 + 1.22766055E-01 9.45729911E-02 1.30490571E-01 1.22993648E-01 + 9.87839550E-02 1.06135666E-01 1.78561613E-01 1.80592358E-01 + 1.92397848E-01 1.28364012E-01 1.45821527E-01 1.86039358E-01 + 1.61725402E-01 9.78572518E-02 1.27987385E-01 1.08414121E-01 + 1.21968977E-01 1.34556681E-01 9.15471688E-02 1.00392610E-01 + 1.00297719E-01 1.30691186E-01 2.25268707E-01 1.22465588E-01 + 1.52601704E-01 2.10855514E-01 1.86374888E-01 9.58506018E-02 + 1.15704015E-01 9.70724523E-02 1.23215251E-01 1.43701211E-01 + 1.22476615E-01 6.23194166E-02 3.25780809E-02 1.90515324E-01 + 1.86003551E-01 9.48411003E-02 1.26124054E-01 2.30070114E-01 + 1.57009318E-01 1.16147317E-01 1.31415233E-01 9.07430947E-02 + 1.16676927E-01 1.02000810E-01 6.15216419E-02 5.27904220E-02 + 7.35260993E-02 2.06896871E-01 1.63356870E-01 7.56459609E-02 + 1.11875422E-01 2.06136778E-01 1.47165343E-01 9.49886739E-02 + 1.19381852E-01 5.04225604E-02 4.73141707E-02 9.02410224E-02 + 6.78749084E-02 4.76668924E-02 1.27808586E-01 2.42304578E-01 + 2.07663596E-01 1.06535748E-01 1.08468309E-01 2.42739394E-01 + 1.19430736E-01 1.27400815E-01 1.21277310E-01 3.61390486E-02 + 3.69177908E-02 6.61550313E-02 1.09527253E-01 1.65478438E-01 + 2.04976797E-01 1.26458824E-01 2.68369168E-01 2.12361380E-01 + 2.08420575E-01 1.68954685E-01 2.40304634E-01 2.33466357E-01 + 2.32494384E-01 2.52091587E-01 1.91599891E-01 2.05450967E-01 + 2.06860781E-01 2.42406473E-01 2.41755366E-01 1.62480339E-01 + 1.25355840E-01 8.80924240E-02 1.52892977E-01 1.24738321E-01 + 1.62068665E-01 1.55541763E-01 1.82199612E-01 1.24455243E-01 + 2.59938538E-01 2.86848068E-01 2.60260284E-01 2.83167422E-01 + 2.84959108E-01 2.53766298E-01 2.31027856E-01 1.07672893E-01 + 1.45140588E-01 1.24066681E-01 1.71561360E-01 1.48448616E-01 + 1.65848926E-01 8.94349813E-02 2.19644263E-01 2.87566572E-01 + 2.64337659E-01 1.96578875E-01 2.44702235E-01 2.64255732E-01 + 2.84735233E-01 1.90297931E-01 1.07083157E-01 1.45529479E-01 + 1.66260555E-01 1.21871680E-01 1.16297208E-01 9.85506326E-02 + 1.78709567E-01 2.21884713E-01 2.19022840E-01 2.38737509E-01 + 2.35327229E-01 2.06135362E-01 1.68712839E-01 2.28741780E-01 + 8.64847973E-02 1.17109738E-01 1.15400434E-01 8.38371068E-02 + 1.22627206E-01 1.13689184E-01 2.08765671E-01 2.73550302E-01 + 2.53051132E-01 2.43065760E-01 2.41081446E-01 8.28232840E-02 + 1.09137826E-01 2.12502524E-01 1.19307563E-01 1.38738051E-01 + 1.85551450E-01 2.35189885E-01 1.88825220E-01 6.93387166E-02 + 9.54072699E-02 1.40722156E-01 1.56676963E-01 1.25800669E-01 + 1.72846824E-01 1.80138186E-01 1.14588231E-01 1.99381858E-01 + 1.36121690E-01 1.68142647E-01 1.49517760E-01 2.03414008E-01 + 2.51514345E-01 1.26861691E-01 8.20586160E-02 1.32440120E-01 + 1.43593311E-01 1.58837289E-01 1.90005675E-01 2.08985120E-01 + 1.25955060E-01 1.75129890E-01 1.12365969E-01 1.57622293E-01 + 1.44591257E-01 1.87106624E-01 2.36656785E-01 2.48308405E-01 + 8.61579031E-02 1.13373131E-01 1.64013088E-01 1.96677282E-01 + 2.14642107E-01 1.91429988E-01 1.76281869E-01 2.02843860E-01 + 1.34406194E-01 1.45110786E-01 1.26146242E-01 1.96194440E-01 + 2.13998511E-01 2.46141598E-01 1.69050053E-01 9.98100415E-02 + 1.18944354E-01 1.95531264E-01 1.69884846E-01 1.78308025E-01 + 1.84810638E-01 2.13678271E-01 1.41176298E-01 1.26402572E-01 + 1.74317315E-01 2.60249794E-01 2.77389854E-01 2.32691199E-01 + 2.46689692E-01 1.41697094E-01 1.58061370E-01 1.12026408E-01 + 1.64409101E-01 1.75194174E-01 1.52728513E-01 1.81649014E-01 + 1.25800908E-01 9.87016484E-02 2.17671707E-01 2.45131731E-01 + 2.50641197E-01 2.61650324E-01 1.82426453E-01 2.13050589E-01 + 2.24280417E-01 1.61775216E-01 1.93927974E-01 1.65016547E-01 + 1.56227574E-01 1.81963921E-01 2.18586579E-01 1.41248018E-01 + 2.65780151E-01 2.62879908E-01 2.46978477E-01 2.15715557E-01 + 1.21100195E-01 1.45370767E-01 2.38288134E-01 2.75768429E-01 + 2.56491572E-01 2.23945513E-01 2.27013841E-01 2.84818769E-01 + 2.79812783E-01 2.47286141E-01 2.39604130E-01 1.92091301E-01 + 9.63429585E-02 1.13731340E-01 1.18522488E-01 1.39292374E-01 + 2.09919691E-01 2.93905735E-01 3.07460785E-01 2.86830664E-01 + 2.46791989E-01 2.42742643E-01 2.22256839E-01 1.89212039E-01 + 5.61333224E-02 5.52369393E-02 1.14847898E-01 1.28072321E-01 + 1.20875686E-01 1.56617984E-01 1.48796469E-01 2.20979214E-01 + 2.72882670E-01 2.91894555E-01 2.75164902E-01 2.35003054E-01 + 1.92387104E-01 2.22589195E-01 9.01959240E-02 5.17496280E-02 + 9.15606990E-02 1.35524675E-01 1.22911744E-01 1.47512287E-01 + 1.87758818E-01 2.47638837E-01 2.91254699E-01 2.75007844E-01 + 2.54629135E-01 2.10420772E-01 2.10472509E-01 2.08881184E-01 + 1.02561928E-01 4.51256223E-02 8.54878724E-02 1.17693581E-01 + 1.34035587E-01 1.54961392E-01 2.12961122E-01 2.41935432E-01 + 2.50282228E-01 2.04463542E-01 2.55191535E-01 1.75302953E-01 + 2.39842921E-01 2.05140531E-01 8.89636129E-02 5.39263934E-02 + 6.51079640E-02 1.34779036E-01 1.77289948E-01 1.27639040E-01 + 1.94849223E-01 1.99961185E-01 2.31963485E-01 1.68729067E-01 + 2.01993614E-01 1.30943164E-01 2.10214034E-01 1.69541821E-01 + 9.11549851E-02 9.27464813E-02 1.10765412E-01 1.47337273E-01 + 1.56473801E-01 1.19771935E-01 1.40192732E-01 1.12711780E-01 + 1.94350511E-01 1.85163185E-01 2.22792685E-01 1.30984828E-01 + 1.67875126E-01 1.60166100E-01 1.26412913E-01 1.14821777E-01 + 1.26888782E-01 1.41959220E-01 1.61133811E-01 1.21360280E-01 + 1.02123976E-01 7.48417154E-02 6.64488152E-02 1.46459967E-01 + 2.09735632E-01 1.28731802E-01 1.50694385E-01 2.09493965E-01 + 1.47091940E-01 9.48904008E-02 1.35861382E-01 1.32341087E-01 + 1.42930195E-01 1.34672225E-01 9.74548534E-02 7.46915266E-02 + 9.26639512E-03 1.48208663E-01 2.03882053E-01 9.47894379E-02 + 1.36425272E-01 2.37208858E-01 1.28863677E-01 8.99875462E-02 + 1.33599743E-01 1.11479081E-01 1.03274010E-01 1.10965893E-01 + 4.08108346E-02 5.75843081E-02 3.10276989E-02 1.89792439E-01 + 1.74883693E-01 5.19335531E-02 1.20415181E-01 2.55170792E-01 + 1.07398815E-01 5.49273528E-02 1.09258801E-01 9.90441963E-02 + 4.97996323E-02 9.20950696E-02 3.09186708E-02 1.02793828E-01 + 1.57218292E-01 2.98211694E-01 1.92570344E-01 9.68410745E-02 + 1.08569928E-01 2.61794567E-01 9.03297737E-02 8.20206106E-02 + 1.04842633E-01 1.10744067E-01 1.08591147E-01 1.63676500E-01 + 1.06802277E-01 1.66864097E-01 2.63047814E-01 3.10082972E-01 + 2.42061526E-01 1.08633690E-01 1.13143027E-01 2.24461898E-01 + 1.13001794E-01 1.44649893E-01 1.20357074E-01 1.38142154E-01 + 9.10838246E-02 1.28605306E-01 1.39856935E-01 2.38474742E-01 + 2.93416083E-01 2.51824081E-01 2.33478203E-01 2.03051105E-01 + 1.50785491E-01 1.70467243E-01 2.28098407E-01 2.25081727E-01 + 1.97613001E-01 2.25202382E-01 2.29821593E-01 2.05600783E-01 + 2.37018794E-01 1.93927929E-01 1.53586492E-01 1.54907003E-01 + 9.66134444E-02 4.29414399E-02 1.03913017E-01 2.01106474E-01 + 1.88071653E-01 1.73657939E-01 1.93402350E-01 1.82983652E-01 + 2.55123585E-01 2.84092724E-01 2.94299364E-01 2.59976447E-01 + 2.09353700E-01 2.36524984E-01 2.02511832E-01 9.65887159E-02 + 9.91833434E-02 1.49591357E-01 1.57234266E-01 1.36384889E-01 + 1.46506160E-01 1.51522934E-01 1.82182878E-01 2.19918057E-01 + 2.70451725E-01 2.31577531E-01 3.12469393E-01 2.12490141E-01 + 2.20545962E-01 1.55588552E-01 9.91601869E-02 1.04907177E-01 + 1.23865269E-01 1.05112836E-01 1.02263793E-01 1.69381663E-01 + 1.97961062E-01 2.68335342E-01 2.21028149E-01 2.65592247E-01 + 2.16444686E-01 1.79755315E-01 1.01200588E-01 1.83279932E-01 + 1.20640047E-01 1.08826622E-01 2.41796851E-01 2.21828341E-01 + 1.47342533E-01 1.12070255E-01 9.01112929E-02 1.05541259E-01 + 1.59338310E-01 1.20075032E-01 1.64812997E-01 2.00403780E-01 + 1.46124527E-01 2.41307721E-01 1.46638989E-01 1.26881450E-01 + 1.60871074E-01 2.34112605E-01 2.41891354E-01 1.35830104E-01 + 1.02956913E-01 1.58042997E-01 1.83568820E-01 1.55204833E-01 + 1.73521355E-01 2.45285749E-01 1.32095829E-01 1.68752238E-01 + 1.10328935E-01 1.15652710E-01 1.13331363E-01 2.31608987E-01 + 2.08404392E-01 1.81263745E-01 7.53338486E-02 1.18619345E-01 + 1.76063567E-01 1.88822433E-01 2.37981230E-01 2.62879103E-01 + 1.68682918E-01 1.42956376E-01 1.16204374E-01 1.03658095E-01 + 1.48274854E-01 2.28535533E-01 2.54029691E-01 2.31594533E-01 + 9.96461064E-02 1.02862254E-01 1.43679425E-01 2.05921531E-01 + 2.19461337E-01 1.94665685E-01 1.94733515E-01 1.48562118E-01 + 1.26815975E-01 1.07977577E-01 1.56185433E-01 2.57043064E-01 + 2.73682296E-01 2.74421215E-01 2.08354160E-01 1.53220490E-01 + 1.97723284E-01 1.46178991E-01 2.32067153E-01 2.24216178E-01 + 1.56812936E-01 1.45552590E-01 1.15301520E-01 1.17163442E-01 + 1.90055400E-01 2.26999626E-01 2.32386440E-01 2.36265793E-01 + 2.02602491E-01 2.23612264E-01 2.20133066E-01 2.29372874E-01 + 1.96045741E-01 1.93648413E-01 1.43180624E-01 1.53722644E-01 + 1.11120835E-01 1.01568557E-01 2.14719817E-01 2.58005559E-01 + 2.25109458E-01 2.02521265E-01 1.15753241E-01 1.87761068E-01 + 2.30424881E-01 2.35563055E-01 2.26249054E-01 1.86613858E-01 + 1.55054584E-01 2.51078397E-01 2.11011216E-01 1.74632937E-01 + 2.43845090E-01 2.75174141E-01 2.05566108E-01 1.27046287E-01 + 1.19294882E-01 1.75235838E-01 2.73994684E-01 2.46281907E-01 + 2.24598810E-01 2.75116593E-01 2.47828722E-01 2.92829782E-01 + 2.71432191E-01 2.33025253E-01 1.27665713E-01 7.87045881E-02 + 1.04322888E-01 1.22264214E-01 1.25077680E-01 1.77703172E-01 + 1.74655586E-01 2.59198874E-01 3.04650962E-01 3.13079774E-01 + 2.61401296E-01 2.63554871E-01 2.24513024E-01 2.27451414E-01 + 6.46279380E-02 2.58421768E-02 9.90069360E-02 1.57803193E-01 + 1.21531583E-01 1.22957885E-01 1.56367689E-01 2.14409605E-01 + 2.40308538E-01 2.54148632E-01 2.44914070E-01 2.09527567E-01 + 2.05839232E-01 2.58149177E-01 1.46758020E-01 6.98340833E-02 + 4.56906147E-02 1.15494281E-01 1.07773773E-01 1.23124793E-01 + 2.01635167E-01 2.60134637E-01 2.44234055E-01 1.77612215E-01 + 2.20073611E-01 2.04613715E-01 2.50955999E-01 1.82230696E-01 + 1.52731448E-01 8.62240121E-02 3.99045534E-02 1.35518864E-01 + 1.51748642E-01 1.26193881E-01 1.69426665E-01 2.91761249E-01 + 3.14959198E-01 1.51216045E-01 2.43368149E-01 1.42734841E-01 + 2.27194741E-01 1.78028166E-01 1.44531623E-01 1.09359995E-01 + 7.38480985E-02 1.33263409E-01 1.48227349E-01 1.17562585E-01 + 1.54860601E-01 1.23703934E-01 1.83940202E-01 1.20649762E-01 + 2.34634712E-01 1.39649495E-01 1.43034250E-01 2.31653184E-01 + 1.55839652E-01 1.28488809E-01 1.00944594E-01 1.46031022E-01 + 1.31760120E-01 8.85342881E-02 1.13527559E-01 4.86158095E-02 + 4.87063937E-02 8.50318596E-02 2.07409531E-01 1.30370617E-01 + 1.08854875E-01 2.32678786E-01 1.77561209E-01 1.11940496E-01 + 1.12829849E-01 1.31346792E-01 1.15584180E-01 8.40672106E-02 + 6.70318827E-02 4.28654850E-02 1.08376164E-02 1.15594588E-01 + 1.88150600E-01 4.16767821E-02 8.52298960E-02 2.53087997E-01 + 1.17833249E-01 8.96714702E-02 1.27805427E-01 1.41842127E-01 + 9.55946818E-02 8.97803754E-02 4.44166176E-02 5.21442741E-02 + 4.77311350E-02 2.08012238E-01 1.77316666E-01 1.56334024E-02 + 5.71169332E-02 2.24818304E-01 9.83564183E-02 7.85242245E-02 + 8.58387128E-02 1.47288799E-01 7.92127103E-02 4.24669683E-02 + 5.93244918E-02 1.17204748E-01 1.75914541E-01 3.02881926E-01 + 2.15324104E-01 3.03977057E-02 8.07050541E-02 2.65701205E-01 + 1.22147486E-01 8.72062519E-02 9.26938802E-02 1.44086331E-01 + 7.61718228E-02 5.62227741E-02 9.81236100E-02 1.76385790E-01 + 2.89948940E-01 3.08002383E-01 2.23673761E-01 4.71202359E-02 + 8.77557918E-02 2.20288172E-01 1.19509540E-01 1.42650574E-01 + 1.19468734E-01 2.00330466E-01 2.27112204E-01 1.83722198E-01 + 2.03759566E-01 2.55748957E-01 2.89606273E-01 2.99790353E-01 + 2.70634264E-01 3.96603309E-02 1.16906963E-01 1.37566775E-01 + 1.51257500E-01 1.50838435E-01 1.74649447E-01 2.27096885E-01 + 2.24581227E-01 2.48711541E-01 2.39878312E-01 2.32817546E-01 + 2.44310930E-01 2.26996720E-01 2.07969800E-01 1.22707710E-01 + 1.08974539E-01 1.24487303E-01 1.68556899E-01 1.62025332E-01 + 1.54067129E-01 1.67313665E-01 2.06885383E-01 2.44684219E-01 + 2.65008628E-01 2.57584333E-01 2.54879653E-01 2.27328107E-01 + 2.47151256E-01 2.37975940E-01 1.65084437E-01 1.54375032E-01 + 1.60866007E-01 1.69660151E-01 1.96701154E-01 2.46763021E-01 + 2.47676760E-01 2.42226213E-01 2.45464399E-01 2.26223737E-01 + 2.80524164E-01 2.28280678E-01 2.95211494E-01 2.07784519E-01 + 1.03409350E-01 1.22990884E-01 1.38878375E-01 1.64018303E-01 + 1.69003949E-01 2.71347731E-01 2.70438641E-01 2.80875891E-01 + 2.41368309E-01 1.86018392E-01 2.46860996E-01 2.30394647E-01 + 7.36111030E-02 1.49500698E-01 9.57880244E-02 1.00443386E-01 + 2.07418099E-01 1.93598896E-01 1.17837243E-01 9.57702622E-02 + 8.70235562E-02 9.55132023E-02 1.18139543E-01 1.25604168E-01 + 2.02928379E-01 2.18181401E-01 2.40749553E-01 2.51562804E-01 + 1.63211942E-01 1.13884196E-01 2.66851544E-01 1.60490066E-01 + 1.12955563E-01 8.34328532E-02 1.02603622E-01 1.21067919E-01 + 1.55406162E-01 1.40995130E-01 2.06355691E-01 2.48720333E-01 + 1.80077329E-01 1.65974736E-01 1.15944840E-01 1.01070121E-01 + 2.63718665E-01 2.79860348E-01 2.35743836E-01 8.97284746E-02 + 8.24828446E-02 1.02179065E-01 1.56183720E-01 1.73698485E-01 + 2.60226995E-01 2.87092865E-01 1.94890544E-01 1.54242277E-01 + 1.33695006E-01 1.15213126E-01 2.12246507E-01 2.42704824E-01 + 2.49246940E-01 2.03299046E-01 8.00749883E-02 8.42905492E-02 + 1.16415463E-01 1.71281487E-01 2.83141226E-01 2.70858288E-01 + 1.91272303E-01 1.32154360E-01 1.11115552E-01 1.20768279E-01 + 2.02322483E-01 2.19174996E-01 2.36571163E-01 2.77381867E-01 + 1.42343119E-01 1.22166581E-01 1.61933437E-01 1.39110953E-01 + 2.83378780E-01 2.57416487E-01 1.26789555E-01 1.39607877E-01 + 1.26658306E-01 1.52237266E-01 1.66109338E-01 2.22858697E-01 + 2.11026892E-01 2.51630694E-01 1.91909283E-01 2.25301400E-01 + 2.27942839E-01 2.13889167E-01 2.25436926E-01 2.18727767E-01 + 1.35104388E-01 1.34090304E-01 1.38323069E-01 1.42537892E-01 + 2.54458487E-01 2.61423826E-01 2.44681299E-01 2.29923904E-01 + 1.07446209E-01 2.25909054E-01 2.67939210E-01 1.97305486E-01 + 2.65847862E-01 2.05095917E-01 1.48065418E-01 2.36884490E-01 + 1.51771665E-01 1.37903631E-01 2.86810726E-01 2.45954037E-01 + 2.09459081E-01 1.24577060E-01 7.65830427E-02 2.17119768E-01 + 2.92926818E-01 2.28832901E-01 2.11734176E-01 2.12312624E-01 + 2.22743958E-01 2.37388685E-01 2.38104820E-01 1.87184066E-01 + 1.64230451E-01 1.59120992E-01 1.18196353E-01 1.00696430E-01 + 9.08744410E-02 1.34716287E-01 2.30390176E-01 2.95143604E-01 + 2.72851586E-01 2.81443715E-01 1.68080926E-01 1.97641075E-01 + 2.18282640E-01 2.32065216E-01 6.48251474E-02 5.89186400E-02 + 8.20794255E-02 1.26122996E-01 8.10540915E-02 9.25162137E-02 + 1.82064638E-01 2.13568613E-01 2.50824273E-01 2.62717009E-01 + 2.40155727E-01 1.83260530E-01 2.16667369E-01 2.42371336E-01 + 1.00062199E-01 7.90171474E-02 7.77489990E-02 9.85526443E-02 + 1.11019976E-01 9.54501182E-02 2.31700093E-01 2.07450911E-01 + 2.15356186E-01 2.22394392E-01 2.13810116E-01 1.81901038E-01 + 2.48463809E-01 2.43805766E-01 1.22183442E-01 9.90180224E-02 + 8.36406350E-02 1.01164117E-01 1.27443984E-01 1.09515354E-01 + 2.02419490E-01 2.83750147E-01 2.63993859E-01 1.41130120E-01 + 1.95076033E-01 1.47978440E-01 2.27018550E-01 2.37241060E-01 + 1.20930016E-01 1.06419705E-01 9.57345366E-02 1.36448711E-01 + 1.18134432E-01 1.08912081E-01 1.91656098E-01 2.66095221E-01 + 1.95382714E-01 1.54353693E-01 1.92242205E-01 1.59672230E-01 + 2.07156420E-01 1.94678351E-01 1.48508042E-01 1.02480039E-01 + 7.12083280E-02 1.41451344E-01 1.09635919E-01 5.36039360E-02 + 9.22147706E-02 8.27791393E-02 7.41453692E-02 1.00806676E-01 + 1.95937574E-01 1.31948918E-01 1.51212722E-01 2.72622555E-01 + 1.47884190E-01 1.01581156E-01 9.38688293E-02 1.03604436E-01 + 9.85652506E-02 6.76613227E-02 5.22466265E-02 2.48942357E-02 + 4.72456664E-02 1.45858690E-01 1.88700810E-01 4.41529229E-02 + 8.08650628E-02 2.70973325E-01 1.46155730E-01 1.13589607E-01 + 1.14426747E-01 9.59057808E-02 8.51443559E-02 5.23141213E-02 + 5.16855270E-02 4.75836545E-02 7.85420984E-02 2.01194689E-01 + 1.87077194E-01 2.56979857E-02 4.24202979E-02 2.34645754E-01 + 1.16738215E-01 1.29890203E-01 1.09367676E-01 1.16172664E-01 + 5.28260879E-02 6.36621118E-02 5.98528050E-02 9.58878323E-02 + 1.80170506E-01 2.80570745E-01 1.83347300E-01 3.43991653E-03 + 5.24444431E-02 2.66720295E-01 1.04189783E-01 1.27063334E-01 + 1.20331690E-01 8.91665891E-02 5.68458028E-02 7.59379417E-02 + 6.86514005E-02 1.69895098E-01 2.51981348E-01 2.38812283E-01 + 1.86030030E-01 3.91537044E-03 4.65200916E-02 2.37845063E-01 + 8.40228125E-02 1.42158106E-01 1.39968559E-01 1.12736776E-01 + 1.10473007E-01 1.34379581E-01 1.75420761E-01 3.21575761E-01 + 2.34784290E-01 2.21347556E-01 2.45602950E-01 7.23771472E-03 + 6.87697977E-02 1.35291889E-01 1.13331169E-01 1.55355677E-01 + 1.76960871E-01 2.09059849E-01 2.57402390E-01 2.61418134E-01 + 2.31931001E-01 2.58304745E-01 2.12053075E-01 2.57223219E-01 + 2.46916726E-01 6.45658448E-02 5.23183458E-02 1.27939180E-01 + 1.55231342E-01 1.35198325E-01 2.08152995E-01 3.00562352E-01 + 2.78660029E-01 2.72514313E-01 3.13439548E-01 2.97582924E-01 + 3.12560350E-01 2.37804383E-01 2.25229904E-01 1.05590954E-01 + 8.17408189E-02 1.47005394E-01 1.70183241E-01 1.67984352E-01 + 2.43098259E-01 2.41030261E-01 2.84972757E-01 2.88692206E-01 + 2.47573808E-01 2.31649444E-01 2.66034663E-01 2.56342024E-01 + 3.39676172E-01 1.46511093E-01 1.22215256E-01 1.36217430E-01 + 1.31814808E-01 1.50052696E-01 2.59013146E-01 3.06618214E-01 + 2.67957777E-01 2.76413113E-01 2.76830643E-01 2.41408557E-01 + 2.85242468E-01 2.16247588E-01 1.76736593E-01 1.47349924E-01 + 8.42565671E-02 1.02853626E-01 3.09519321E-01 1.83674574E-01 + 1.35003597E-01 1.07502632E-01 1.15611054E-01 9.42002758E-02 + 1.11531153E-01 1.17473818E-01 2.10606441E-01 2.13434160E-01 + 2.12268263E-01 2.25722194E-01 1.60316691E-01 1.36451781E-01 + 2.99437284E-01 2.21330479E-01 9.86640900E-02 1.04164608E-01 + 1.03796557E-01 1.20831147E-01 1.27758384E-01 1.27172306E-01 + 2.00944617E-01 2.34320238E-01 2.05497459E-01 1.79572076E-01 + 1.49427906E-01 1.17347546E-01 2.64005035E-01 3.01505327E-01 + 1.35201216E-01 9.72149447E-02 8.60995799E-02 1.20643482E-01 + 1.44646496E-01 1.21462695E-01 2.07987726E-01 2.51687199E-01 + 1.93301022E-01 1.83988050E-01 1.42799005E-01 1.24877639E-01 + 2.43279353E-01 2.81062543E-01 2.25086600E-01 1.02242514E-01 + 6.35474846E-02 8.36528763E-02 7.39594251E-02 1.05023138E-01 + 2.06264377E-01 2.61839718E-01 1.40996605E-01 1.30388245E-01 + 1.41618043E-01 1.25787020E-01 2.71980017E-01 2.35491410E-01 + 2.51983404E-01 2.02588946E-01 8.36784244E-02 1.19287789E-01 + 1.40534714E-01 1.28183097E-01 2.43710861E-01 2.61665404E-01 + 1.38894752E-01 1.17276318E-01 1.55500159E-01 1.67804644E-01 + 2.34107792E-01 2.64350146E-01 2.66100913E-01 2.47544482E-01 + 1.26115158E-01 2.01828882E-01 2.49678463E-01 2.28307441E-01 + 2.36660793E-01 2.58975178E-01 1.32100910E-01 1.25590116E-01 + 1.35812789E-01 1.37308076E-01 2.45799854E-01 2.40613595E-01 + 2.50842601E-01 2.26226211E-01 1.68793395E-01 1.85100287E-01 + 2.33551338E-01 1.76917076E-01 2.32626051E-01 1.97839215E-01 + 1.49629086E-01 1.73560932E-01 1.20214291E-01 1.10938713E-01 + 2.55577534E-01 2.52956808E-01 1.95907220E-01 1.40983403E-01 + 7.95314983E-02 2.16793954E-01 2.32387498E-01 2.18463272E-01 + 2.17499837E-01 1.98756471E-01 1.35260448E-01 2.59663373E-01 + 2.14426160E-01 1.38786241E-01 1.84494004E-01 1.92235500E-01 + 1.05894320E-01 8.13654512E-02 7.30779395E-02 1.41201317E-01 + 2.39485532E-01 3.10205877E-01 3.00396323E-01 2.78461158E-01 + 2.46537596E-01 2.30388895E-01 2.45364830E-01 2.78775424E-01 + 1.17115244E-01 1.25066221E-01 9.54893976E-02 1.47293821E-01 + 1.16251148E-01 8.13820213E-02 2.15680435E-01 2.61661589E-01 + 3.09565246E-01 2.75596470E-01 2.58175433E-01 2.10089400E-01 + 2.22554207E-01 2.56111324E-01 1.01682879E-01 1.00345008E-01 + 5.88076264E-02 1.24650918E-01 1.40516788E-01 1.02803722E-01 + 2.63758630E-01 2.51336306E-01 2.62728065E-01 2.24528357E-01 + 2.12568402E-01 1.96457982E-01 2.02766106E-01 2.45093927E-01 + 1.29992336E-01 1.57440111E-01 7.02875033E-02 1.20258883E-01 + 1.46641076E-01 9.78270620E-02 2.48647317E-01 2.62229204E-01 + 2.59368360E-01 1.92925781E-01 1.77143306E-01 1.18668385E-01 + 2.34885991E-01 2.44640499E-01 1.03748076E-01 1.30994722E-01 + 9.67876390E-02 1.33433297E-01 1.43456355E-01 1.06135927E-01 + 1.68653771E-01 2.81295896E-01 2.29184300E-01 1.31708547E-01 + 2.08642051E-01 1.06987275E-01 1.78916007E-01 2.28362590E-01 + 1.42395943E-01 1.13967717E-01 7.54282176E-02 1.30208150E-01 + 9.40988213E-02 7.83748925E-02 5.51442541E-02 2.60926902E-01 + 1.87098578E-01 1.03174344E-01 1.96668014E-01 8.31526518E-02 + 1.51762486E-01 2.26885304E-01 1.22044645E-01 9.71138328E-02 + 9.77091566E-02 9.91997644E-02 8.26890171E-02 4.26048376E-02 + 3.45900021E-02 5.81458770E-02 6.64408356E-02 1.49384931E-01 + 1.97468206E-01 5.31881563E-02 8.84426236E-02 2.35473499E-01 + 1.18798830E-01 1.13383278E-01 8.32252055E-02 8.18761513E-02 + 7.67612755E-02 5.92943281E-02 5.02469502E-02 5.69363274E-02 + 1.19222604E-01 1.94260597E-01 1.76805481E-01 1.81377865E-02 + 9.82794762E-02 2.30492204E-01 9.08292979E-02 1.45750344E-01 + 9.55033526E-02 8.50101039E-02 7.28359893E-02 1.11338593E-01 + 5.25560230E-02 7.88121969E-02 2.16443166E-01 2.38755703E-01 + 1.51117623E-01 3.82007845E-03 1.02711394E-01 2.79927939E-01 + 6.86702356E-02 1.21877633E-01 1.06757663E-01 5.47962487E-02 + 8.00260082E-02 1.02704808E-01 5.55111729E-02 1.73509613E-01 + 2.59605765E-01 2.88166940E-01 1.94682285E-01 6.68794662E-03 + 1.05155788E-01 2.08361864E-01 6.72099665E-02 1.15053952E-01 + 1.28380567E-01 6.21312633E-02 6.74700737E-02 9.25424919E-02 + 1.00313909E-01 2.51164734E-01 2.97554731E-01 2.40007266E-01 + 2.12514222E-01 5.35922870E-03 5.84720075E-02 2.02850655E-01 + 1.06700286E-01 1.36191398E-01 1.69219375E-01 7.19556510E-02 + 1.69411272E-01 2.16333941E-01 2.03345403E-01 2.78648883E-01 + 2.64973968E-01 2.81681180E-01 2.64177263E-01 2.21691169E-02 + 5.52385710E-02 1.22628503E-01 1.44413993E-01 1.67918712E-01 + 1.49849981E-01 2.02062443E-01 3.08082700E-01 3.00354689E-01 + 3.06754023E-01 2.46743798E-01 2.37223893E-01 2.52814680E-01 + 2.31919363E-01 6.22313917E-02 8.03333148E-02 1.60148606E-01 + 1.47281393E-01 1.73473954E-01 1.61366433E-01 2.42215410E-01 + 2.94429749E-01 2.92007387E-01 2.94571906E-01 2.85863757E-01 + 2.98516810E-01 2.91851670E-01 2.96861738E-01 1.22608773E-01 + 1.02985486E-01 1.33799121E-01 1.52138352E-01 1.67231888E-01 + 1.80957720E-01 2.17310429E-01 2.71508634E-01 3.00614536E-01 + 3.31429303E-01 2.32561991E-01 2.97910810E-01 2.27970585E-01 + 2.72813171E-01 1.42933726E-01 1.12260424E-01 9.84655842E-02 + 1.77061915E-01 1.40352532E-01 1.27136871E-01 1.08984768E-01 + 1.18192121E-01 1.44766495E-01 1.30221322E-01 9.25026163E-02 + 1.66635379E-01 2.06028894E-01 2.27772370E-01 2.36065194E-01 + 2.02674940E-01 1.38114989E-01 2.66493618E-01 2.09306061E-01 + 7.99796432E-02 9.41825435E-02 9.89373252E-02 1.33013397E-01 + 1.54257923E-01 8.85632634E-02 1.82656810E-01 2.07433596E-01 + 2.37271771E-01 2.19922647E-01 2.12369129E-01 1.39478564E-01 + 2.99407452E-01 2.15433896E-01 1.51576340E-01 1.31872490E-01 + 9.80624482E-02 1.40467316E-01 1.44092485E-01 8.68685097E-02 + 1.64832279E-01 2.12954029E-01 1.76662251E-01 1.78052038E-01 + 1.86615303E-01 1.78335458E-01 2.96365052E-01 2.37037182E-01 + 2.15336293E-01 1.33724689E-01 1.03747696E-01 1.04846686E-01 + 1.34692490E-01 1.08555436E-01 1.51345283E-01 2.25720868E-01 + 1.84811637E-01 1.43335700E-01 1.68098405E-01 1.34366184E-01 + 2.32346386E-01 2.90126354E-01 2.77061015E-01 1.64698035E-01 + 9.26753134E-02 9.47935730E-02 1.02038302E-01 1.41612619E-01 + 1.85714900E-01 2.82850653E-01 1.78143531E-01 1.09058231E-01 + 1.52544335E-01 1.17253132E-01 2.35552058E-01 2.46685654E-01 + 2.50747621E-01 2.53788352E-01 1.37275293E-01 1.98297486E-01 + 2.53710270E-01 2.14557990E-01 2.25451261E-01 2.52081335E-01 + 1.54917896E-01 1.26314387E-01 1.51941478E-01 1.16498321E-01 + 2.80574471E-01 2.49337956E-01 2.24776611E-01 1.72703236E-01 + 1.65538043E-01 2.07113519E-01 2.20140636E-01 2.17115581E-01 + 2.17002019E-01 2.28940114E-01 1.17943220E-01 1.20852679E-01 + 1.56556278E-01 1.00070193E-01 2.09908530E-01 2.71789581E-01 + 2.61118323E-01 2.19293401E-01 1.32594392E-01 2.42219552E-01 + 2.27656648E-01 2.18576014E-01 2.44075730E-01 1.99547514E-01 + 1.30972922E-01 2.03684777E-01 2.31227383E-01 1.15021236E-01 + 1.76581785E-01 1.57175198E-01 1.50461331E-01 1.36352167E-01 + 1.09028123E-01 2.13742822E-01 2.54932255E-01 2.96871811E-01 + 2.91093051E-01 2.92403460E-01 2.63957620E-01 2.73269832E-01 + 2.92037517E-01 2.32808664E-01 1.89966008E-01 2.19220504E-01 + 1.80991963E-01 1.52504578E-01 1.30141094E-01 6.28781542E-02 + 2.93084383E-01 2.71067679E-01 2.83126175E-01 2.89468437E-01 + 2.88575381E-01 2.31893748E-01 2.14763880E-01 2.36820027E-01 + 7.99237564E-02 1.48088425E-01 8.47142041E-02 1.60352454E-01 + 1.60311922E-01 6.35456592E-02 2.54045665E-01 2.69834042E-01 + 2.86328614E-01 2.46788710E-01 2.28123426E-01 2.18608901E-01 + 2.11989939E-01 2.43570432E-01 9.67961624E-02 1.72888905E-01 + 9.76897255E-02 1.63468108E-01 1.52958766E-01 6.04896545E-02 + 1.48532823E-01 2.78450102E-01 2.86088198E-01 2.20153570E-01 + 2.01247662E-01 1.31926373E-01 1.97585493E-01 2.23170653E-01 + 9.50253829E-02 1.26782387E-01 9.47333798E-02 1.36362582E-01 + 1.48818180E-01 9.26870927E-02 1.77467763E-01 2.94451892E-01 + 2.84896046E-01 1.24842077E-01 2.21490785E-01 1.16226748E-01 + 2.20655456E-01 2.45286092E-01 1.32653624E-01 1.12251192E-01 + 5.52328750E-02 1.03887029E-01 9.58825797E-02 7.10868761E-02 + 8.31590891E-02 2.58551151E-01 2.39888728E-01 9.17599276E-02 + 1.89824373E-01 8.66813138E-02 2.15450630E-01 2.72860467E-01 + 1.25523850E-01 1.21444941E-01 3.53439748E-02 5.76872304E-02 + 9.16990042E-02 6.65336922E-02 1.00246519E-02 1.35313660E-01 + 1.51303455E-01 1.25310138E-01 2.39889860E-01 5.57974987E-02 + 1.69643357E-01 2.45454490E-01 1.20035760E-01 1.50550291E-01 + 5.27516566E-02 3.94015871E-02 8.58152583E-02 7.12258965E-02 + 3.12128719E-02 3.98515612E-02 1.65993184E-01 1.96176931E-01 + 1.77873760E-01 2.10749879E-02 1.28758401E-01 2.30053321E-01 + 5.72860502E-02 1.32417575E-01 4.64477129E-02 1.18564181E-02 + 1.15049943E-01 1.30025223E-01 4.44482788E-02 6.64652586E-02 + 2.83610046E-01 2.84177274E-01 2.03753322E-01 4.82154964E-03 + 1.65135920E-01 2.66438365E-01 7.12175220E-02 1.18984431E-01 + 8.65392610E-02 3.57047953E-02 1.00495271E-01 8.72878656E-02 + 5.12430891E-02 1.68168813E-01 2.86660492E-01 2.49942705E-01 + 1.73954278E-01 1.97085869E-02 1.51919335E-01 1.95891991E-01 + 9.78513807E-02 1.18006513E-01 1.38507366E-01 6.23653904E-02 + 9.99086648E-02 6.43127784E-02 8.36864635E-02 2.04443455E-01 + 3.04924011E-01 2.83255875E-01 2.24432528E-01 2.73439176E-02 + 1.28592134E-01 1.92714378E-01 1.12750724E-01 1.47903845E-01 + 1.55023307E-01 7.07796663E-02 1.42124504E-01 1.00847639E-01 + 1.54752806E-01 2.81664044E-01 3.27490121E-01 2.96866030E-01 + 2.32692316E-01 5.94615340E-02 8.48988816E-02 1.54396519E-01 + 1.30552381E-01 1.57039404E-01 1.40950307E-01 1.41059890E-01 + 2.06279084E-01 2.51292080E-01 2.28563726E-01 2.51448154E-01 + 2.03870490E-01 2.25645155E-01 2.27006540E-01 6.62664101E-02 + 8.53061825E-02 1.50159553E-01 1.46316946E-01 1.61299199E-01 + 1.32448554E-01 1.67850837E-01 2.92622030E-01 2.57101715E-01 + 2.57600546E-01 2.65648901E-01 2.52551138E-01 2.36095086E-01 + 2.71575332E-01 8.88624489E-02 8.77567604E-02 1.31453440E-01 + 1.28338486E-01 1.53366983E-01 1.32067636E-01 2.00268283E-01 + 2.58446425E-01 2.40171939E-01 2.81334609E-01 2.33789146E-01 + 2.68485755E-01 2.45579734E-01 2.51744688E-01 1.51859015E-01 + 1.11610807E-01 1.03461258E-01 +endtag +tag parameter +char name "EQLNUM" +array char codeNames 2 + "" + "" +array int codeValues 2 + 1 2 +array int data 6762 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 +endtag +tag parameter +char name "FIPNUM" +array char codeNames 2 + "" + "" +array int codeValues 2 + 1 2 +array int data 6762 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 2 2 + 2 2 2 2 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 +endtag +tag eof +endtag diff --git a/ThirdParty/Ert/lib/ecl/ecl_smspec.cpp b/ThirdParty/Ert/lib/ecl/ecl_smspec.cpp index 7136067d46..4543d46c06 100644 --- a/ThirdParty/Ert/lib/ecl/ecl_smspec.cpp +++ b/ThirdParty/Ert/lib/ecl/ecl_smspec.cpp @@ -868,7 +868,12 @@ bool ecl_smspec_equal(const ecl_smspec_type * self, static void ecl_smspec_load_restart( ecl_smspec_type * ecl_smspec , const ecl_file_type * header ) { if (ecl_file_has_kw( header , RESTART_KW )) { const ecl_kw_type * restart_kw = ecl_file_iget_named_kw(header, RESTART_KW , 0); - char tmp_base[73]; /* To accomodate a maximum of 9 items which consist of 8 characters each. */ + + /* Allocate 17 words of 8 characters each, add 1 for zero terminated string. + * https://github.com/equinor/ecl/issues/872 + */ + char tmp_base[137]; + char * restart_base; int i; tmp_base[0] = '\0'; @@ -877,7 +882,6 @@ static void ecl_smspec_load_restart( ecl_smspec_type * ecl_smspec , const ecl_fi restart_base = util_alloc_strip_copy( tmp_base ); if (strlen(restart_base)) { /* We ignore the empty ones. */ - char * smspec_header; /* The conditional block here is to support the following situation: @@ -899,18 +903,23 @@ static void ecl_smspec_load_restart( ecl_smspec_type * ecl_smspec , const ecl_fi } #endif - std::string path = ecl::util::path::dirname( ecl_smspec->header_file ); - smspec_header = ecl_util_alloc_exfilename( path.c_str() , restart_base , ECL_SUMMARY_HEADER_FILE , ecl_smspec->formatted , 0); - if (smspec_header) { - if (!util_same_file(smspec_header , ecl_smspec->header_file.c_str())) /* Restart from the current case is ignored. */ { - if (util_is_abs_path(restart_base)) - ecl_smspec->restart_case = restart_base; - else { - char * tmp_path = util_alloc_filename( path.c_str() , restart_base , NULL ); - char * abs_path = util_alloc_abs_path(tmp_path); - ecl_smspec->restart_case = abs_path; - free( abs_path ); - free( tmp_path ); + if (util_is_abs_path(restart_base)) { + ecl_smspec->restart_case = restart_base; + } + else { + std::string path = ecl::util::path::dirname(ecl_smspec->header_file); + char* smspec_header = ecl_util_alloc_exfilename( path.c_str() , restart_base , ECL_SUMMARY_HEADER_FILE , ecl_smspec->formatted , 0); + if (smspec_header) { + if (!util_same_file(smspec_header , ecl_smspec->header_file.c_str())) /* Restart from the current case is ignored. */ { + if (util_is_abs_path(restart_base)) + ecl_smspec->restart_case = restart_base; + else { + char * tmp_path = util_alloc_filename( path.c_str() , restart_base , NULL ); + char * abs_path = util_alloc_abs_path(tmp_path); + ecl_smspec->restart_case = abs_path; + free( abs_path ); + free( tmp_path ); + } } } free( smspec_header ); diff --git a/ThirdParty/Ert/lib/ecl/ecl_util.cpp b/ThirdParty/Ert/lib/ecl/ecl_util.cpp index f0ddca45dd..d8efe8c7b1 100644 --- a/ThirdParty/Ert/lib/ecl/ecl_util.cpp +++ b/ThirdParty/Ert/lib/ecl/ecl_util.cpp @@ -355,7 +355,11 @@ static bool valid_base(const char * input_base, bool * upper_case) { if (upper_case) *upper_case = upper; - return !(lower && upper); + + // Disable checking of mixed upper and lower case + // https://github.com/OPM/ResInsight/issues/9529 + return true; + } diff --git a/ThirdParty/Ert/lib/util/util.c b/ThirdParty/Ert/lib/util/util.c index 84048565e2..7eefe13f20 100644 --- a/ThirdParty/Ert/lib/util/util.c +++ b/ThirdParty/Ert/lib/util/util.c @@ -4152,8 +4152,6 @@ FILE * util_fopen__(const char * filename , const char * mode) { FILE * util_fopen(const char * filename , const char * mode) { FILE * stream = util_fopen__(filename , mode); - if (stream == NULL) - util_abort("%s: failed to open:%s with mode:\'%s\' - error:%s(%d) \n",__func__ , filename , mode , strerror(errno) , errno); return stream; } diff --git a/ThirdParty/custom-opm-common/custom-opm-parser-tests/TestData/mysubfolder/test_wseglink_subfolder.DATA b/ThirdParty/custom-opm-common/custom-opm-parser-tests/TestData/mysubfolder/test_wseglink_subfolder.DATA new file mode 100644 index 0000000000..9f11a4465c --- /dev/null +++ b/ThirdParty/custom-opm-common/custom-opm-parser-tests/TestData/mysubfolder/test_wseglink_subfolder.DATA @@ -0,0 +1,15 @@ +-- WSEGLINK +-- well-name segment-no-1 segment-no-2 +-- If item #2 and #3 are undefined, all segment links for the well are removed. +-- If either item #2 or #3 is undefined, all segment links are removed for the well and segment given. +-- + + +WSEGLINK + PROD_N 20 30 / +/ + +WSEGLINK + PROD_M 20 / +/ + diff --git a/ThirdParty/custom-opm-common/custom-opm-parser-tests/TestData/test_wseglink.DATA b/ThirdParty/custom-opm-common/custom-opm-parser-tests/TestData/test_wseglink.DATA index de5bc36cd1..c3c055c9c3 100644 --- a/ThirdParty/custom-opm-common/custom-opm-parser-tests/TestData/test_wseglink.DATA +++ b/ThirdParty/custom-opm-common/custom-opm-parser-tests/TestData/test_wseglink.DATA @@ -4,6 +4,11 @@ -- If either item #2 or #3 is undefined, all segment links are removed for the well and segment given. -- +PATHS + 'E' 'mysubfolder' / +/ + + WSEGLINK PROD 22 30 / PROD2 25 37 / @@ -20,3 +25,6 @@ WSEGLINK WSEGLINK PROD_A / / + +INCLUDE + '$E/test_wseglink_subfolder.DATA ' / diff --git a/ThirdParty/custom-opm-common/custom-opm-parser-tests/opm-parser-BasicTest.cpp b/ThirdParty/custom-opm-common/custom-opm-parser-tests/opm-parser-BasicTest.cpp index 22e05ad6c1..e0fcd9517d 100644 --- a/ThirdParty/custom-opm-common/custom-opm-parser-tests/opm-parser-BasicTest.cpp +++ b/ThirdParty/custom-opm-common/custom-opm-parser-tests/opm-parser-BasicTest.cpp @@ -11,6 +11,9 @@ #include #include "opm/input/eclipse/Parser/ParserKeywords/W.hpp" +#include "opm/input/eclipse/Parser/ParserKeywords/I.hpp" +#include "opm/input/eclipse/Parser/ParserKeywords/S.hpp" +#include "opm/input/eclipse/Parser/ParserKeywords/P.hpp" #include "OpmTestDataDirectory.h" @@ -87,22 +90,24 @@ TEST(OpmParserTest, ReadFromFile) TEST(OpmParserTest, ReadAndParseWSEGLINK) { Parser parser(false); - const ::Opm::ParserKeywords::WSEGLINK kw1; - parser.addParserKeyword(kw1); + const Opm::ParserKeywords::WSEGLINK kw1; + const Opm::ParserKeywords::INCLUDE kw2; + const Opm::ParserKeywords::PATHS kw3; - std::stringstream ss; - ss << TEST_DATA_DIR << "/test_wseglink.DATA"; - std::string testFile = ss.str(); + parser.addParserKeyword(kw1); + parser.addParserKeyword(kw2); + parser.addParserKeyword(kw3); - auto deck = parser.parseFile(testFile); + std::string testFilePath = std::string(TEST_DATA_DIR) + "/test_wseglink.DATA"; + + Opm::ParseContext parseContext(Opm::InputError::Action::WARN); + auto deck = parser.parseFile(testFilePath, parseContext); std::string myKeyword = "WSEGLINK"; auto keywordList = deck.getKeywordList(myKeyword); for (auto kw : keywordList) { - auto name = kw->name(); - for (size_t i = 0; i < kw->size(); i++) { auto deckRecord = kw->getRecord(i); diff --git a/ThirdParty/custom-opm-common/opm-common b/ThirdParty/custom-opm-common/opm-common index 212cc35c43..aa8e9c1f84 160000 --- a/ThirdParty/custom-opm-common/opm-common +++ b/ThirdParty/custom-opm-common/opm-common @@ -1 +1 @@ -Subproject commit 212cc35c4354e501570b4b07577d6f224418849b +Subproject commit aa8e9c1f84a8ccfe829c3a89295c442e95bb2a09 diff --git a/ThirdParty/qtadvanceddocking b/ThirdParty/qtadvanceddocking index b7849e37e6..3ab6d7fc0f 160000 --- a/ThirdParty/qtadvanceddocking +++ b/ThirdParty/qtadvanceddocking @@ -1 +1 @@ -Subproject commit b7849e37e6cb18233a682881ce96e12510c118f2 +Subproject commit 3ab6d7fc0f4062ad7a146e694c6e29e9e4125217 diff --git a/ThirdParty/roffcpp b/ThirdParty/roffcpp new file mode 160000 index 0000000000..17613c7b57 --- /dev/null +++ b/ThirdParty/roffcpp @@ -0,0 +1 @@ +Subproject commit 17613c7b57788d8708af8fe585194654531be3a3