pax_global_header 0000666 0000000 0000000 00000000064 15032632755 0014522 g ustar 00root root 0000000 0000000 52 comment=86a07edb946eda33c16f4e36aaf37c0c4001a20e
MintPy-1.6.2/ 0000775 0000000 0000000 00000000000 15032632755 0012750 5 ustar 00root root 0000000 0000000 MintPy-1.6.2/.circleci/ 0000775 0000000 0000000 00000000000 15032632755 0014603 5 ustar 00root root 0000000 0000000 MintPy-1.6.2/.circleci/config.yml 0000664 0000000 0000000 00000006514 15032632755 0016601 0 ustar 00root root 0000000 0000000 version: 2.1
jobs:
unit-n-workflow-tests:
docker:
- image: cimg/base:current
environment:
CONDA_PREFIX: /root/tools/miniforge
MINTPY_HOME: /root/tools/MintPy
user: root
working_directory: /root/tools/MintPy
resource_class: large
steps:
- checkout
- run:
name: Setting Up Environment with Miniforge
command: |
apt update
apt-get update --yes && apt-get upgrade --yes
apt-get install --yes git wget
# install miniforge (https://github.com/conda-forge/miniforge?tab=readme-ov-file#as-part-of-a-ci-pipeline)
mkdir -p ${HOME}/tools
cd ${HOME}/tools
wget -O Miniforge3.sh "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh"
bash Miniforge3.sh -b -p ${HOME}/tools/miniforge
source "${HOME}/tools/miniforge/etc/profile.d/conda.sh"
source "${HOME}/tools/miniforge/etc/profile.d/mamba.sh"
# modify/export env var PATH to BASH_ENV to be shared across run steps
echo 'export PATH=${CONDA_PREFIX}/bin:${PATH}' >> ${BASH_ENV}
- run:
name: Installing MintPy
no_output_timeout: 30m
command: |
export PYTHONUNBUFFERED=1
# install dependencies and source code
mamba install --verbose --yes --file ${MINTPY_HOME}/requirements.txt gdal libgdal-netcdf
python -m pip install ${MINTPY_HOME}
# test installation
smallbaselineApp.py -h
tropo_pyaps3.py -h
solid_earth_tides.py -h
- run:
name: Unit Test
command: |
${MINTPY_HOME}/tests/objects/euler_pole.py
${MINTPY_HOME}/tests/objects/ionex.py
${MINTPY_HOME}/tests/asc_desc2horz_vert.py
${MINTPY_HOME}/tests/dem_error.py
- run:
name: Integration Test 1/6 - FernandinaSenDT128 (ISCE2/topsStack)
command: |
mkdir -p ${HOME}/data
${MINTPY_HOME}/tests/smallbaselineApp.py --dir ${HOME}/data --dset FernandinaSenDT128
- run:
name: Integration Test 2/6 - SanFranSenDT42 (ARIA)
command: |
mkdir -p ${HOME}/data
${MINTPY_HOME}/tests/smallbaselineApp.py --dir ${HOME}/data --dset SanFranSenDT42
- run:
name: Integration Test 3/6 - RidgecrestSenDT71 (HyP3)
command: |
mkdir -p ${HOME}/data
${MINTPY_HOME}/tests/smallbaselineApp.py --dir ${HOME}/data --dset RidgecrestSenDT71
- run:
name: Integration Test 4/6 - SanFranBaySenD42 (GMTSAR)
command: |
mkdir -p ${HOME}/data
${MINTPY_HOME}/tests/smallbaselineApp.py --dir ${HOME}/data --dset SanFranBaySenD42
- run:
name: Integration Test 5/6 - WellsEnvD2T399 (Gamma)
command: |
mkdir -p ${HOME}/data
${MINTPY_HOME}/tests/smallbaselineApp.py --dir ${HOME}/data --dset WellsEnvD2T399
- run:
name: Integration Test 6/6 - WCapeSenAT29 (SNAP)
command: |
mkdir -p ${HOME}/data
${MINTPY_HOME}/tests/smallbaselineApp.py --dir ${HOME}/data --dset WCapeSenAT29
workflows:
version: 2
unit-n-workflow-tests:
jobs:
- unit-n-workflow-tests
MintPy-1.6.2/.github/ 0000775 0000000 0000000 00000000000 15032632755 0014310 5 ustar 00root root 0000000 0000000 MintPy-1.6.2/.github/ISSUE_TEMPLATE/ 0000775 0000000 0000000 00000000000 15032632755 0016473 5 ustar 00root root 0000000 0000000 MintPy-1.6.2/.github/ISSUE_TEMPLATE/bug_report.md 0000664 0000000 0000000 00000001653 15032632755 0021172 0 ustar 00root root 0000000 0000000 ---
name: Bug report
about: Report a problem/bug to help us improve
title: ''
labels: ''
assignees: ''
---
**Description of the problem**
**Full script that generated the error**
```
PASTE CODE HERE
```
**Full error message**
```
PASTE ERROR MESSAGE HERE
```
**System information**
* Operating system:
* Python environment:
* MintPy version:
* InSAR processor/product:
* Your custom / default template file (if the bug is related to a specific dataset):
MintPy-1.6.2/.github/ISSUE_TEMPLATE/feature_request.md 0000664 0000000 0000000 00000002254 15032632755 0022223 0 ustar 00root root 0000000 0000000 ---
name: Feature request
about: Request the addition of a new feature/functionality
title: ''
labels: ''
assignees: ''
---
**Description of the desired feature**
**Is your feature request related to a problem? Please describe**
**Describe the solution you'd like**
**Describe alternatives you have considered**
**Additional context**
**Are you willing to help implement and maintain this feature?**
- [ ] Yes
- [ ] No
MintPy-1.6.2/.github/PULL_REQUEST_TEMPLATE.md 0000664 0000000 0000000 00000001154 15032632755 0020112 0 ustar 00root root 0000000 0000000 **Description of proposed changes**
**Reminders**
- [ ] Fix #xxxx
- [ ] Pass Pre-commit check (green)
- [ ] Pass Codacy code review (green)
- [ ] Pass Circle CI test (green)
- [ ] Make sure that your code follows our style. Use the other functions/files as a basis.
- [ ] If modifying functionality, describe changes to function behavior and arguments in a comment below the function declaration.
- [ ] If adding new functionality, add a detailed description to the documentation and/or an example.
MintPy-1.6.2/.github/config.yml 0000664 0000000 0000000 00000002773 15032632755 0016311 0 ustar 00root root 0000000 0000000 # Configuration for welcome - https://github.com/behaviorbot/welcome
# Configuration for new-issue-welcome - https://github.com/behaviorbot/new-issue-welcome
# Comment to be posted to on first time issues
newIssueWelcomeComment: >
👋 Thanks for opening your first issue here! Please filled out the template with as much details as possible. We appreciate that you took the time to contribute!
Make sure you read our [contributing guidelines](https://github.com/insarlab/MintPy/blob/master/docs/CONTRIBUTING.md).
# Configuration for new-pr-welcome - https://github.com/behaviorbot/new-pr-welcome
# Comment to be posted to on PRs from first time contributors in your repository
newPRWelcomeComment: >
💖 Thanks for opening this pull request! Please check out our [contributing guidelines](https://github.com/insarlab/MintPy/blob/master/docs/CONTRIBUTING.md). 💖
Keep in mind that all new features should be documented. It helps to write the comments next to the code or below your functions describing **all** arguments, and return types before writing the code. This will help you think about your code design and usually results in better code.
# Configuration for first-pr-merge - https://github.com/behaviorbot/first-pr-merge
# Comment to be posted to on pull requests merged by a first time user
firstPRMergeComment: >
🎉 🎉 🎉 Congrats on merging your first pull request! We here at behaviorbot are proud of you! 🎉 🎉 🎉
# It is recommend to include as many gifs and emojis as possible
MintPy-1.6.2/.github/dependabot.yml 0000664 0000000 0000000 00000001241 15032632755 0017136 0 ustar 00root root 0000000 0000000 # To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "github-actions" # see doc for possible values
directory: "/" # location of package manifests
schedule:
interval: "weekly"
ignore:
# ignore patch updates for all dependencies
- dependency-name: "*"
update-types: ["version-update:semver-patch"]
MintPy-1.6.2/.github/release.yml 0000664 0000000 0000000 00000000143 15032632755 0016451 0 ustar 00root root 0000000 0000000 # .github/release.yml
changelog:
exclude:
authors:
- dependabot
- pre-commit-ci
MintPy-1.6.2/.github/workflows/ 0000775 0000000 0000000 00000000000 15032632755 0016345 5 ustar 00root root 0000000 0000000 MintPy-1.6.2/.github/workflows/build-docker.yml 0000664 0000000 0000000 00000003753 15032632755 0021444 0 ustar 00root root 0000000 0000000 name: build docker image
on:
push:
branches:
- main
tags:
- v*
pull_request:
branches:
- main
jobs:
dockerize:
name: Build Docker image and push to GitHub Container Registry
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set environment variables for docker build
run: |
# Lowercase repo for Github Container Registry
echo "REPO=${GITHUB_REPOSITORY,,}" >> ${GITHUB_ENV}
# Ensure tags are checked out
git fetch origin +refs/tags/*:refs/tags/*
# Version number from tag
echo "MINTPY_VERSION=$(git describe --tags)" >> $GITHUB_ENV
- name: Build, tag, and push image to Github Container Registry
uses: docker/build-push-action@v6
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
tags: |
ghcr.io/${{ env.REPO }}:${{ env.MINTPY_VERSION }}
labels: |
org.opencontainers.image.created=${{ env.CI_JOB_TIMESTAMP }}
org.opencontainers.image.version=${{ env.MINTPY_VERSION }}
org.opencontainers.image.revision=${{ github.sha }}
- name: Add develop tag
if: github.ref == 'refs/heads/main'
uses: akhilerm/tag-push-action@v2.2.0
with:
src: ghcr.io/${{ env.REPO }}:${{ env.MINTPY_VERSION }}
dst: ghcr.io/${{ env.REPO }}:develop
- name: Add latest tag
if: startsWith(github.ref, 'refs/tags/v')
uses: akhilerm/tag-push-action@v2.2.0
with:
src: ghcr.io/${{ env.REPO }}:${{ env.MINTPY_VERSION }}
dst: ghcr.io/${{ env.REPO }}:latest
MintPy-1.6.2/.github/workflows/build-n-publish-to-pypi.yml 0000664 0000000 0000000 00000004070 15032632755 0023466 0 ustar 00root root 0000000 0000000 # link: https://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/
name: publish 📦 to PyPI
# Build on every branch push, tag push, and pull request change
on:
push:
branches:
- main
tags:
- v*
pull_request:
jobs:
build-sdist-n-wheel:
name: Build 🐍 distributions and wheels 📦
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Python 3.10
uses: actions/setup-python@v5
with:
python-version: "3.10"
- name: Install pypa/build
run: >-
python -m
pip install
build
--user
- name: Build a source tarball and a binary wheel
run: >-
python -m
build
--sdist
--wheel
--outdir dist/
.
- uses: actions/upload-artifact@v4
with:
path: |
dist/*.tar.gz
dist/*.whl
upload-to-pypi:
name: Upload 📦 to (Test) PyPI
needs: [build-sdist-n-wheel]
runs-on: ubuntu-latest
if: github.repository_owner == 'insarlab' && github.event_name == 'push'
steps:
- uses: actions/download-artifact@v4
with:
# unpacks default artifact into dist/
# if `name: artifact` is omitted, the action will create extra parent dir
name: artifact
path: dist
- name: Publish developed version 📦 to Test PyPI
if: startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main'
uses: pypa/gh-action-pypi-publish@release/v1
with:
password: ${{ secrets.TEST_PYPI_API_TOKEN }}
repository_url: https://test.pypi.org/legacy/
skip_existing: false
verbose: true
- name: Publish released version 📦 to PyPI
if: startsWith(github.ref, 'refs/tags/v')
uses: pypa/gh-action-pypi-publish@release/v1
with:
password: ${{ secrets.PYPI_API_TOKEN }}
verbose: true
MintPy-1.6.2/.gitignore 0000664 0000000 0000000 00000003466 15032632755 0014751 0 ustar 00root root 0000000 0000000 *.DS_Store
*.pyc
*.idea/*
isce.log
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
fix_typos/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
.python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
MintPy-1.6.2/.pre-commit-config.yaml 0000664 0000000 0000000 00000003525 15032632755 0017236 0 ustar 00root root 0000000 0000000 # See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
ci:
autofix_prs: false
fail_fast: true
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: "v5.0.0"
hooks:
- id: check-added-large-files
args: ['--maxkb=20']
exclude_types: [image]
exclude: src/mintpy/data/plate_boundary
- id: check-ast
- id: check-case-conflict
- id: check-docstring-first
- id: check-merge-conflict
- id: check-json
- id: check-toml
- id: check-yaml
- id: debug-statements
- id: end-of-file-fixer
- id: mixed-line-ending
- id: trailing-whitespace
exclude: tests/data/
- repo: https://github.com/PyCQA/isort
rev: "6.0.1"
hooks:
- id: isort
name: sort imports
args: ['--multi-line=VERTICAL_HANGING_INDENT',
'--trailing-comma',
'--combine-as']
- repo: https://github.com/asottile/pyupgrade
rev: "v3.20.0"
hooks:
- id: pyupgrade
name: modernize python
args: ['--py36-plus']
############################################################
#- repo: https://github.com/psf/black
# rev: "22.6.0"
# hooks:
# - id: black
#- repo: https://github.com/PyCQA/flake8
# rev: "5.0.4"
# hooks:
# - id: flake8
#- repo: https://github.com/pre-commit/mirrors-mypy
# rev: "v0.971"
# hooks:
# - id: mypy
#- repo: https://github.com/hadialqattan/pycln
# rev: "v2.1.1"
# hooks:
# - id: pycln
#- repo: https://github.com/PyCQA/pydocstyle
# rev: "6.1.1"
# hooks:
# - id: pydocstyle
# additional_dependencies: [toml]
# exclude: test
#- repo: https://github.com/sirosen/texthooks
# rev: "0.3.1"
# hooks:
# - id: fix-ligatures
# - id: fix-smartquotes
MintPy-1.6.2/.readthedocs.yaml 0000664 0000000 0000000 00000001412 15032632755 0016175 0 ustar 00root root 0000000 0000000 # .readthedocs.yml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
# Required
version: 2
# Set the version of Python and other tools you might need
build:
os: ubuntu-22.04
tools:
python: "3.11"
# Build documentation in the docs/ directory with Sphinx
#sphinx:
# configuration: docs/conf.py
# Build documentation with MkDocs
mkdocs:
configuration: mkdocs.yml
# Optionally build your docs in additional formats such as PDF and ePub
formats: all
# Optionally set the version of Python and requirements required to build your docs
# conda method does not work because of the "command killed due to excessive memory consumption" error
#python:
# install:
# - requirements: docs/requirements4rtd.txt
MintPy-1.6.2/Dockerfile 0000664 0000000 0000000 00000003375 15032632755 0014752 0 ustar 00root root 0000000 0000000 # Builds in ~ 5 min and is ~ 3 GB on a linux laptop
FROM mambaorg/micromamba:0.24.0
# Label image following opencontainers image-spec annotations recommendation:
# https://github.com/opencontainers/image-spec/blob/main/annotations.md
LABEL org.opencontainers.image.description="Container for InSAR time series analysis with MintPy"
LABEL org.opencontainers.image.authors="Forrest Williams , Joseph H Kennedy , Andre Theron "
LABEL org.opencontainers.image.url="https://github.com/insarlab/MintPy"
LABEL org.opencontainers.image.source="https://github.com/insarlab/MintPy"
LABEL org.opencontainers.image.documentation="https://mintpy.readthedocs.io/en/latest/"
LABEL org.opencontainers.image.licenses="GPL-3.0-or-later"
# Dynamic labels to define at build time via `docker build --label`
# LABEL org.opencontainers.image.created=""
# LABEL org.opencontainers.image.version=""
# LABEL org.opencontainers.image.revision=""
USER root
ARG DEBIAN_FRONTEND=noninteractive
ENV PYTHONDONTWRITEBYTECODE=true
RUN apt-get update && \
apt-get install -y --no-install-recommends git vim wget && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
USER mambauser
WORKDIR /home/mambauser
ENV PATH=/opt/conda/bin:${PATH}
ARG MINTPY_HOME=/home/mambauser/tools/MintPy
COPY --chown=mambauser:mambauser . ${MINTPY_HOME}/
ARG PYTHON_VERSION="3.9"
RUN micromamba install -y -n base -c conda-forge python=${PYTHON_VERSION} \
jupyterlab ipympl gdal">=3" isce2 -f ${MINTPY_HOME}/requirements.txt && \
python -m pip install --no-cache-dir ${MINTPY_HOME} && \
micromamba clean --all --yes
# Jupyter setup
COPY --chown=mambauser:mambauser scripts/jupyter_notebook_config.py /home/mambauser/.jupyter/
EXPOSE 8888
MintPy-1.6.2/LICENSE 0000664 0000000 0000000 00000106074 15032632755 0013765 0 ustar 00root root 0000000 0000000 Copyright (c) 2016, Zhang Yunjun and Heresh Fattahi
Copyright (c) 2013, Heresh Fattahi
This 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.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
A copy of the GNU General Public License is included below.
For further information, see .
---------------------------------------------------------------------------
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc.
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
Copyright (C)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
Copyright (C)
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
.
MintPy-1.6.2/MANIFEST.in 0000664 0000000 0000000 00000000130 15032632755 0014500 0 ustar 00root root 0000000 0000000 # Include the README
include docs/README.md
# Include the license file
include LICENSE
MintPy-1.6.2/docs/ 0000775 0000000 0000000 00000000000 15032632755 0013700 5 ustar 00root root 0000000 0000000 MintPy-1.6.2/docs/CODE_OF_CONDUCT.md 0000664 0000000 0000000 00000006504 15032632755 0016504 0 ustar 00root root 0000000 0000000 # Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at `yunjunz at outlook dot com` or `hersh.fattahi at gmail dot com`. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq
MintPy-1.6.2/docs/CONTRIBUTING.md 0000664 0000000 0000000 00000016536 15032632755 0016144 0 ustar 00root root 0000000 0000000 # Contributing Guidelines
This document is inspired by similar instructions from numpy, GMT, ISCE, gdal and jupyterhub. If you're reading this section, you're probably interested in contributing to MintPy. Welcome and thanks for your interest in contributing!
There are several ways to contribute to the MintPy project:
* Writing or proofreading documentation (including tutorials and examples in jupyter-notebooks)
* Submitting bug reports or feature requests on [GitHub issue](https://github.com/insarlab/MintPy/issues)
* Suggesting or implementing tests
* Fixing typos or bugs in code
* Writing code for everyone to use
* Giving feedback about the projects (including giving feedback about the contribution process)
If you get stuck at any point you can open an [issue on GitHub](https://github.com/insarlab/MintPy/issues) or comment on any open issue or pull request or contact us on the [user forum](https://groups.google.com/forum/#!forum/mintpy).
For more information on contributing to open source projects, [GitHub's own guide](https://guides.github.com/activities/contributing-to-open-source/)
is a great starting point if you are new to version control.
## Development process ##
#### 1. If you are a first-time contributor: ####
+ Go to https://github.com/insarlab/MintPy.git and click "fork" button to create your own copy of the project.
+ Clone the project to your local computer and add the upstream repository:
```
git clone https://github.com/your_user_name/MintPy.git
cd MintPy
git remote add upstream https://github.com/insarlab/MintPy.git
```
+ Now, `git remote -v` will show two remote repositories named:
- `upstream`, which refers to the `insarlab` repository
- `origin`, which refers to your personal fork
+ Setting up [`pre-commit`](https://pre-commit.com/) within `MintPy` directory:
- Run `pre-commit install` to set up the git hook scripts, so that `pre-commit` will run automatically on `git commit`. If the `No .pre-commit-config.yaml file was found` error occurs, update your local MintPy to the latest upstream version to have this config file.
#### 2. Develop your contribution: ####
+ **Open an [issue](https://github.com/insarlab/MintPy/issues) first** if you plan to introduce a new feature or to change functionality, we may have easier ways to help you implement it. If there is already an issue that matches your idea, leave a comment there instead to let us know what you plan to do. For bug fixes, documentation updates, etc., this is generally not necessary.
+ Pull the latest changes from upstream:
```
git checkout main
git pull upstream/main
```
+ Create a branch for the feature you want to work on. Since the branch name will appear in the merge message, use a sensible name such as 'seasonal_fitting':
```
git checkout -b seasonal_fitting
```
+ Work on your idea, run tests, and commit locally (`git add` and `git commit`) and/or to your fork on GitHub as you progress (`git push` in the command line or [GitHub Desktop](https://desktop.github.com/) with graphical user interface). Use a clear commit message describing the motivation for a change, the nature of a bug for bug fixes, or some details on what an enhancement does.
+ Run the following `pre-commit` commands repeatedly until all checks are passed:
```
pre-commit run --all-files
```
+ Run the [overall test](./CONTRIBUTING.md#testing) locally.
#### 3. To submit your contribution: ####
+ Go to your fork on GitHub. The new branch will show up with a Pull Request button. Click and fill out the pull request template, and make sure the title and message are clear, concise, and self-explanatory (these descriptions are how we keep track of the changes made to the project over time). Then click the button to submit it.
#### 4. Review process: ####
We follow the [git pull request (PR) workflow](https://www.asmeurer.com/git-workflow/) to make changes to our codebase. Every change made goes through a PR, even our own, so that our [continuous integration](https://en.wikipedia.org/wiki/Continuous_integration) services have a chance to check that the code is up to standards. GitHub will show the status of these checks on the PR. Try to get them all passing (green). If you have any trouble, leave a comment in the PR.
+ Reviewers (the other developers and interested community members) will write inline and/or general comments on your PR to help you improve its implementation, documentation and style. We don't want to break the shared codebase, so care must be taken not to introduce bugs. Please don’t let the review discourage you from contributing: its only aim is to improve the quality of the project, not to criticize (we are, after all, very grateful for the time you’re donating!).
+ To update your PR, make your changes on your local repository, run tests, and only if they succeed commit and push to your fork. As soon as those changes are pushed up (to the same branch as before) the PR will update automatically. If you have no idea how to fix the test failures, you may push your changes anyway and ask for help in a PR comment.
## Divergence between `upstream/main` and your feature branch ##
If GitHub indicates that the branch of your Pull Request can no longer be merged automatically, you have to incorporate changes that have been made since you started into your branch. Our recommended way to do this is to rebase on `main`. Tute Costa has a great tutorial on how to [rewrite history with git rebase/squash/amend](https://thoughtbot.com/blog/git-interactive-rebase-squash-amend-rewriting-history).
## General guidelines for pull requests (PRs) ##
+ Each pull request should consist of a **small** and logical collection of changes.
+ Larger changes should be broken down into smaller components and integrated separately.
+ Describe what your PR changes and why this is a good thing. Be as specific as you can.
+ Do not commit changes to files that are irrelevant to your feature or bugfix (_e.g._: `.gitignore`, IDE project files, etc.).
+ Write descriptive commit messages. Chris Beams has a [guide on writing good commit messages](https://chris.beams.io/posts/git-commit/).
+ Be aware that the pull request review process is not immediate, and is generally proportional to the size of the pull request.
Some things that will increase the chance that your pull request is accepted quickly:
+ Write a good and detailed description of what the PR does.
+ Readable code is better than clever code (even with comments).
+ Write documentation for your code and leave comments explaining the _reason_ behind non-obvious things.
## Testing ##
It's a good idea to test any changes or bugs you have fixed, in the feature branch locally, before issuing/submitting the pull request. We realize that we don't have a complete testing system in place yet (maybe you can contribute this!), except for an overall testing script for `smallbaselineApp.py`:
```
${MINTPY_HOME}/tests/smallbaselineApp.py
```
It takes about 15 minutes to finish.
## Things you should NOT do ##
(For anyone with push rights to github.com/insarlab/MintPy) Never modify a commit or the history of anything that has been committed to the `main` branch.
## Looking for ideas to contribute? ##
Feel ready and look for something to try? Check our [to-do list](https://github.com/insarlab/MintPy/wiki/To-do-list) and [roadmap](https://github.com/insarlab/MintPy/wiki/version-2-roadmap) for the next major version 2.0!
MintPy-1.6.2/docs/FAQs.md 0000664 0000000 0000000 00000011261 15032632755 0015015 0 ustar 00root root 0000000 0000000 ## Frequently Asked Questions
### 1. What's the sign convention of the line-of-sight data?
For line-of-sight (LOS) phase in the unit of radians, i.e. 'unwrapPhase' dataset in `ifgramStack.h5` file, positive value represents motion away from the satellite. We assume the "date1_date2" format for the interferogram with "date1" being the earlier acquisition.
For LOS displacement (velocity) in the unit of meters (m/yr), i.e. 'timeseries' dataset in `timeseries.h5` file, positive value represents motion toward the satellite (uplift for pure vertical motion).
### 2. How to prepare the input for MintPy if I am using currently un-supported InSAR software?
The input of MintPy routine workflow (`smallbaselineApp.py`) is a stack of unwrapped interferograms. For "stack", we mean all the interferograms (unwrapped phase and spatial coherence) and geometries (DEM, incidence angle, etc.) have the same spatial extent and same spatial resolution, either in geo-coordinates or radar (range-doppler) coordinates. The input has 2 components: data and attributes.
All inputs are saved into the following HDF5 files during the data loading process in MintPy:
+ `inputs/ifgramStack.h5` for stack of interferograms in geo-/radar-coordinates and attributes.
+ `inputs/geometryGeo.h5` for geometry data in geo-coordinates and attributes.
+ `inputs/geometryRadar.h5` for geometry data in radar-coordinates and attributes.
The currently supported formats are:
+ `ISCE-2` stack processors (`topsStack`, `stripmapStack` and `alosStack`)
+ `ARIA` products pre-processed using ARIA-tools
+ `SNAP` products produced using a preliminary workflow here: https://github.com/insarlab/MintPy/wiki/SNAP-input-data
If not using the above software workflows, below is a brief guide for preparation before running `smallbaseelineApp.py`:
#### Data
For dataset in geo-coordinates [recommended]:
+ for each interferogram, the unwrapped phase
+ for each interferogram, the spatial coherence
+ for each interferogram, the connected components from phase unwrapping (produced by SNAPHU) [optional]
+ for each stack, the DEM (Digital Elevation Model)
+ for each stack, the LOS incidence angle [optional]
+ for each stack, the LOS azimuth angle [optional]
+ for each stack, shadow mask [optional]
+ for each stack, water mask [optional]
For dataset in radar-coordinates, the extra lookup table file(s) is required (_e.g._ lat/lon.rdr for `ISCE-2`, sim_\*.UTM_TO_RDC for `Gamma`, geo_\*.trans for `ROI_PAC`).
All the files above should be in the same spatial extent and same spatial resolution (except for the lookup table in geo-coordinates from Gamma/ROI_PAC). If they are not (e.g. different row/column number, different spatial extent in terms of SNWE, different spatial resolution, etc.), the easiest way is to geocode them with the same output spatial extent and same output spatial resolution.
MintPy read data files via `mintpy.utils.readfile.read()`. It supports the following two types of file formats:
+ binary files with metadata files in the format of `ROIPAC .rsc`, `ISCE .xml`, `Gamma .par`, `ENVI .hdr` and `GDAL .vrt` via `numpy`.
+ GeoTiff and GRD files via `GDAL`.
The same function is used in the visualization as well, thus, you could run `view.py` on your files to check. If they are displayed correctly, they will be read properly by MintPy.
Note that MintPy assumes **date1_date2** convention for interferograms (date1 < date2) with positive phase value in radians for motion away from the satellite.
#### Attributes
For each data file, MintPy requires some attributes/metadata in `ROI_PAC .rsc` format as described [here](https://mintpy.readthedocs.io/en/latest/api/attributes/). The optional attributes are highly recommend. The interferogram specific attributes (DATE12, P_BASELINE_TOP/BOTTOM_HDR) is not needed for geometry files (DEM, incidence angle, etc.).
For the supported InSAR software workflows, we prepare these metadata via `prep_isce.py`, `prep_gamma.py`, etc., to read their native metadata, convert and write them into `ROI_PAC .rsc` style for each data file.
#### Recommendations
Option 1: If MintPy could read your data files, e.g. via testing with `view.py`, we recommend leveraging the existing `readfile.read()` by:
+ writing your own `prep_*.py` to extract the metadata, convert and write them into `ROI_PAC .rsc` convention for each data file.
+ specifying the path of each type of data files in the template file and loading them via `load_data.py`.
This is very similar to the existing ISCE/topsStack + MintPy example on Fernandina volcano.
Option 2: Write a independent script to handle the data reading, attributes/metadata preparation and writing into HDF5 file, like `prep_aria.py`, as shown in the ARIA + MintPy example on San Francisco Bay.
MintPy-1.6.2/docs/QGIS.md 0000664 0000000 0000000 00000007605 15032632755 0014775 0 ustar 00root root 0000000 0000000 The displacement time-series result can be exported as a QGIS-compatible format for visualization via the **InSAR Explorer** plugin or the **PS Time Series Viewer** plugin.
### 1. QGIS with [InSAR Explorer](https://insar-explorer.readthedocs.io/) ###
The InSAR Explorer plugin supports both the GRD format and the shapefile format.
#### a. Setup ####
1. Download and install [QGIS](https://qgis.org/en/site/) if you have not done so.
2. Install the plugin:
- Install within QGIS via "Plugins -> Manage and Install Plugins", then search for "InSAR Explorer".
- Alternatively, download the plugin as a *.zip file from [the plugin page](https://plugins.qgis.org/plugins/insar_explorer-dev/), and install it through "Plugins -> Manage and Install Plugins -> Install from ZIP".
3. Launch the plugin: Access it from the toolbar or through "Plugins -> InSAR Explorer -> InSAR Explorer".
#### b. Usage for GRD files ####
1. Export MintPy results to GRD files using `save_explorer.py`:
```bash
save_explorer.py geo_timeseries.h5 -v geo_velocity.h5 -o geo_maskTempCoh.h5 -o timeseries/
```
2. Load data in QGIS: Open one of the exported GRD files, e.g., `geo_velocity_mm.h5`, in QGIS.
3. Launch InSAR Explorer and click on any point to plot the time series.
#### c. Using shapefile ###
1. Export MintPy results to a shapefile using `save_qgis.py`:
```bash
save_qgis.py timeseries_ERA5_ramp_demErr.h5 -g inputs/geometryRadar.h5
save_qgis.py geo/geo_timeseries_ERA5_ramp_demErr.h5 -g geo/geo_geometryRadar.h5
```
2. Load data in QGIS: Browse to the *.shp file generated by `save_qgis.py` and add it to the layer. Then open "View -> Panels -> Layer Styling", and on the right choose "Fill color -> Edit" and add the command below to color-code the map based on velocity value.
```
ramp_color('RdBu', scale_linear(VEL, -20, 20, 0, 1))
```
3. Launch InSAR Explorer and click on any point to plot the time series.
### d. More information ###
For more details on using the plugin, please refer to the [InSAR Explorer documentation](https://insar-explorer.readthedocs.io/).
### 2. QGIS with [PS Time Series Viewer](https://plugins.qgis.org/plugins/pstimeseries/)
The PS Time Series Viewer plugin supports the shapefile format only.
#### a. Setup
1. Download and install [QGIS](https://qgis.org/en/site/) if you have not done so.
2. Install the plugin:
- Install within QGIS via "Plugins -> Manage and Install Plugins", then search "PS Time Series Viewer".
- Alternatively, download the plugin as a *.zip file from [the plugin page](https://plugins.qgis.org/plugins/pstimeseries/), and install it through “Plugins -> Manage and Install Plugins -> Install from ZIP”.
#### b. Usage
1. Export MintPy results to shapefiles using `save_qgis.py`:
```bash
save_qgis.py timeseries_ERA5_ramp_demErr.h5 -g inputs/geometryRadar.h5
save_qgis.py geo/geo_timeseries_ERA5_ramp_demErr.h5 -g geo/geo_geometryRadar.h5
```
2. Load data in QGIS: Browse to the *.shp file generated by `save_qgis.py` and add it to the layer. Then open "View -> Panels -> Layer Styling", and on the right choose "Fill color -> Edit" and add the command below to color-code the map based on velocity value.
```
ramp_color('RdBu', scale_linear(VEL, -20, 20, 0, 1))
```
3. Launch PS Time Series Viewer: Access it from the toolbar or through “Plugins -> Permanent Scatterers -> PS Time Series Viewer”.
MintPy-1.6.2/docs/README.md 0000664 0000000 0000000 00000022473 15032632755 0015167 0 ustar 00root root 0000000 0000000 [](https://www.python.org/)
[](https://mintpy.readthedocs.io/?badge=latest)
[](https://circleci.com/gh/insarlab/MintPy)
[](https://github.com/insarlab/MintPy/pkgs/container/mintpy)
[](https://anaconda.org/conda-forge/mintpy)
[](https://github.com/insarlab/MintPy/releases)
[](https://groups.google.com/g/mintpy)
[](https://github.com/insarlab/MintPy/blob/main/LICENSE)
[](https://doi.org/10.1016/j.cageo.2019.104331)
## MintPy ##
The Miami INsar Time-series software in PYthon (MintPy as /mɪnt paɪ/) is an open-source package for Interferometric Synthetic Aperture Radar (InSAR) time series analysis. It reads the stack of interferograms (coregistered and unwrapped) in [ISCE](https://github.com/isce-framework/isce2), [ARIA](https://github.com/aria-tools/ARIA-tools), [FRInGE](https://github.com/isce-framework/fringe), [HyP3](https://hyp3-docs.asf.alaska.edu/), [GMTSAR](https://github.com/gmtsar/gmtsar), [SNAP](http://step.esa.int/), [GAMMA](https://www.gamma-rs.ch/gamma-software) or ROI_PAC format, and produces three dimensional (2D in space and 1D in time) ground surface displacement in line-of-sight direction. It includes a routine time series analysis (`smallbaselineApp.py`) and some independent toolbox.
This package was called PySAR before version 1.1.1. For version 1.1.2 and onward, we use MintPy instead.
This is research code provided to you "as is" with NO WARRANTIES OF CORRECTNESS. Use at your own risk.
### 1. [Installation](./installation.md) ###
### 2. Running MintPy ###
#### 2.1 Routine workflow `smallbaselineApp.py` ####
MintPy reads a stack of interferograms (unwrapped interferograms, coherence and connected components from SNAPHU if available) and the geometry files (DEM, lookup table, incidence angle, etc.). You need to give the [path to where the files are](dir_structure.md) and MintPy takes care of the rest!
```bash
smallbaselineApp.py # run with default template 'smallbaselineApp.cfg'
smallbaselineApp.py # run with default and custom templates
smallbaselineApp.py -h / --help # help
smallbaselineApp.py -H # print default template options
smallbaselineApp.py -g # generate default template if it does not exist
smallbaselineApp.py -g # generate/update default template based on custom template
# Run with --start/stop/dostep options
smallbaselineApp.py GalapagosSenDT128.txt --dostep velocity # run step 'velocity' only
smallbaselineApp.py GalapagosSenDT128.txt --end load_data # end run after step 'load_data'
```
Inside smallbaselineApp.py, it reads the unwrapped interferograms, references all of them to the same coherent pixel (reference point), calculates the phase closure and estimates the unwrapping errors (if it has been asked for), inverts the network of interferograms into time-series, calculates the temporal coherence to evaluate the quality of inversion, corrects local oscillator drift (for Envisat only), corrects stratified tropospheric delay (using global atmospheric models or phase-elevation-ratio approach), removes phase ramps (if it has been asked for), corrects DEM error,... and finally estimates the velocity.
Configuration parameters for each step are initiated with default values in a customizable text file [**smallbaselineApp.cfg**](../src/mintpy/defaults/smallbaselineApp.cfg).
#### [Example](./demo_dataset.md) on Fernandina volcano, Galápagos with Sentinel-1 data ####
```bash
wget https://zenodo.org/record/3952953/files/FernandinaSenDT128.tar.xz
tar -xvJf FernandinaSenDT128.tar.xz
cd FernandinaSenDT128/mintpy
smallbaselineApp.py ${MINTPY_HOME}/docs/templates/FernandinaSenDT128.txt
```
Results are plotted in **./pic** folder. To explore more data information and visualization, try the following scripts:
```bash
info.py # check HDF5 file structure and metadata
view.py # 2D map view
tsview.py # 1D point time-series (interactive)
plot_coherence_matrix.py # plot coherence matrix for one pixel (interactive)
plot_network.py # plot network configuration of the dataset
plot_transection.py # plot 1D profile along a line of a 2D matrix (interactive)
save_kmz.py # generate Google Earth KMZ file in points or raster image
save_kmz_timeseries.py # generate Google Earth KMZ file in points for time-series (interactive)
```
#### 2.2 Customized processing recipe ####
MintPy is a toolbox with individual utility scripts. Simply run the script with `-h / --help` to see its usage, you could build your own customized processing recipe! [Here](../scripts/compare_velocity_with_diff_tropo.sh) is an example to compare the velocities estimated from displacement time-series with different tropospheric delay corrections.
#### 2.3 Build on top of `mintpy` module ####
MintPy is modulized in Python with utilities classes and functions and well commented in the code level. Users who are familiar with Python could build their own functions and modules on top of [`mintpy.objects`](../src/mintpy/objects) and [`mintpy.utils`](../src/mintpy/utils). However, we don't have a complete API document website yet (maybe you can contribute this!). Below is an example of reading the 3D matrix of displacement time-series from an HDF5 file.
```python
from mintpy.utils import readfile
ts_data, meta = readfile.read('timeseries_ERA5_ramp_demErr.h5')
```
### 3. [Documentation](https://mintpy.readthedocs.io/) ###
Algorithms implemented in the software are described in details at [Yunjun et al. (2019)](https://doi.org/10.1016/j.cageo.2019.104331).
+ [Quick start with example datasets](./demo_dataset.md)
+ [Example data directory](./dir_structure.md)
+ [Example template files](./templates/README.md)
+ [Tutorials in Jupyter Notebook](https://github.com/insarlab/MintPy-tutorial)
### 4. Contact us ###
+ Most development discussion happens on GitHub. Feel free to [open an issue](https://github.com/insarlab/MintPy/issues) or comment on any open issue or pull request.
+ Join our [user forum on google groups](https://groups.google.com/g/mintpy) or use [github discussions](https://github.com/insarlab/MintPy/discussions) to ask questions or leave comments.
### 5. Contributing ###
**Imposter syndrome disclaimer:** We want your help. No, really.
There may be a little voice inside your head that is telling you that you're not ready to be an open source contributor; that your skills aren't nearly good enough to contribute. What could you possibly offer?
We assure you - the little voice in your head is wrong. If you can write code at all, you can contribute code to open source. Contributing to open source projects is a fantastic way to advance one's coding skills. Writing perfect code isn't the measure of a good developer (that would disqualify all of us!); it's trying to create something, making mistakes, and learning from those mistakes. That's how we all improve, and we are happy to help others learn.
**Being an open source contributor doesn't just mean writing code.** You can help out by writing or proofreading documentation, suggesting or implementing tests, or even giving feedback about the project (and yes - that includes giving feedback about the contribution process). Some of these contributions may be the most valuable to the project as a whole, because you're coming to the project with fresh eyes, so you can see the errors and assumptions that seasoned contributors have glossed over.
For more information, please read our [contributing guide](./CONTRIBUTING.md).
_This disclaimer was adapted from the [MetPy project](https://github.com/Unidata/MetPy)._
### 6. Citing this work ###
Yunjun, Z., Fattahi, H., and Amelung, F. (2019), Small baseline InSAR time series analysis: Unwrapping error correction and noise reduction, _Computers & Geosciences_, _133_, 104331. [ [doi](https://doi.org/10.1016/j.cageo.2019.104331) \| [arxiv](https://doi.org/10.31223/osf.io/9sz6m) \| [data](https://doi.org/10.5281/zenodo.3464190) \| [notebook](https://github.com/geodesymiami/Yunjun_et_al-2019-MintPy) ]
In addition to the above, we recommend that you cite the original publications that describe the algorithms used in your specific analysis. They are noted briefly in the [default template file](../src/mintpy/defaults/smallbaselineApp.cfg) and listed in the [reference file](./references.md).
MintPy-1.6.2/docs/_config.yml 0000664 0000000 0000000 00000000410 15032632755 0016022 0 ustar 00root root 0000000 0000000 title: MintPy
description: Miami InSAR time-series software in Python
show_downloads: true
google_analytics: UA-104225904-1
theme: jekyll-theme-cayman
author:
name: Zhang Yunjun, Heresh Fattahi
url: https://yunjunz.github.io/
author_email: yunjunz@outlook.com
MintPy-1.6.2/docs/_includes/ 0000775 0000000 0000000 00000000000 15032632755 0015645 5 ustar 00root root 0000000 0000000 MintPy-1.6.2/docs/_includes/analytics.html 0000664 0000000 0000000 00000000655 15032632755 0020530 0 ustar 00root root 0000000 0000000
MintPy-1.6.2/docs/_includes/head.html 0000664 0000000 0000000 00000001407 15032632755 0017436 0 ustar 00root root 0000000 0000000
{% if site.github.owner_name %}{{ site.github.owner_name }} | {% endif %}{{ site.title | default: site.github.repository_name }}
{% if site.google_analytics and jekyll.environment == 'production' %}
{% include analytics.html %}
{% endif %}
MintPy-1.6.2/docs/_includes/page-footer.html 0000664 0000000 0000000 00000000707 15032632755 0020747 0 ustar 00root root 0000000 0000000
MintPy-1.6.2/docs/_includes/page-header.html 0000664 0000000 0000000 00000001177 15032632755 0020703 0 ustar 00root root 0000000 0000000
{% if site.google_analytics %}
{% endif %}
MintPy-1.6.2/docs/api/ 0000775 0000000 0000000 00000000000 15032632755 0014451 5 ustar 00root root 0000000 0000000 MintPy-1.6.2/docs/api/Doxyfile 0000664 0000000 0000000 00000031446 15032632755 0016167 0 ustar 00root root 0000000 0000000 # Doxyfile 1.8.13
# cd $MINTPY_HOME/docs/api
# /Applications/Doxygen.app/Contents/Resources/doxygen Doxyfile
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = MintPy
PROJECT_NUMBER = 1.1.2
PROJECT_BRIEF = "Miami InSAR Time-series software in Python"
PROJECT_LOGO = NO
OUTPUT_DIRECTORY = ../api_docs
CREATE_SUBDIRS = NO
ALLOW_UNICODE_NAMES = NO
OUTPUT_LANGUAGE = English
BRIEF_MEMBER_DESC = YES
REPEAT_BRIEF = YES
ABBREVIATE_BRIEF = "The $name class" \
"The $name widget" \
"The $name file" \
is \
provides \
specifies \
contains \
represents \
a \
an \
the
ALWAYS_DETAILED_SEC = NO
INLINE_INHERITED_MEMB = NO
FULL_PATH_NAMES = NO
STRIP_FROM_PATH =
STRIP_FROM_INC_PATH =
SHORT_NAMES = NO
JAVADOC_AUTOBRIEF = NO
QT_AUTOBRIEF = NO
MULTILINE_CPP_IS_BRIEF = NO
INHERIT_DOCS = YES
SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 8
ALIASES =
TCL_SUBST =
OPTIMIZE_OUTPUT_FOR_C = NO
OPTIMIZE_OUTPUT_JAVA = YES
OPTIMIZE_FOR_FORTRAN = NO
OPTIMIZE_OUTPUT_VHDL = NO
EXTENSION_MAPPING =
MARKDOWN_SUPPORT = YES
TOC_INCLUDE_HEADINGS = 4
AUTOLINK_SUPPORT = YES
BUILTIN_STL_SUPPORT = NO
CPP_CLI_SUPPORT = NO
SIP_SUPPORT = NO
IDL_PROPERTY_SUPPORT = NO
DISTRIBUTE_GROUP_DOC = NO
GROUP_NESTED_COMPOUNDS = NO
SUBGROUPING = YES
INLINE_GROUPED_CLASSES = NO
INLINE_SIMPLE_STRUCTS = NO
TYPEDEF_HIDES_STRUCT = NO
LOOKUP_CACHE_SIZE = 0
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
EXTRACT_ALL = YES
EXTRACT_PRIVATE = YES
EXTRACT_PACKAGE = YES
EXTRACT_STATIC = YES
EXTRACT_LOCAL_CLASSES = YES
EXTRACT_LOCAL_METHODS = YES
EXTRACT_ANON_NSPACES = NO
HIDE_UNDOC_MEMBERS = NO
HIDE_UNDOC_CLASSES = NO
HIDE_FRIEND_COMPOUNDS = NO
HIDE_IN_BODY_DOCS = NO
INTERNAL_DOCS = NO
CASE_SENSE_NAMES = YES
HIDE_SCOPE_NAMES = YES
HIDE_COMPOUND_REFERENCE= NO
SHOW_INCLUDE_FILES = YES
SHOW_GROUPED_MEMB_INC = NO
FORCE_LOCAL_INCLUDES = NO
INLINE_INFO = YES
SORT_MEMBER_DOCS = YES
SORT_BRIEF_DOCS = NO
SORT_MEMBERS_CTORS_1ST = NO
SORT_GROUP_NAMES = NO
SORT_BY_SCOPE_NAME = NO
STRICT_PROTO_MATCHING = NO
GENERATE_TODOLIST = YES
GENERATE_TESTLIST = YES
GENERATE_BUGLIST = YES
GENERATE_DEPRECATEDLIST= YES
ENABLED_SECTIONS =
MAX_INITIALIZER_LINES = 30
SHOW_USED_FILES = YES
SHOW_FILES = YES
SHOW_NAMESPACES = YES
FILE_VERSION_FILTER =
LAYOUT_FILE =
CITE_BIB_FILES =
#---------------------------------------------------------------------------
# Configuration options related to warning and progress messages
#---------------------------------------------------------------------------
QUIET = NO
WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES
WARN_IF_DOC_ERROR = YES
WARN_NO_PARAMDOC = NO
WARN_AS_ERROR = NO
WARN_FORMAT = "$file:$line: $text"
WARN_LOGFILE =
#---------------------------------------------------------------------------
# Configuration options related to the input files
#---------------------------------------------------------------------------
INPUT = ../..
INPUT_ENCODING = UTF-8
FILE_PATTERNS = *.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 \
*.qsf
RECURSIVE = YES
EXCLUDE =
EXCLUDE_SYMLINKS = NO
EXCLUDE_PATTERNS =
EXCLUDE_SYMBOLS =
EXAMPLE_PATH =
EXAMPLE_PATTERNS = *
EXAMPLE_RECURSIVE = NO
IMAGE_PATH =
INPUT_FILTER =
FILTER_PATTERNS =
FILTER_SOURCE_FILES = NO
FILTER_SOURCE_PATTERNS =
USE_MDFILE_AS_MAINPAGE =
#---------------------------------------------------------------------------
# Configuration options related to source browsing
#---------------------------------------------------------------------------
SOURCE_BROWSER = YES
INLINE_SOURCES = NO
STRIP_CODE_COMMENTS = NO
REFERENCED_BY_RELATION = YES
REFERENCES_RELATION = YES
REFERENCES_LINK_SOURCE = YES
SOURCE_TOOLTIPS = YES
USE_HTAGS = YES
VERBATIM_HEADERS = YES
CLANG_ASSISTED_PARSING = NO
CLANG_OPTIONS =
#---------------------------------------------------------------------------
# Configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
ALPHABETICAL_INDEX = YES
COLS_IN_ALPHA_INDEX = 5
IGNORE_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to the HTML output
#---------------------------------------------------------------------------
GENERATE_HTML = YES
HTML_OUTPUT = html
HTML_FILE_EXTENSION = .html
HTML_HEADER =
HTML_FOOTER =
HTML_STYLESHEET =
HTML_EXTRA_STYLESHEET =
HTML_EXTRA_FILES =
HTML_COLORSTYLE_HUE = 220
HTML_COLORSTYLE_SAT = 100
HTML_COLORSTYLE_GAMMA = 80
HTML_TIMESTAMP = NO
HTML_DYNAMIC_SECTIONS = NO
HTML_INDEX_NUM_ENTRIES = 100
GENERATE_DOCSET = NO
DOCSET_FEEDNAME = "Doxygen generated docs"
DOCSET_BUNDLE_ID = org.doxygen.Project
DOCSET_PUBLISHER_ID = org.doxygen.Publisher
DOCSET_PUBLISHER_NAME = Publisher
GENERATE_HTMLHELP = YES
CHM_FILE =
HHC_LOCATION =
GENERATE_CHI = YES
CHM_INDEX_ENCODING =
BINARY_TOC = YES
TOC_EXPAND = YES
GENERATE_QHP = NO
QCH_FILE =
QHP_NAMESPACE = org.doxygen.Project
QHP_VIRTUAL_FOLDER = doc
QHP_CUST_FILTER_NAME =
QHP_CUST_FILTER_ATTRS =
QHP_SECT_FILTER_ATTRS =
QHG_LOCATION =
GENERATE_ECLIPSEHELP = NO
ECLIPSE_DOC_ID = org.doxygen.Project
DISABLE_INDEX = NO
GENERATE_TREEVIEW = YES
ENUM_VALUES_PER_LINE = 4
TREEVIEW_WIDTH = 250
EXT_LINKS_IN_WINDOW = NO
FORMULA_FONTSIZE = 10
FORMULA_TRANSPARENT = YES
USE_MATHJAX = NO
MATHJAX_FORMAT = HTML-CSS
MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
MATHJAX_EXTENSIONS =
MATHJAX_CODEFILE =
SEARCHENGINE = YES
SERVER_BASED_SEARCH = NO
EXTERNAL_SEARCH = NO
SEARCHENGINE_URL =
SEARCHDATA_FILE = searchdata.xml
EXTERNAL_SEARCH_ID =
EXTRA_SEARCH_MAPPINGS =
#---------------------------------------------------------------------------
# Configuration options related to the LaTeX output
#---------------------------------------------------------------------------
GENERATE_LATEX = YES
LATEX_OUTPUT = latex
LATEX_CMD_NAME = latex
MAKEINDEX_CMD_NAME = makeindex
COMPACT_LATEX = YES
PAPER_TYPE = a4
EXTRA_PACKAGES =
LATEX_HEADER =
LATEX_FOOTER =
LATEX_EXTRA_STYLESHEET = ./latex.sty
LATEX_EXTRA_FILES =
PDF_HYPERLINKS = YES
USE_PDFLATEX = YES
LATEX_BATCHMODE = YES
LATEX_HIDE_INDICES = NO
LATEX_SOURCE_CODE = NO
LATEX_BIB_STYLE = plain
LATEX_TIMESTAMP = NO
#---------------------------------------------------------------------------
# Configuration options related to the RTF output
#---------------------------------------------------------------------------
GENERATE_RTF = NO
RTF_OUTPUT = rtf
COMPACT_RTF = NO
RTF_HYPERLINKS = NO
RTF_STYLESHEET_FILE =
RTF_EXTENSIONS_FILE =
RTF_SOURCE_CODE = NO
#---------------------------------------------------------------------------
# Configuration options related to the man page output
#---------------------------------------------------------------------------
GENERATE_MAN = NO
MAN_OUTPUT = man
MAN_EXTENSION = .3
MAN_SUBDIR =
MAN_LINKS = NO
#---------------------------------------------------------------------------
# Configuration options related to the XML output
#---------------------------------------------------------------------------
GENERATE_XML = NO
XML_OUTPUT = xml
XML_PROGRAMLISTING = YES
#---------------------------------------------------------------------------
# Configuration options related to the DOCBOOK output
#---------------------------------------------------------------------------
GENERATE_DOCBOOK = NO
DOCBOOK_OUTPUT = docbook
DOCBOOK_PROGRAMLISTING = NO
#---------------------------------------------------------------------------
# Configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
# Configuration options related to the Perl module output
#---------------------------------------------------------------------------
GENERATE_PERLMOD = NO
PERLMOD_LATEX = NO
PERLMOD_PRETTY = YES
PERLMOD_MAKEVAR_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = NO
EXPAND_ONLY_PREDEF = NO
SEARCH_INCLUDES = YES
INCLUDE_PATH =
INCLUDE_FILE_PATTERNS =
PREDEFINED =
EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration options related to external references
#---------------------------------------------------------------------------
TAGFILES =
GENERATE_TAGFILE =
ALLEXTERNALS = NO
EXTERNAL_GROUPS = YES
EXTERNAL_PAGES = YES
PERL_PATH = /usr/bin/perl
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
CLASS_DIAGRAMS = YES
MSCGEN_PATH =
DIA_PATH =
HIDE_UNDOC_RELATIONS = YES
HAVE_DOT = YES
DOT_NUM_THREADS = 0
DOT_FONTNAME = Helvetica
DOT_FONTSIZE = 10
DOT_FONTPATH =
CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES
GROUP_GRAPHS = YES
UML_LOOK = YES
UML_LIMIT_NUM_FIELDS = 10
TEMPLATE_RELATIONS = NO
INCLUDE_GRAPH = YES
INCLUDED_BY_GRAPH = YES
CALL_GRAPH = NO
CALLER_GRAPH = NO
GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES
DOT_IMAGE_FORMAT = svg
INTERACTIVE_SVG = YES
DOT_PATH =
DOTFILE_DIRS =
MSCFILE_DIRS =
DIAFILE_DIRS =
PLANTUML_JAR_PATH =
PLANTUML_CFG_FILE =
PLANTUML_INCLUDE_PATH =
DOT_GRAPH_MAX_NODES = 50
MAX_DOT_GRAPH_DEPTH = 1000
DOT_TRANSPARENT = NO
DOT_MULTI_TARGETS = NO
GENERATE_LEGEND = YES
DOT_CLEANUP = YES
MintPy-1.6.2/docs/api/attributes.md 0000664 0000000 0000000 00000012442 15032632755 0017164 0 ustar 00root root 0000000 0000000 MintPy mainly uses attribute names from [ROI_PAC](http://www.geo.cornell.edu/eas/PeoplePlaces/Faculty/matt/pub/winsar/InSAR_textbook_for_web_2014.pdf), with some additional self-generated attributes.
### Required attributes ###
If using ROI_PAC as the InSAR processor, both **baseline parameter RSC** file (i.e. *100416-100901_baseline.rsc*) and **basic metadata file** (i.e. *filt_100416-100901-sim_HDR_4rlks_c10.unw.rsc*) will be imported into MintPy. The following attributes for each interferogram are required in order to run MintPy:
+ LENGTH = number of rows.
+ WIDTH = number of columns.
+ X/Y_FIRST = (for geocoded product) Longitude/easting/X and latitude/northing/Y coordinate in degrees/meters of the upper left corner of the first pixel.
+ X/Y_STEP = (for geocoded product) Ground resolution in degrees/meters in X/Y direction.
+ X/Y_UNIT = (for geocoded product) Coordinate unit in X/Y direction: degrees or meters.
+ LAT/LON_REF1/2/3/4 = Latitude/northing and longitude/easting at corner 1/2/3/4 (in degrees or meters), used in save_unavco, PyAPS (DEM file in radar coord), not accurate; number named in order of first line near/far range, last line near/far range.
+ WAVELENGTH = Radar wavelength in meters.
+ RANGE_PIXEL_SIZE = Slant range pixel size (search for pixel_ratio to convert to ground size, in m), used in dem_error, incidence_angle, multilook, transect.
+ EARTH_RADIUS = Best fitting spheroid radius in meters, used in dem_error, incidence_angle, convert2mat.
+ CENTER_LINE_UTC = Time at middle of interferogram in seconds, used in tropo correction using PyAPS.
+ HEIGHT = Height of satellite in meters, used in dem_error, incidence_angle, convert2mat.
+ STARTING_RANGE = Distance from satellite to first ground pixel in meters, used in incidence_angle calculation
+ PLATFORM = satellite/sensor name, used in Local Oscillator Drift correction for Envisat.
+ ORBIT_DIRECTION = ascending, or descending.
+ ALOOKS/RLOOKS = multilook number in azimuth/range direction, used in weighted network inversion.
The following attributes vary for each interferogram:
+ DATE12 = (date1)-(date2), reference - secondary date of interferogram in 6 digit number.
+ P_BASELINE_TOP_HDR = Perpendicular baseline at top (first line) of interferogram in meters.
+ P_BASELINE_BOTTOM_HDR = Perpendicular baseline at bottom (last line) of interferogram in meters.
### Optional attributes ###
+ ANTENNA_SIDE = -1 for right looking radar, used in save_unavco
+ AZIMUTH_PIXEL_SIZE = Azimuth pixel size at orbital altitude (multiply by Re/(Re+h) for ground size (m), where Re is the local earth radius), used in baseline_error/trop and multilook.
+ HEADING = Spacecraft heading at peg point (degrees), measured from the north with clock-wise as positive, used in asc_desc
+ PRF = Pulse repetition frequency (Hz), used in save_unavco
### Self-generated attributes ###
+ FILE_TYPE = file type.
- for HDF5 files, it's the root level dataset name, such as `velocity, timeseries, ifgramStack, temporalCoherence, mask, HDFEOS, dem, coherence, etc.`;`
- for binary files, it's the file extension name, such as `.unw, .cor, .int, .amp, .mli, .dem, .hgt, .unw.conncomp, .UTM_TO_RDC, .trans, etc.`, except for ISCE geometry files, which is the file base name such as `hgt, lat, lon, los, shadowMask, incLocal`.
+ FILE_PATH = absolute file path
+ PROCESSOR = processing software, i.e. isce, aria, snap, gamma, roipac etc.
+ DATA_TYPE = data type, i.e. float32, int16, etc., for isce product read using GDAL
+ BYTE_ORDER = order of bytes, or endianness, for binary files, i.e. big-endian or little-endian. Most InSAR processors use little-endian, except for Gamma, which sometimes use big-endian.
+ BANDS = number of bands, for binary file I/O.
+ INTERLEAVE = band interleave type, i.e. BSQ, BIL, BIP for binary file I/O.
+ NO_DATA_VALUE = No data value, value that should be ignored.
+ UNIT = data unit, i.e. m, m/yr, radian, and 1 for file without unit, such as coherence [[source]](https://github.com/insarlab/MintPy/blob/main/src/mintpy/objects/stack.py#L75)
+ REF_DATE = reference date
+ REF_X/Y = column/row of the reference point
+ REF_LAT/LON = latitude/northing and longitude/easting of the reference point (in degrees or meters)
+ SUBSET_XMIN/XMAX/YMIN/YMAX = start/end column/row number of subset in the original coverage
+ MODIFICATION_TIME = dataset modification time, exists in ifgramStack.h5 file for 3D dataset, used for "--update" option of unwrap error corrections.
+ NCORRLOOKS = number of independent looks, as explained in [SNAPHU](https://web.stanford.edu/group/radar/softwareandlinks/sw/snaphu/snaphu.conf.full)
+ UTM_ZONE = [UTM zone](https://docs.up42.com/data/reference/utm#utm-wgs84), comprises a zone number and a hemisphere, e.g. 11N, 60S, for geocoded file with UTM projection only.
+ EPSG = EPSG code for coordinate systems, for geocoded files only. Check [here](https://docs.up42.com/data/reference/utm#utm-wgs84) for its relationship with UTM zone.
+ CENTER_INCIDENCE_ANGLE = incidence angle in degrees at the scene center, read from the 2D incidence angle matrix, for isce2 files only.
### Reference ###
+ Pritchard et al., (2014), Open-source software for geodetic imaging: ROI_PAC for InSAR and pixel tracking, pp 44-48. [PDF](http://www.geo.cornell.edu/eas/PeoplePlaces/Faculty/matt/pub/winsar/InSAR_textbook_for_web_2014.pdf)
MintPy-1.6.2/docs/api/colormaps.md 0000664 0000000 0000000 00000005416 15032632755 0017000 0 ustar 00root root 0000000 0000000 ## Custom colormaps
MintPy support the following colormaps:
+ [Matplotlib colormaps](https://matplotlib.org/stable/tutorials/colors/colormaps.html)
+ Custom colormaps: `cmy`, `dismph`, and `romanian`
+ Custom colormaps in **.cpt** (color palette tables) format. To add your own colormap, drop the corresponding .cpt file in `$MINTPY/mintpy/data/colormaps`.
We recommend to use cyclic colormap `cmy` for wrapped phase/displacement measurement.
To use colormap `cmy` in view.py:
```bash
view.py velocity.h5 -c cmy
```
To use colormap `cmy` in python:
```python
from mintpy.colors import ColormapExt
cmap = ColormapExt('cmy').colromap
```
### Colormaps from [GMT](http://www.soest.hawaii.edu/gmt/) ###
All GMT cpt files, e.g. the 20 built-in colormaps shown below, can be recognized by setting the variable `GMT_CPT_DIR` in `$MINTPY_HOME/src/mintpy/objects/colors.py`. The default hardwired value is `/opt/local/share/gmt/cpt` for macOS users with GMT installed using [MacPorts](https://www.macports.org).
### Colormaps from [cpt-city](http://soliton.vm.bytemark.co.uk/pub/cpt-city/views/totp-cpt.html) ###
The following colormaps is included by default:
+ BlueWhiteOrangeRed
+ DEM_print
+ differences
+ GMT_haxby
+ GMT_no_green
+ seminf-haxby
+ temp-c
+ temperature
+ wiki-2.0
+ wiki-schwarzwald-d050
+ wiki-scotland
+ More at [cpt-city](http://soliton.vm.bytemark.co.uk/pub/cpt-city/views/totp-cpt.html)
### Colormaps from [Scientific Color-Maps](http://www.fabiocrameri.ch/colourmaps.php) by Fabio Crameri ###
The following colormaps is included by default:
+ batlow (the scientific rainbow)
+ hawaii
+ oleron (surface topography)
+ roma (seismic tomography)
+ vik (diverging)
+ vikO (cyclic diverging)
+ More at [Scientific Color-Maps](http://www.fabiocrameri.ch/colourmaps.php) ([Crameri, 2018](https://doi.org/10.5194/gmd-11-2541-2018))
### Interactive [web tool](https://jdherman.github.io/colormap/) to generate custom colormaps by Jon Herman ###
This web tool creates a custom colormap (for Matplotlib/Matlab) by dragging points on the RGB intensity curves.
+ Choose output as *plaintext* style and *RGB* format.
+ Copy and save the RGB table to a text file
+ Use this script [rgb2cpt.py](https://github.com/yuankailiu/utils/blob/main/trivia/rgb2cpt.py) to convert the RGB table to 8-column CPT file with heading, overrule background, foreground, and NaN colors.
MintPy-1.6.2/docs/api/coord.md 0000664 0000000 0000000 00000001325 15032632755 0016102 0 ustar 00root root 0000000 0000000 There are two coordination systems in MintPy: **radar coordinate** and **geo coordinate**. Geo coordinate is defined in WGS84 coordination for horizontal direction, and determined by the following [ROI_PAC attributes](https://github.com/insarlab/MintPy/wiki/Attributes) in latitude and longitude. The following shows examples from *KujuAlosAT422F650/mintpy/geo/geo_velocity.h5*:
```
X_FIRST 131.02409876
Y_FIRST 33.63756779
X_STEP 0.00033333
Y_STEP -0.00033333
X_UNIT degrees
Y_UNIT degrees
```
X/Y_FIRST are the longitude/latitude value of the first (upper left corner) pixel’s upper left corner, as shown below:
MintPy-1.6.2/docs/api/data_structure.md 0000664 0000000 0000000 00000024564 15032632755 0020037 0 ustar 00root root 0000000 0000000 ## Data structure
MintPy uses [HDF5](https://www.hdfgroup.org) file internally. It loads files generated by various InSAR processors into HDF5 format (via `load_data.py` or `prep_*.py`). HDF5 files can exported into other format via `save_*.py`, i.e. [QGIS](../QGIS.md), [HDF-EOS5](../hdfeos5.md), GMT, ROI_PAC and [Google Earth KMZ](../google_earth.md).
### File name convention
Using the underscore `_` as the delimiter in the file name, the first part describes the file type, while the rest parts describe the additional operations. For example:
+ `timeseries.h5` is the raw time series
+ `timeseries_ERA5.h5` is the time series after the ERA5 correction;
+ `velocity.h5` is the velocity from the final displacement time series
+ `velocityERA5.h5` is the velocity from ERA5 tropospheric delay (from `inputs/ERA5.h5` file), not the displacement velocity after ERA5 correction.
+ `timeseriesResidual.h5` is the residual phase time series
+ `timeseriesResidual_ramp.h5` is the residual phase time series after deramping
### File description
The generated HDF5 files by the routine workflow `smallbaselineApp.py` are described in the following notebook:
+ https://github.com/insarlab/MintPy-tutorial/blob/main/workflows/smallbaselineApp.ipynb
### HDF5 data structure
All HDF5 files generated by MintPy have **datasets and attributes in the root level**. Files may have one or multiple datasets. Datasets in most files have the same shape (size), except for the pre-defined structure types below (presented in the most complete form):
#### timeseries
```cfg
/ Root level
Attributes Dictionary for metadata
/date 1D array of string in size of (n, ) in YYYYMMDD format.
/timeseries 3D array of float32 in size of (n, l, w) in meter for cumulative displacement.
/bperp 1D array of float32 in size of (n, ) in meter for perpendicular baseline.
```
where `n` is the number of acquisitions, `l` for length, `w` for width.
#### velocity
```cfg
/ Root level
Attributes Dictionary of metadata
/velocity 2D array of float32 in size of (l, w) in m/year for polynomial function with the order of 1
/velocityStd 2D array of float32 in size of (l, w) in m/year for polynomial function with the order of 1
/acceleration 2D array of float32 in size of (l, w) in m^2/year for polynomial function with the order of 2
/accelerationStd 2D array of float32 in size of (l, w) in m^2/year for polynomial function with the order of 2
/poly{order} 2D array of float32 in size of (l, w) in m^{order}/year for polynomial function with the order >= 3
/poly{order}Std 2D array of float32 in size of (l, w) in m^{order}/year for polynomial function with the order >= 3
...
/annualAmplitude 2D array of float32 in size of (l, w) in meter for periodic function with period of 1 year
/annualPhase 2D array of float32 in size of (l, w) in radian for periodic function with period of 1 year
/semiAnnualAmplitude 2D array of float32 in size of (l, w) in meter for periodic function with period of 1/2 year
/semiAnnualPhase 2D array of float32 in size of (l, w) in radian for periodic function with period of 1/2 year
/periodY{per}Amplitude 2D array of float32 in size of (l, w) in meter for periodic function with period of {per} year
/periodY{per}Phase 2D array of float32 in size of (l, w) in radian for periodic function with period of {per} year
...
/step{YYYYMMDD} 2D array of float32 in size of (l, w) in meter for step function
/step{YYYYMMDD}Std 2D array of float32 in size of (l, w) in meter for step function
...
/velocityPost{YYYYMMDD} 2D array of float32 in size of (l, w) in m/year for a polyline function starting at {YYYYMMDD}
/velocityPost{YYYYMMDD}Std 2D array of float32 in size of (l, w) in m/year for a polyline function starting at {YYYYMMDD}
...
/exp{YYYYMMDD}Tau{tau} 2D array of float32 in size of (l, w) in meter for an exponential function starting at {YYYYMMDD} with characteristic time of {tau} days
/exp{YYYYMMDD}Tau{tau}Std 2D array of float32 in size of (l, w) in meter for an exponential function starting at {YYYYMMDD} with characteristic time of {tau} days
...
/log{YYYYMMDD}Tau{tau} 2D array of float32 in size of (l, w) in meter for a logarithmic function starting at {YYYYMMDD} with characteristic time of {tau} days
/log{YYYYMMDD}Tau{tau}Std 2D array of float32 in size of (l, w) in meter for a logarithmic function starting at {YYYYMMDD} with characteristic time of {tau} days
...
```
#### geometry
```cfg
/ Root level
Attributes Dictionary for metadata. 'X/Y_FIRST/STEP' attribute for geocoded.
/height 2D array of float32 in size of (l, w ) in meter. Height with respect to the ellipsoid (as provided by ISCE-2/topsStack) or geoid.
/latitude (azimuthCoord) 2D array of float32 in size of (l, w ) in degree.
/longitude (rangeCoord) 2D array of float32 in size of (l, w ) in degree.
/slantRangeDistance 2D array of float32 in size of (l, w ) in meter.
/incidenceAngle 2D array of float32 in size of (l, w ) in degree. Incidence angle of the LOS vector measured from vertical at the target.
/azimuthAngle 2D array of float32 in size of (l, w ) in degree. Azimuth angle of the LOS vector measured from the north at the target with anti-clockwise direction as positive.
/shadowMask 2D array of bool in size of (l, w ). Mask with non-zero value for pixels in shadow in the LOS direction.
/waterMask 2D array of bool in size of (l, w ). Mask with non-zero value for pixels on land.
/bperp 3D array of float32 in size of (n, l, w) in meter.
/date 1D array of string in size of (n, ) in YYYYMMDD.
...
```
#### ifgramStack
```cfg
/ Root level group name
Attributes Dictionary for metadata
/date 2D array of string in size of (m, 2 ) in YYYYMMDD format for reference and secondary date
/bperp 1D array of float32 in size of (m, ) in meter for perpendicular baseline.
/dropIfgram 1D array of bool in size of (m, ) with 0/False for drop and 1/True for keep
/unwrapPhase 3D array of float32 in size of (m, l, w) in radian.
/coherence 3D array of float32 in size of (m, l, w).
/connectComponent 3D array of int16 in size of (m, l, w).
/wrapPhase 3D array of float32 in size of (m, l, w) in radian.
/azimuthOffset 3D array of float32 in size of (m, l, w) in pixel number.
/azimuthOffsetStd 3D array of float32 in size of (m, l, w) in pixel number.
/rangeOffset 3D array of float32 in size of (m, l, w) in pixel number.
/rangeOffsetStd 3D array of float32 in size of (m, l, w) in pixel number.
/offsetSNR 3D array of float32 in size of (m, l, w).
```
where `m` is the number of (interferometric / offset) pairs.
### Tips: check file structure with `info.py`
One could run `info.py` on ANY HDF5 file to display its file structure, e.g.:
```bash
yunjunz:~/data/test/FernandinaSenDT128/mintpy>$ info.py timeseries.h5
******************** Basic File Info ************************
file name: /Users/yunjunz/data/test/FernandinaSenDT128/mintpy/timeseries.h5
file type: timeseries
coordinates : RADAR
******************** Date Stat Info *************************
Start Date: 20141213
End Date: 20180619
Number of acquisitions : 98
Std. of acquisition times : 0.99 years
----------------------
List of dates:
['20141213', '20141225', '20150307', '20150319', '20150331', '20150412', '20150424', '20150506', '20150518', '20150530', '20150611', '20150623', '20150717', '20150729', '20150822', '20150903', '20150915', '20150927', '20151009', '20151021', '20151102', '20151114', '20151126', '20151208', '20151220', '20160101', '20160113', '20160125', '20160206', '20160218', '20160301', '20160406', '20160418', '20160430', '20160512', '20160524', '20160605', '20160629', '20160711', '20160723', '20160804', '20160816', '20160828', '20160909', '20160921', '20161003', '20161015', '20161027', '20161108', '20161120', '20161202', '20161214', '20161226', '20170107', '20170119', '20170131', '20170212', '20170224', '20170308', '20170320', '20170401', '20170413', '20170425', '20170507', '20170519', '20170531', '20170612', '20170624', '20170706', '20170718', '20170730', '20170811', '20170823', '20170904', '20170916', '20170928', '20171010', '20171022', '20171103', '20171115', '20171127', '20171209', '20171221', '20180102', '20180114', '20180126', '20180207', '20180219', '20180303', '20180315', '20180327', '20180408', '20180420', '20180502', '20180514', '20180526', '20180607', '20180619']
----------------------
...
******************** HDF5 File Structure ********************
Attributes in / level:
ALOOKS 5
ANTENNA_SIDE -1
AZIMUTH_PIXEL_SIZE 78.08212603857966
CENTER_LINE_UTC 42584.0
DATA_TYPE float32
DATE12 141213-141225
EARTH_RADIUS 6337286.638938101
END_DATE 20180619
FILE_LENGTH 450
FILE_PATH /Users/yunjunz/data/test/FernandinaSenDT128/merged/interferograms/20141213_20141225/filt_fine.unw
FILE_TYPE timeseries
HEADING -168.01821899414062
HEIGHT 698834.2261352595
LAT_REF1 -0.27142282744993307
LAT_REF2 -0.2052012679974385
LAT_REF3 -0.548154094069745
LAT_REF4 -0.4814968797610026
LENGTH 450
LON_REF1 -91.33901754364975
LON_REF2 -91.64656503719202
...
HDF5 dataset "/bperp ": shape (98,) , dtype
HDF5 dataset "/date ": shape (98,) , dtype <|S8>
HDF5 dataset "/timeseries ": shape (98, 450, 600) , dtype
```
MintPy-1.6.2/docs/api/doc_generation.md 0000664 0000000 0000000 00000001147 15032632755 0017756 0 ustar 00root root 0000000 0000000 We use [Doxygen](http://www.doxygen.nl/) to generate the API documentation automatically.
+ Install Doxygen following [link](http://www.doxygen.nl/download.html) if you have not already done so.
+ Run doxygen command with `MintPy/docs/Doxyfile` to generate the API documentation in html and latex format (to `$MINTPY_HOME/docs/api_docs` by default).
```bash
cd $MINTPY_HOME/docs/api
/Applications/Doxygen.app/Contents/Resources/doxygen Doxyfile
open ../api_docs/html/index.html
```
+ To generate hyperlinked PDF version of the API documentation from latex:
```bash
cd $MINTPY_HOME/docs/api_docs/latex
make
```
MintPy-1.6.2/docs/api/latex.sty 0000664 0000000 0000000 00000000053 15032632755 0016325 0 ustar 00root root 0000000 0000000 \AtBeginDocument{\setcounter{tocdepth}{1}}
MintPy-1.6.2/docs/api/module_hierarchy.md 0000664 0000000 0000000 00000004756 15032632755 0020332 0 ustar 00root root 0000000 0000000 Hierarchy of sub-modules within MintPy. Level _N_ modules depends on level _N-1_, _N-2_, ..., 0 modules. Be cautious of introducing circular imports.
```
/mintpy
------------------ level 0 --------------------
constants
/defaults
auto_path
template
/objects
cluster
colors
euler_pole
giant
ramp
sensor
/stdproc
multilook
/utils
/solvers
l1
l1regls
lstl1
arg_utils
map
ptime (including progress)
utils0
/simulation
fractal
------------------ level 1 --------------------
/objects
conncomp (objects/ramp)
ionex (objects/ptime, utils/map)
stack (utils/ptime)
/utils
time_func (utils/ptime)
/simulation
decorrelation (utils/ptime)
defo_model (utils/utils0)
variance (utils/ptime)
------------------ level 2 --------------------
/utils
readfile (objects/{stack, giant, sensor}, utils/{ptime, utils0})
s1_utils (objects/{stack}, utils/{ptime, time_func})
------------------ level 3 --------------------
/objects
resample (utils/{utils0, ptime, readfile}, constants)
coord (constants, utils/{utils0, utils1, readfile})
/simulation
iono (utils/{utils0, readfile})
/utils
writefile (utils/{readfile})
network (objects/{stack, sensor}, utils/{readfile})
------------------ level 4 --------------------
/objects
gnss (objects/{stack, coord}, utils/{ptime, utils1, readfile})
stackDict (objects/{stack}, utils/{ptime, utils0, readfile})
/simulation
simulation (objects/{stack}, utils/{ptime, network}, simulation/{fractal, decorrelation, defo_model})
/utils
attribute (objects/{coord}, utils/{readfile})
utils1 (objects/{stack, ramp}, utils/{ptime, utils0, readfile, writefile})
------------------ level 5 --------------------
/utils
plot (objects/{stack, coord, colors}, utils/{ptime, utils0, readfile, network, map})
utils (objects/{stack, coord, resample}, utils/{ptime, attribute, utils1, readfile})
isce_utils (constants, utils/{ptime, readfile, writefile, attribute, utils1})
------------------ level 6 --------------------
/objects
insar_vs_gnss (objects/{stack, giant}, utils/{readfile, gnss, plot, utils})
```
MintPy-1.6.2/docs/dask.md 0000664 0000000 0000000 00000026461 15032632755 0015155 0 ustar 00root root 0000000 0000000 # Configure dask for parallel processing #
Most computations in MintPy are operated in either a pixel-by-pixel or a epoch-by-epoch basis. This implementation strategy allows processing different blocks (in space or in time) in parallel. For this purpose, we use the [`Dask`](https://docs.dask.org/en/latest/) library for its dynamic task scheduling and data collection. Dask support is currently implemented in `ifgram_inversion.py` and `dem_error.py` only (expansions to other modules are welcomed) through a thin wrapper in [`mintpy.objects.cluster`](../src/mintpy/objects/cluster.py). We have tested two types of clusters:
+ **local cluster:** on a single machine (laptop or computing node) with multiple CPU cores, suitable for laptops, local cluster/stations and distributed High Performance Cluster (HPC). No job scheduler is required.
+ **non-local cluster:** on a distributed HPC with job scheduler installed, including PBS, LSF and SLURM.
[Here](https://github.com/2gotgrossman/dask-rsmas-presentation) is an entry-level presentation on parallel computing using Dask by David Grossman. Below we brief describe for each cluster/scheduler the required options and recommended best practices.
## 1. local cluster ##
The parallel processing on a single machine is supported via [`Dask.distributed.LocalCluster`](https://docs.dask.org/en/latest/setup/single-distributed.html#localcluster). This is recommended if you are running MintPy on a local machine with multiple available cores, or on an HPC but wish to allocate only a single node's worth of resources.
#### 1.1 via command line ####
Run the following in the terminal:
```bash
ifgram_inversion.py inputs/ifgramStack.h5 --cluster local
ifgram_inversion.py inputs/ifgramStack.h5 --cluster local --num-worker 8
```
#### 1.2 via template file ####
Adjust options in the template file:
```cfg
mintpy.compute.cluster = local
mintpy.compute.numWorker = 4 #[int > 1 / all], auto for 4 (local) or 40 (slurm / pbs / lsf), set to "all" to use all available cores.
```
and feed the template file to the script:
```bash
ifgram_inversion.py inputs/ifgramStack.h5 -t smallbaselineApp.cfg
smallbaselineApp.py smallbaselineApp.cfg
```
`numWorkers = all` will allocate `os.cpu_count()` number of workers to the dask computation (for local cluster only). If the specified number of workers exceeds system resources, `os.cpu_count()/2` number of workers will be submitted instead to avoid overtaxing local systems.
#### 1.3 Testing using example data ####
Download and run the FernandinaSenDT128 example data; then run with and without local cluster:
```bash
cd FernandinaSenDT128/mintpy
ifgram_inversion.py inputs/ifgramStack.h5 -w no --cluster no
ifgram_inversion.py inputs/ifgramStack.h5 -w no --cluster local --num-worker 8
```
A typical run time without local cluster is 30 secs and with 8 workers 11.4 secs (Xeon E5-2620 v4 @ 2.10GHz).
#### 1.4 Runtime performance test on Stampede2 ####
To show the run time improvement, we test three datasets (South Isabela, Fernandina, and Kilauea) with different number of cores and same amount of allocated memory (4 GB) on a compute node in the [Stampede2 cluster's skx-normal queue](https://portal.tacc.utexas.edu/user-guides/stampede2#overview-skxcomputenodes). Results are as below:

#### 1.5 Known problems ####
As of Jun 2020, we have tried on one HPC system where local cluster worked on the head node but not on compute nodes. We attribute this to HPC configuration but don't know what exactly is the cause.
## 2. non-local cluster on HPC [work in progress] ##
**Note:** This has not been tested much. SlurmCluster works for us using a shared queue (on XSEDE's comet at SDSC) but not LSFCluster (on Miami's pegasus). We believe this is caused by the HPC configuration, but we don't know by what. Please tell us if you have an idea.
PBScluster did not work either. But we tested only on a small server without shared disk space between the workers and the client (the compute and login nodes respectively). This leads to the dask workers running on the compute nodes being unable to use mintpy code as the codebase is local to login node ([see this issue](https://github.com/dask/dask-jobqueue/issues/436)).
-------------------------------------------
The parallel proceesing on multiple machines is supported via [`Dask-jobqueue`](https://jobqueue.dask.org/en/latest/index.html). One can specify configuration either with keyword arguments when creating a `Cluster` object, or with a configuration file in YAML format. MintPy assumes the YAML configuration file only.
We provide an example [YAML configuration file](../src/mintpy/defaults/mintpy.yaml), besides the `dask.yaml`, `distributed.yaml` and `jobqueue.yaml` files in `~/.config/dask` installed by dask by default. One can copy it over to the `~/.config/dask` directory as below for dask to identify and use it.
```bash
cp $MINTPY_HOME/src/mintpy/defaults/mintpy.yaml ~/.config/dask/mintpy.yaml
```
**Note on `DASK_CONFIG`:** Besides the default `~/.config/dask` directory, one can use the `DASK_CONFIG` environment variable to use a custom directory to store the configuration files. However, it has lower priority than the default directory; and it is **generally NOT recommended**.
#### 2.1 via command line ####
Run the following in the terminal:
```bash
ifgram_inversion.py inputs/ifgramStack.h5 --cluster slurm --config slurm --num-worker 40
ifgram_inversion.py inputs/ifgramStack.h5 --cluster pbs --config pbs --num-worker 40
ifgram_inversion.py inputs/ifgramStack.h5 --cluster lsf --config lsf --num-worker 40
```
#### 2.2 via template file ####
Adjust options in the template file as below
```cfg
mintpy.compute.cluster = slurm #[local / lsf / pbs / slurm / none], auto for none, job scheduler in your HPC system
mintpy.compute.numWorker = 40 #[int > 1], auto for 4 (local) or 40 (slurm / pbs / lsf), number of workers to use
mintpy.compute.config = auto #[name / no], auto for none (to use the same name as the cluster type specified above), name of the configuration section in YAML file
```
and feed the template file to the script:
```bash
ifgram_inversion.py inputs/ifgramStack.h5 -t smallbaselineApp.cfg
smallbaselineApp.py smallbaselineApp.cfg
```
#### 2.3 Configuration parameters in `~/.config/dask/mintpy.yaml` ####
We provide a brief description below for the most commonly used configurations of dask-jobqueue for MintPy. Users are recommended to check [Dask-Jobqueue](https://jobqueue.dask.org/en/latest/configuration-setup.html) for more detailed and comprehensive documentation.
+ **name:** Name of the worker job as it will appear to the job scheduler. Any values are perfectly fine.
+ **cores:** Total number of cores your code could possibly use (not the number of cores per job/worker). It is recommended to check with your HPC cluster admin, or your HPC cluster documentation to find the number of cores that are available per compute node on your system. It is recommended to not exceed the total cores per compute node. **Required parameter for dask_jobqueue cluster objects with a non-null value.**
+ **memory:** Total amount of memory your code could possibly use (not the memory per job/worker). It is recommended to check what the maximum memory available on a compute node on you system is before setting this value. It is recommended to set this to a reasonably high value so as to ensure the dask workers do not run our memory while performing their calculations, which will result in the processing routine failing. **Required parameter for dask_jobqueue cluster objects with a non-null value. For systems that do not use the —mem directive in their job specifications, please see the section on the 'header-skip'.**
+ **processes:** Number of python processes you would like your code to use per job. For compute nodes with many cores, each core can often handle multiple running processes at a time which allow for faster computations and lower running times, without effecting slowing down the queuing time by requesting additional physical resources (cores and memory).
If left as `null`, this value will automatically be set to `~sqrt(cores)` so that the number of processes and threads per process are approximately equal. Processes can be thought of as the number of workers a given compute core can handle simultaneously, so, by setting `processes: 1` as in the default `mintpy.yaml` file, each core handles a single worker at a time, and then begins working on the next one after completing the previous one. If `processes: 5`, each core works on 5 workers at a time, and begins handling another worker as soon as any one of the previous 5 have completed.
It is generally **recommended** by dask to keep the number of processes low and instead to request additional physical resources, as specifying too many processes on some systems has been known to lead to failed jobs and workers.
+ **walltime:** Maximum amount of time your job is permitted to run on a compute node before it is killed by the node. Walltimes are required to ensure users and jobs cannot hog nodes for extended periods of time without doing any substantial computations. Most queues have maximum allowed compute times, after which still running jobs will be terminated, but this is often on the order of 48+ hours.
It is recommended to use relatively short walltimes for MintPy (the test dataset uses `wall time: 00:30:00` (30 minutes)) to have a higher priority in the job queue, but not too short, or your job may never connect to the dask scheduler and finish its computation (when in doubt, start small and work towards larger wall times as needed).
Note that the walltime format changes slightly depending on the job scheduler that is in place on your HPC system. For `LSF` schedulers, walltime is accepted and expected to be in `HH:MM` format, while `SLURM` and `PBS` schedulers only accept walltime in `HH:MM:SS` format.
+ **queue:** Scheduler queue to submit your jobs to. Most systems have several different queues with different amounts and types of resources you can request. For this reason, it is important to check with your HPC cluster admin or documentation to determine the most appropriate queue and what resources are available on that queue. Requesting for more resources (core, memory, nodes, etc.) on a queue than are available often leads to your jobs being rejected from queue, and can, on some systems, lead to fines or account suspensions.
+ **project:** Project allocation associated with your account. Most HPC systems bill projects based on the amount of resources requested, or allocate projects certain allowances based on grants or other funding, so it is important to specify the proper project for your jobs to be associated with.
+ **interface:** Network interface being used by your HPC cluster. For all tested clusters, this has been the `ib0` interface. Available network interfaces can be fond by running `ipconfig` on your login node.
+ **job-extra:** This allows you to specify additional scheduler parameters that are not support out of the box by dask. For example, some `SLURM` clusters require the presence of the `--nodes` SBATCH directive in order to be accepted by the job scheduler, but dask does not use this directive directly. It can instead be specified in the `job-extra` array, and will be written with the other directive at submit time.
MintPy-1.6.2/docs/demo_dataset.md 0000664 0000000 0000000 00000013300 15032632755 0016650 0 ustar 00root root 0000000 0000000 Here are example interferogram stacks pre-processed using different InSAR processors.
### Sentinel-1 on Fernandina with ISCE2/topsStack ###
+ Area: Fernandina volcano at Galápagos Islands, Ecuador
+ Data: Sentinel-1 A/B descending track 128 during Dec 2014 - June 2018 (98 acquisitions; [Zenodo](https://zenodo.org/record/3952953))
+ Size: ~750 MB
```bash
wget https://zenodo.org/record/3952953/files/FernandinaSenDT128.tar.xz
tar -xvJf FernandinaSenDT128.tar.xz
cd FernandinaSenDT128/mintpy
smallbaselineApp.py ${MINTPY_HOME}/docs/templates/FernandinaSenDT128.txt
```
Relevant literature:
+ Yunjun, Z., H. Fattahi, and F. Amelung (2019), Small baseline InSAR time series analysis: Unwrapping error correction and noise reduction, _Computers & Geosciences, 133,_ 104331, doi:10.1016/j.cageo.2019.104331.
### Sentinel-1 on San Francisco Bay with ARIA ###
+ Area: San Francisco Bay, California, USA
+ Data: Sentinel-1 A/B descending track 42 during May 2015 - March 2020 (114 acquisitoins; [Zenodo](https://zenodo.org/record/4265413))
+ Size: ~2.7 GB
```bash
wget https://zenodo.org/record/4265413/files/SanFranSenDT42.tar.xz
tar -xvJf SanFranSenDT42.tar.xz
cd SanFranSenDT42/mintpy
smallbaselineApp.py ${MINTPY_HOME}/docs/templates/SanFranSenDT42.txt
```
Relevant literature:
+ Chaussard, E., R. Bürgmann, H. Fattahi, R. M. Nadeau, T. Taira, C. W. Johnson, and I. Johanson (2015), Potential for larger earthquakes in the East San Francisco Bay Area due to the direct connection between the Hayward and Calaveras Faults, _Geophysical Research Letters,_ 42(8), 2734-2741, doi:10.1002/2015GL063575.
### Sentinel-1 of the 2019 Ridgecrest, California earthquake sequence with HyP3 ###
+ Area: Owens Valley, California, USA ([USGS event page](https://earthquake.usgs.gov/earthquakes/eventpage/ci38457511/executive))
+ Data: Sentinel-1 descending track 71 during June - August 2019 (7 acquisitions; [Zenodo](https://zenodo.org/record/11049257))
+ Size: ~240 MB
```bash
wget https://zenodo.org/record/11049257/files/RidgecrestSenDT71.tar.xz
tar -xvJf RidgecrestSenDT71.tar.xz
cd RidgecrestSenDT71
smallbaselineApp.py ${MINTPY_HOME}/docs/templates/RidgecrestSenDT71.txt
```
### Sentinel-1 on San Francisco Bay with GMTSAR ###
+ Area: San Francisco Bay, California, USA
+ Data: Sentinel-1 A/B descending track 42 during December 2014 - June 2024 (333 acquisitions; [Zenodo](https://zenodo.org/records/15814132))
+ Size: ~2.3 GB
```bash
wget https://zenodo.org/records/15814132/files/SanFranBaySenD42.tar.xz
tar -xvJf SanFranBaySenD42.tar.xz
cd SanFranBaySenD42
smallbaselineApp.py ${MINTPY_HOME}/docs/templates/SanFranBaySenD42.txt
```
Relevant literature:
+ Xu, X., Sandwell, D. T., Klein, E., & Bock, Y. (2021). Integrated Sentinel-1 InSAR and GNSS Time-Series Along the San Andreas Fault System. _Journal of Geophysical Research: Solid Earth, 126_(11), e2021JB022579, doi:10.1029/2021JB022579
### Envisat of the 2008 Wells, Nevada earthquake with Gamma ###
+ Area: Wells, Nevada, USA ([USGS event page](https://earthquake.usgs.gov/earthquakes/eventpage/nn00234425/executive))
+ Data: Envisat ASAR descending track 399 during July 2007 - September 2008 (11 acquisitions; [Zenodo](https://zenodo.org/record/3952950))
+ Size: ~280 MB
```bash
wget https://zenodo.org/record/3952950/files/WellsEnvD2T399.tar.xz
tar -xvJf WellsEnvD2T399.tar.xz
cd WellsEnvD2T399/mintpy
smallbaselineApp.py ${MINTPY_HOME}/docs/templates/WellsEnvD2T399.txt
```
Relevant literature:
+ Nealy, J. L., H. M. Benz, G. P. Hayes, E. A. Bergman, and W. D. Barnhart (2017), The 2008 Wells, Nevada, Earthquake Sequence: Source Constraints Using Calibrated Multiple‐Event Relocation and InSAR, _Bulletin of the Seismological Society of America_, 107(3), 1107-1117, doi:10.1785/0120160298.
### Sentinel-1 on Western Cape, South Africa with SNAP ###
+ Area: West coast of Western Cape province, South Africa
+ Data: Sentinel-1 ascending track 29 during March - June 2019 (10 acquisitions; [Zenodo](https://zenodo.org/record/4318134))
+ Size: ~520 MB
```bash
wget https://zenodo.org/record/4318134/files/WCapeSenAT29.tar.xz
tar -xvJf WCapeSenAT29.tar.xz
cd WCapeSenAT29
smallbaselineApp.py ${MINTPY_HOME}/docs/templates/WCapeSenAT29.txt
```
### ALOS on Kuju with ROI_PAC ###
+ Area: Kuju volcano at Kyushu island, SW Japan
+ Data: ALOS PALSAR ascending track 422 during January 2007 - January 2011 (24 acquisitions; [Zenodo](https://zenodo.org/record/3952917))
+ Size: ~240 MB
```bash
wget https://zenodo.org/record/3952917/files/KujuAlosAT422F650.tar.xz
tar -xvJf KujuAlosAT422F650.tar.xz
cd KujuAlosAT422F650/mintpy
smallbaselineApp.py ${MINTPY_HOME}/docs/templates/KujuAlosAT422F650.txt
```
Relevant literature:
+ Nakaboh, M., H. Ono, M. Sako, Y. Sudo, T. Hashimoto, and A. W. Hurst (2003), Continuing deflation by fumaroles at Kuju Volcano, Japan, _Geophysical Research Letters_, 30(7), doi:10.1029/2002gl016047.
+ Ishitsuka, K., T. Tsuji, T. Matsuoka, J. Nishijima, and Y. Fujimitsu (2016), Heterogeneous surface displacement pattern at the Hatchobaru geothermal field inferred from SAR interferometry time-series, _International Journal of Applied Earth Observation and Geoinformation_, 44, 95-103, doi:10.1016/j.jag.2015.07.006.
MintPy-1.6.2/docs/dir_structure.md 0000664 0000000 0000000 00000070066 15032632755 0017131 0 ustar 00root root 0000000 0000000 ## Example data directory for different InSAR processors
### ISCE / [topsStack](https://github.com/isce-framework/isce2/blob/main/contrib/stack/topsStack/README.md) ###
```
$DATA_DIR/GalapagosSenDT128
├── baselines
│ ├── 20141213_20141225
│ │ └── 20141213_20141225.txt
│ └── ...
├── ion
│ ├── 20141213_20141225
| │ ├── ion_cal
| | | ├── filt.ion
| | | ├── filt.ion.vrt
| | | ├── filt.ion.xml
| | | ├── raw_no_projection.cor
| | | ├── raw_no_projection.cor.vrt
| | | ├── raw_no_projection.cor.xml
| | | ├── ...
| | └── ...
| ├── 20141213_20150307
| └── ...
├── ion_dates
| ├── 20141213.ion
| ├── 20141213.ion.vrt
| ├── 20141213.ion.xml
| └── ...
├── merged
│ ├── geom_reference
│ │ ├── hgt.rdr
│ │ ├── hgt.rdr.full.vrt
│ │ ├── hgt.rdr.full.xml
│ │ ├── hgt.rdr.vrt
│ │ ├── hgt.rdr.xml
│ │ ├── lat.rdr
│ │ ├── lat.rdr.full.vrt
│ │ ├── lat.rdr.full.xml
│ │ ├── lat.rdr.vrt
│ │ ├── lat.rdr.xml
│ │ ├── lon.rdr
│ │ ├── lon.rdr.full.vrt
│ │ ├── lon.rdr.full.xml
│ │ ├── lon.rdr.vrt
│ │ ├── lon.rdr.xml
│ │ ├── los.rdr
│ │ ├── los.rdr.full.vrt
│ │ ├── los.rdr.full.xml
│ │ ├── los.rdr.vrt
│ │ ├── los.rdr.xml
│ │ ├── shadowMask.rdr
│ │ ├── shadowMask.rdr.full.vrt
│ │ ├── shadowMask.rdr.full.xml
│ │ ├── shadowMask.rdr.vrt
│ │ └── shadowMask.rdr.xml
│ └── interferograms
│ ├── 20141213_20141225
│ │ ├── filt_fine.cor
│ │ ├── filt_fine.cor.vrt
│ │ ├── filt_fine.cor.xml
│ │ ├── filt_fine.unw
│ │ ├── filt_fine.unw.conncomp
│ │ ├── filt_fine.unw.conncomp.vrt
│ │ ├── filt_fine.unw.conncomp.xml
│ │ ├── filt_fine.unw.vrt
│ │ ├── filt_fine.unw.xml
│ │ ├── ...
│ ├── 20141213_20150307
│ └── ...
├── reference
│ ├── data.rsc #generated by prep_isce.py
│ ├── IW1
│ ├── IW1.xml
│ ├── IW2
│ └── IW2.xml
├── secondarys
│ ├── 20141225
│ │ ├── IW1
│ │ ├── IW1.xml
│ │ ├── IW2
│ │ └── IW2.xml
│ ├── 20150307
│ └── ...
└── mintpy
└── GalapagosSenDT128.txt
```
The corresponding template options for `load_data`:
```cfg
mintpy.load.processor = isce
##---------for ISCE only:
mintpy.load.metaFile = $DATA_DIR/GalapagosSenDT128/reference/IW*.xml
mintpy.load.baselineDir = $DATA_DIR/GalapagosSenDT128/baselines
##---------interferogram datasets:
mintpy.load.unwFile = $DATA_DIR/GalapagosSenDT128/merged/interferograms/*/filt_*.unw
mintpy.load.corFile = $DATA_DIR/GalapagosSenDT128/merged/interferograms/*/filt_*.cor
mintpy.load.connCompFile = $DATA_DIR/GalapagosSenDT128/merged/interferograms/*/filt_*.unw.conncomp
##---------ionosphere stack (optional):
mintpy.load.ionUnwFile = $DATA_DIR/GalapagosSenDT128/ion/*/ion_cal/filt.ion
mintpy.load.ionCorFile = $DATA_DIR/GalapagosSenDT128/ion/*/ion_cal/raw_no_projection.cor
##---------geometry datasets:
mintpy.load.demFile = $DATA_DIR/GalapagosSenDT128/merged/geom_reference/hgt.rdr
mintpy.load.lookupYFile = $DATA_DIR/GalapagosSenDT128/merged/geom_reference/lat.rdr
mintpy.load.lookupXFile = $DATA_DIR/GalapagosSenDT128/merged/geom_reference/lon.rdr
mintpy.load.incAngleFile = $DATA_DIR/GalapagosSenDT128/merged/geom_reference/los.rdr
mintpy.load.azAngleFile = $DATA_DIR/GalapagosSenDT128/merged/geom_reference/los.rdr
mintpy.load.shadowMaskFile = $DATA_DIR/GalapagosSenDT128/merged/geom_reference/shadowMask.rdr
```
### ISCE / [stripmapStack](https://github.com/isce-framework/isce2/blob/main/contrib/stack/stripmapStack/README.md) ###
```
$DATA_DIR/KirishimaAlosAT424F620_630
├── baselines
│ ├── 20060624_20060924.txt
│ ├── 20060624_20061225.txt
│ └── ...
├── geom_reference
│ ├── hgt.rdr
│ ├── hgt.rdr.full.vrt
│ ├── hgt.rdr.full.xml
│ ├── hgt.rdr.vrt
│ ├── hgt.rdr.xml
│ ├── incLocal.rdr
│ ├── incLocal.rdr.full.vrt
│ ├── incLocal.rdr.full.xml
│ ├── incLocal.rdr.vrt
│ ├── incLocal.rdr.xml
│ ├── lat.rdr
│ ├── lat.rdr.full.vrt
│ ├── lat.rdr.full.xml
│ ├── lat.rdr.vrt
│ ├── lat.rdr.xml
│ ├── lon.rdr
│ ├── lon.rdr.full.vrt
│ ├── lon.rdr.full.xml
│ ├── lon.rdr.vrt
│ ├── lon.rdr.xml
│ ├── los.rdr
│ ├── los.rdr.full.vrt
│ ├── los.rdr.full.xml
│ ├── los.rdr.vrt
│ ├── los.rdr.xml
│ ├── shadowMask.rdr
│ ├── shadowMask.rdr.full.vrt
│ ├── shadowMask.rdr.full.xml
│ ├── shadowMask.rdr.vrt
│ └── shadowMask.rdr.xml
├── merged
│ ├── baselines
│ │ ├── 20060624
│ │ │ ├── 20060624
│ │ │ ├── 20060624.full.vrt
│ │ │ ├── 20060624.vrt
│ │ │ └── 20060624.xml
│ │ ├── 20060924
│ │ │ ├── 20060924
│ │ │ ├── 20060924.full.vrt
│ │ │ ├── 20060924.vrt
│ │ │ └── 20060924.xml
│ │ └── ...
│ └── SLC
│ ├── 20060624
│ │ ├── ...
│ │ └── referenceShelve
│ │ ├── data.bak
│ │ ├── data.dat
│ │ ├── data.dir
│ │ └── data.rsc #generated by prep_isce.py
│ ├── 20060924
│ └── ...
├── Igrams
│ ├── 20060624_20061225
│ │ ├── filt_20060624_20061225.cor
│ │ ├── filt_20060624_20061225.cor.vrt
│ │ ├── filt_20060624_20061225.cor.xml
│ │ ├── filt_20060624_20061225_snaphu.unw
│ │ ├── filt_20060624_20061225_snaphu.unw.conncomp
│ │ ├── filt_20060624_20061225_snaphu.unw.conncomp.vrt
│ │ ├── filt_20060624_20061225_snaphu.unw.conncomp.xml
│ │ ├── filt_20060624_20061225_snaphu.unw.vrt
│ │ └── filt_20060624_20061225_snaphu.unw.xml
│ ├── 20060624_20080814
│ └── ...
├── ionosphere
│ ├── 20070107_20071125
│ │ ├── iono.bil.unwCor.filt
│ │ ├── iono.bil.unwCor.filt.vrt
│ │ ├── iono.bil.unwCor.filt.xml
│ │ ├── mask.bil
│ │ ├── mask.bil.vrt
│ │ └── mask.bil.xml
│ ├── 20070107_20080110
│ └── ...
└── mintpy
└── KirishimaAlosAT424F620_630.txt
```
The corresponding template options for `load_data`:
```cfg
mintpy.load.processor = isce
##---------for ISCE only:
mintpy.load.metaFile = $DATA_DIR/KirishimaAlosAT424/merged/SLC/*/referenceShelve/data.dat
mintpy.load.baselineDir = $DATA_DIR/KirishimaAlosAT424/baselines
##---------interferogram datasets:
mintpy.load.unwFile = $DATA_DIR/KirishimaAlosAT424/Igrams/*/filt_*.unw
mintpy.load.corFile = $DATA_DIR/KirishimaAlosAT424/Igrams/*/filt_*.cor
mintpy.load.connCompFile = $DATA_DIR/KirishimaAlosAT424/Igrams/*/filt_*.unw.conncomp
##---------ionosphere stack (optional):
mintpy.load.ionUnwFile = $DATA_DIR/KirishimaAlosAT424/ionosphere/*/iono*.filt
##---------geometry datasets:
mintpy.load.demFile = $DATA_DIR/KirishimaAlosAT424/geom_reference/hgt.rdr
mintpy.load.lookupYFile = $DATA_DIR/KirishimaAlosAT424/geom_reference/lat.rdr
mintpy.load.lookupXFile = $DATA_DIR/KirishimaAlosAT424/geom_reference/lon.rdr
mintpy.load.incAngleFile = $DATA_DIR/KirishimaAlosAT424/geom_reference/los.rdr
mintpy.load.azAngleFile = $DATA_DIR/KirishimaAlosAT424/geom_reference/los.rdr
mintpy.load.shadowMaskFile = $DATA_DIR/KirishimaAlosAT424/geom_reference/shadowMask.rdr
```
### ISCE / [alosStack](https://github.com/isce-framework/isce2/blob/main/contrib/stack/alosStack/alosStack_tutorial.txt) ###
```
$DATA_DIR/NCalAlos2DT169
├── alosStack.xml
├── baseline
│ ├── baseline_center.txt
│ └── ...
├── dates_ion
│ ├── filt_ion_150225_5rlks_28alks.ion
│ ├── filt_ion_150225_5rlks_28alks.ion.vrt
│ ├── filt_ion_150225_5rlks_28alks.ion.xml
│ └── ...
├── dates_resampled
│ ├── 150225
│ │ ├── 150225.track.xml #only in reference date folder
│ │ ├── f1_2800
│ │ │ ├── 150225.frame.xml #only in reference date folder
│ │ │ └── ...
│ │ └── insar
│ │ ├── 150225_1rlks_14alks.hgt #the following files only in reference date folder
│ │ ├── ...
│ │ ├── 150225_5rlks_28alks.hgt
│ │ ├── 150225_5rlks_28alks.hgt.vrt
│ │ ├── 150225_5rlks_28alks.hgt.xml
│ │ ├── 150225_5rlks_28alks.lat
│ │ ├── 150225_5rlks_28alks.lat.vrt
│ │ ├── 150225_5rlks_28alks.lat.xml
│ │ ├── 150225_5rlks_28alks.lon
│ │ ├── 150225_5rlks_28alks.lon.vrt
│ │ ├── 150225_5rlks_28alks.lon.xml
│ │ ├── 150225_5rlks_28alks.los
│ │ ├── 150225_5rlks_28alks.los.vrt
│ │ ├── 150225_5rlks_28alks.los.xml
│ │ ├── 150225_5rlks_28alks.wbd
│ │ ├── 150225_5rlks_28alks.wbd.vrt
│ │ ├── 150225_5rlks_28alks.wbd.xml
│ │ └── ...
│ └── ...
├── pairs
│ ├── 150225-150408
│ │ ├── 150225.track.xml
│ │ ├── 150408.track.xml
│ │ ├── f1_2800
│ │ │ ├── 150225.frame.xml
│ │ │ ├── 150408.frame.xml
│ │ │ └── ...
│ │ └── insar
│ │ ├── 150225-150408_5rlks_28alks.cor
│ │ ├── 150225-150408_5rlks_28alks.cor.vrt
│ │ ├── 150225-150408_5rlks_28alks.cor.xml
│ │ ├── filt_150225-150408_5rlks_28alks.unw
│ │ ├── filt_150225-150408_5rlks_28alks.unw.conncomp
│ │ ├── filt_150225-150408_5rlks_28alks.unw.conncomp.vrt
│ │ ├── filt_150225-150408_5rlks_28alks.unw.conncomp.xml
│ │ ├── filt_150225-150408_5rlks_28alks.unw.vrt
│ │ ├── filt_150225-150408_5rlks_28alks.unw.xml
│ │ └── ...
│ └── ...
├── pairs_ion
│ ├── 150225-150408
│ │ ├── 150225.track.xml
│ │ ├── 150408.track.xml
│ │ ├── f1_2800
│ │ │ ├── 150225.frame.xml
│ │ │ ├── 150408.frame.xml
│ │ │ └── ...
│ │ └── ion
│ │ ├── ion_cal
│ │ │ ├── diff_150225-150408_80rlks_448alks.int
│ │ │ ├── diff_150225-150408_80rlks_448alks.int.vrt
│ │ │ ├── diff_150225-150408_80rlks_448alks.int.xml
│ │ │ ├── filt_ion_80rlks_448alks.ion
│ │ │ ├── filt_ion_80rlks_448alks.ion.vrt
│ │ │ ├── filt_ion_80rlks_448alks.ion.xml
│ │ │ ├── filt_ion_80rlks_448alks.std
│ │ │ ├── filt_ion_80rlks_448alks.std.vrt
│ │ │ ├── filt_ion_80rlks_448alks.std.xml
│ │ │ └── ...
│ │ └── ...
│ └── ...
└── mintpy
└── NCalAlos2DT169.txt
```
The corresponding template options for `load_data`:
```cfg
mintpy.load.processor = isce
## NOTE: 150408 is the reference date of alosStack processing.
## (parameter "reference date of the stack" of alosStack input xml file)
##---------for ISCE only:
mintpy.load.metaFile = $DATA_DIR/NCalAlos2DT169/dates_res*/150408/150408.track.xml
mintpy.load.baselineDir = $DATA_DIR/NCalAlos2DT169/baseline
##---------interferogram datasets:
mintpy.load.unwFile = $DATA_DIR/NCalAlos2DT169/pairs/*-*/insar/filt_*-*_5rlks_28alks.unw
mintpy.load.corFile = $DATA_DIR/NCalAlos2DT169/pairs/*-*/insar/*-*_5rlks_28alks.cor
mintpy.load.connCompFile = $DATA_DIR/NCalAlos2DT169/pairs/*-*/insar/filt_*-*_5rlks_28alks.unw.conncomp
##---------ionosphere stack (optional):
mintpy.load.ionUnwFile = $DATA_DIR/NCalAlos2DT169/pairs_ion/*-*/ion/ion_cal/filt_ion_*.ion
mintpy.load.ionCorFile = $DATA_DIR/NCalAlos2DT169/pairs_ion/*-*/ion/ion_cal/diff_*.cor
##---------geometry datasets:
mintpy.load.demFile = $DATA_DIR/NCalAlos2DT169/dates_res*/150408/insar/*_5rlks_28alks.hgt
mintpy.load.lookupYFile = $DATA_DIR/NCalAlos2DT169/dates_res*/150408/insar/*_5rlks_28alks.lat
mintpy.load.lookupXFile = $DATA_DIR/NCalAlos2DT169/dates_res*/150408/insar/*_5rlks_28alks.lon
mintpy.load.incAngleFile = $DATA_DIR/NCalAlos2DT169/dates_res*/150408/insar/*_5rlks_28alks.los
mintpy.load.azAngleFile = $DATA_DIR/NCalAlos2DT169/dates_res*/150408/insar/*_5rlks_28alks.los
mintpy.load.waterMaskFile = $DATA_DIR/NCalAlos2DT169/dates_res*/150408/insar/*_5rlks_28alks.wbd
```
### ARIA from [ARIA-tools](https://github.com/aria-tools/ARIA-tools) ###
1. Download GUNW products using [ariaDownload.py](https://nbviewer.jupyter.org/github/aria-tools/ARIA-tools-docs/blob/master/JupyterDocs/ariaDownload/ariaDownload_tutorial.ipynb).
2. Prepare GUNW products layers for time series analysis using [ariaTSsetup.py](https://nbviewer.jupyter.org/github/aria-tools/ARIA-tools-docs/blob/master/JupyterDocs/ariaTSsetup/ariaTSsetup_tutorial.ipynb)
```
$DATA_DIR/SanFranSenDT42
├── DEM
│ ├── SRTM_3arcsec.dem
│ ├── SRTM_3arcsec.dem.aux.xml
│ ├── SRTM_3arcsec.dem.vrt
│ ├── SRTM_3arcsec.hdr
│ └── ...
├── azimuthAngle
│ ├── 20150605_20150512
│ ├── 20150605_20150512.aux.xml
│ ├── 20150605_20150512.hdr
│ └── 20150605_20150512.vrt
├── coherence
│ ├── 20150605_20150512
│ ├── 20150605_20150512.aux.xml
│ ├── 20150605_20150512.hdr
│ ├── 20150605_20150512.vrt
│ └── ...
├── connectedComponents
│ ├── 20150605_20150512
│ ├── 20150605_20150512.aux.xml
│ ├── 20150605_20150512.hdr
│ ├── 20150605_20150512.vrt
│ └── ...
├── incidenceAngle
│ ├── 20150605_20150512
│ ├── 20150605_20150512.aux.xml
│ ├── 20150605_20150512.hdr
│ └── 20150605_20150512.vrt
├── mask
│ ├── watermask.hdr
│ ├── watermask.msk
│ ├── watermask.msk.aux.xml
│ ├── watermask.msk.vrt
│ └── ...
├── mintpy
│ ├── SanFranSenDT42.txt
│ └── ...
├── products
│ ├── S1-GUNW-D-R-042-tops-20150605_20150512-140722-39616N_37642N-PP-e396-v2_0_0.nc
│ ├── S1-GUNW-D-R-042-tops-20150605_20150512-140746-38125N_36150N-PP-24d1-v2_0_0.nc
│ └── ...
├── stack
│ ├── cohStack.vrt
│ ├── connCompStack.vrt
│ └── unwrapStack.vrt
└── unwrappedPhase
├── 20150605_20150512
├── 20150605_20150512.aux.xml
├── 20150605_20150512.hdr
├── 20150605_20150512.vrt
└── ...
```
The corresponding template options for `load_data`:
```cfg
mintpy.load.processor = aria
##---------interferogram datasets:
mintpy.load.unwFile = $DATA_DIR/SanFranSenDT42/stack/unwrapStack.vrt
mintpy.load.corFile = $DATA_DIR/SanFranSenDT42/stack/cohStack.vrt
mintpy.load.connCompFile = $DATA_DIR/SanFranSenDT42/stack/connCompStack.vrt
##---------geometry datasets:
mintpy.load.demFile = $DATA_DIR/SanFranSenDT42/DEM/SRTM_3arcsec.dem
mintpy.load.incAngleFile = $DATA_DIR/SanFranSenDT42/incidenceAngle/*.vrt
mintpy.load.azAngleFile = $DATA_DIR/SanFranSenDT42/azimuthAngle/*.vrt
mintpy.load.waterMaskFile = $DATA_DIR/SanFranSenDT42/mask/watermask.msk
```
### [HyP3](https://hyp3-docs.asf.alaska.edu/)
1. Search, request and download interferograms using [hyp3_sdk](https://nbviewer.jupyter.org/github/ASFHyP3/hyp3-sdk/blob/main/docs/sdk_example.ipynb) or the [ASF Vertex website](https://search.asf.alaska.edu/) following the [story map](https://storymaps.arcgis.com/stories/68a8a3253900411185ae9eb6bb5283d3).
+ For at least one interferogram, download the accompanying DEM.
+ Unzip the downloaded files. E.g., `for f in *.zip; do unzip $f; done` in bash.
2. Clip all image files (interferograms, coherence, DEM, etc.) to the same area.
An in-depth guide to performing these steps is available in this [Jupyter Notebook](https://github.com/ASFHyP3/hyp3-docs/blob/develop/docs/tutorials/hyp3_insar_stack_for_ts_analysis.ipynb).
HyP3 produces two types of InSAR products: 1) scene-wide products using Gamma and 2) burst-wide products using ISCE2.
+ INSAR_GAMMA directory structure:
```
$DATA_DIR/RidgecrestSenDT71
├── hyp3
│ ├── S1AA_20190610T015047_20190622T015048_VVP012_INT80_G_ueF_48FE
│ │ ├── S1AA_20190610T015047_20190622T015048_VVP012_INT80_G_ueF_48FE_corr_clip.tif
│ │ ├── S1AA_20190610T015047_20190622T015048_VVP012_INT80_G_ueF_48FE_dem_clip.tif
│ │ ├── S1AA_20190610T015047_20190622T015048_VVP012_INT80_G_ueF_48FE_lv_theta_clip.tif
│ │ ├── S1AA_20190610T015047_20190622T015048_VVP012_INT80_G_ueF_48FE_lv_phi_clip.tif
│ │ ├── S1AA_20190610T015047_20190622T015048_VVP012_INT80_G_ueF_48FE_unw_phase_clip.tif
│ │ ├── S1AA_20190610T015047_20190622T015048_VVP012_INT80_G_ueF_48FE_water_mask_clip.tif
│ │ ├── S1AA_20190610T015047_20190622T015048_VVP012_INT80_G_ueF_48FE.txt
│ │ └── ...
│ ├── S1AA_20190622T015048_20190704T015049_VVP012_INT80_G_ueF_44D1
│ │ ├── S1AA_20190622T015048_20190704T015049_VVP012_INT80_G_ueF_44D1_corr_clip.tif
│ │ ├── S1AA_20190622T015048_20190704T015049_VVP012_INT80_G_ueF_44D1_unw_phase_clip.tif
│ │ ├── S1AA_20190622T015048_20190704T015049_VVP012_INT80_G_ueF_44D1.txt
│ │ └── ...
│ └── ...
└── mintpy
└── RidgecrestSenDT71.txt
```
+ INSAR_ISCE2_BURST directory structure:
```
$DATA_DIR/MtEdgecumbeSenAT174
├── hyp3
│ ├── S1_372326_IW3_20141017_20141110_VV_INT80_7044
│ │ ├── S1_372326_IW3_20141017_20141110_VV_INT80_7044_dem_clipped.tif
│ │ ├── S1_372326_IW3_20141017_20141110_VV_INT80_7044_corr_clipped.tif
│ │ ├── S1_372326_IW3_20141017_20141110_VV_INT80_7044_lv_theta_clipped.tif
│ │ ├── S1_372326_IW3_20141017_20141110_VV_INT80_7044_lv_phi_clipped.tif
│ │ ├── S1_372326_IW3_20141017_20141110_VV_INT80_7044_unw_phase_clipped.tif
│ │ ├── S1_372326_IW3_20141017_20141110_VV_INT80_7044_water_mask_clipped.tif
│ │ ├── S1_372326_IW3_20141017_20141110_VV_INT80_7044.txt
│ │ └── ...
│ ├── S1_372326_IW3_20141110_20141204_VV_INT80_1894
│ │ ├── S1_372326_IW3_20141110_20141204_VV_INT80_1894_corr_clipped.tif
│ │ ├── S1_372326_IW3_20141110_20141204_VV_INT80_1894_unw_phase_clipped.tif
│ │ ├── S1_372326_IW3_20141110_20141204_VV_INT80_1894.txt
│ │ └── ...
│ └── ...
└── mintpy
└── MtEdgecumbeSenAT174.txt
```
The corresponding template options for `load_data`:
```cfg
mintpy.load.processor = hyp3
##---------interferogram datasets:
mintpy.load.unwFile = $DATA_DIR/RidgecrestSenDT71/hyp3/*/*unw_phase_clip.tif
mintpy.load.corFile = $DATA_DIR/RidgecrestSenDT71/hyp3/*/*corr_clip.tif
##---------geometry datasets:
mintpy.load.demFile = $DATA_DIR/RidgecrestSenDT71/hyp3/*/*dem_clip.tif
mintpy.load.incAngleFile = $DATA_DIR/RidgecrestSenDT71/hyp3/*/*lv_theta_clip.tif
mintpy.load.azAngleFile = $DATA_DIR/RidgecrestSenDT71/hyp3/*/*lv_phi_clip.tif
mintpy.load.waterMaskFile = $DATA_DIR/RidgecrestSenDT71/hyp3/*/*water_mask_clip.tif
```
### [GMTSAR](https://github.com/gmtsar/gmtsar) ###
Below is a recipe to prepare a stack of interferograms from Sentinel-1:
+ [https://topex.ucsd.edu/gmtsar/tar/sentinel_time_series_2.pdf](https://topex.ucsd.edu/gmtsar/tar/sentinel_time_series_2.pdf)
```
$DATA_DIR/SanFranBaySenD42
├── baseline_table.dat
├── config.tops.txt # configuration file for p2p_processing.csh
├── supermaster.PRM
├── geometry
| ├── dem.grd
| ├── azimuth_angle.grd
│ ├── incidence_angle.grd
│ └── water_mask.grd
├── interferograms
│ ├── 2004114_2004324
│ │ ├── corr_ll.grd
│ │ └── unwrap_ll.grd
│ ├── 2004114_2004359
│ └── ...
└── mintpy
└── SanFranBaySenD42.txt
```
The corresponding template options for `load_data`:
```cfg
## manually specify the following attributes since they are missing from gmtsar products
ALOOKS = 8 #[int], number of looks in the azimuth direction
RLOOKS = 32 #[int], number of looks in the range direction
HEADING = -168.0 #[float], satellite heading angle, measured from the north in clockwise as positive
# One could open the *.kml file in Google Earth and measure it manually
mintpy.load.processor = gmtsar
mintpy.load.metaFile = $DATA_DIR/SanFranBaySenD42/supermaster.PRM
mintpy.load.baselineDir = $DATA_DIR/SanFranBaySenD42/baseline_table.dat
##---------interferogram datasets:
mintpy.load.unwFile = $DATA_DIR/SanFranBaySenD42/interferograms/*/unwrap_ll*.grd
mintpy.load.corFile = $DATA_DIR/SanFranBaySenD42/interferograms/*/corr_ll*.grd
##---------geometry datasets:
mintpy.load.demFile = $DATA_DIR/SanFranBaySenD42/geometry/dem.grd
mintpy.load.incAngleFile = $DATA_DIR/SanFranBaySenD42/geometry/incidence_angle.grd
mintpy.load.azAngleFile = $DATA_DIR/SanFranBaySenD42/geometry/azimuth_angle.grd
mintpy.load.waterMaskFile = $DATA_DIR/SanFranBaySenD42/geometry/water_mask.grd
```
### Gamma ###
```
$DATA_DIR/GalapagosEnvA2T061
├── geometry
│ ├── sim_20040207_4rlks.UTM_TO_RDC
│ ├── sim_20040207_4rlks.diff_par
│ ├── sim_20040207_4rlks.rdc.dem (or sim_150911.hgt_sim)
│ └── sim_20040207_4rlks.utm.dem.par
├── interferograms
│ ├── 20030329_20030503
│ │ ├── 20030329_20030503_4rlks.base_perp #generated by base_perp
│ │ ├── 20030329_20030503_4rlks.baseline #generated by base_orbit
│ │ ├── 20030329_20030503_4rlks.off
│ │ ├── 20030329_4rlks.ramp.corner
│ │ ├── 20030329_4rlks.ramp.corner_full #generated by SLC_corners
│ │ ├── 20030329_4rlks.ramp.par
│ │ ├── 20030503_4rlks.ramp.par
│ │ ├── filt_20030329_20030503_4rlks.cor
│ │ └── diff_filt_20030329_20030503_4rlks.unw
│ ├── 20030329_20030607
│ └── ...
└── mintpy
└── GalapagosEnvA2T061.txt
```
The corresponding template options for `load_data`:
```cfg
mintpy.load.processor = gamma
##---------interferogram datasets:
mintpy.load.unwFile = $DATA_DIR/GalapagosEnvA2T061/interferograms/*/diff*rlks.unw
mintpy.load.corFile = $DATA_DIR/GalapagosEnvA2T061/interferograms/*/*filt*rlks.cor
mintpy.load.connCompFile = None
##---------geometry datasets:
mintpy.load.demFile = $DATA_DIR/GalapagosEnvA2T061/geometry/sim*rlks.rdc.dem
mintpy.load.lookupYFile = $DATA_DIR/GalapagosEnvA2T061/geometry/sim*rlks.UTM_TO_RDC
mintpy.load.lookupXFile = $DATA_DIR/GalapagosEnvA2T061/geometry/sim*rlks.UTM_TO_RDC
```
### [SNAP](http://step.esa.int/) ###
Below is a preliminary recipe to prepare a stack of geocoded interferograms of Sentinel-1:
+ [https://github.com/insarlab/MintPy/wiki/SNAP-input-data](https://github.com/insarlab/MintPy/wiki/SNAP-input-data)
```
$DATA_DIR/WCapeSenAT29
├── interferograms
│ ├── 20190408_20190420
│ │ ├── 20190408_20190420_coh_tc.dim
│ │ ├── 20190408_20190420_coh_tc.data
│ │ │ ├── coh*.img
│ │ │ └── coh*.hdr
│ │ ├── 20190408_20190420_filt_int_sub_tc.dim
│ │ ├── 20190408_20190420_filt_int_sub_tc.data
│ │ │ ├── Phase_ifg*.img
│ │ │ └── Phase_ifg*.hdr
│ │ ├── 20190408_20190420_unw_tc.dim
│ │ ├── 20190408_20190420_unw_tc.data
│ │ │ ├── Unw_Phase_ifg*.img
│ │ │ └── Unw_Phase_ifg*.hdr
│ ├── 20190408_20190502
│ └── ...
├── dem_tc.dim
├── dem_tc.data
│ ├── dem*.img
│ └── dem*.hdr
└── mintpy
└── WCapeSenAT29.txt
```
The corresponding template options for `load_data`:
```cfg
mintpy.load.processor = snap
##---------interferogram datasets:
mintpy.load.unwFile = $DATA_DIR/WCapeSenAT29/interferograms/*/*/Unw_*.img
mintpy.load.corFile = $DATA_DIR/WCapeSenAT29/interferograms/*/*/coh_*.img
##---------geometry datasets:
mintpy.load.demFile = $DATA_DIR/WCapeSenAT29/dem_tc.data/dem*.img
```
### ROI_PAC (rsmas version) ###
```
$DATA_DIR/GalapagosAlosAT133
├── PROCESS
│ ├── bl_list.txt
│ ├── DONE
│ │ ├── IFGRAM_GalapagosT133F7160_7180AlosA_080304-100910_0920_-0272
│ │ │ ├── 080304_100910_baseline.rsc
│ │ │ ├── filt_080304-100910-sim_HDR_8rlks_c10_snap_connect.byt
│ │ │ ├── filt_080304-100910-sim_HDR_8rlks_c10.unw
│ │ │ ├── filt_080304-100910-sim_HDR_8rlks_c10.unw.rsc
│ │ │ ├── filt_080304-100910-sim_HDR_8rlks.cor
│ │ │ ├── filt_080304-100910-sim_HDR_8rlks.cor.rsc
│ │ │ ├── radar_8rlks.hgt
│ │ │ └── radar_8rlks.hgt.rsc
│ │ └── ...
│ ├── GEO
│ │ └── geo_100610-100910 # reference interferogram
│ │ ├── geomap_8rlks.trans
│ │ └── geomap_8rlks.trans.rsc
│ ├── ifgram_list.txt
│ └── reference_ifgram.txt
└── mintpy
└── GalapagosAlosAT133.txt
```
The corresponding template options for `load_data`:
```cfg
mintpy.load.processor = roipac #[isce,roipac,gamma,], auto for isce
##---------interferogram datasets:
mintpy.load.unwFile = $DATA_DIR/GalapagosAlosAT133/PROCESS/DONE/IFG*/filt*.unw
mintpy.load.corFile = $DATA_DIR/GalapagosAlosAT133/PROCESS/DONE/IFG*/filt*.cor
mintpy.load.connCompFile = $DATA_DIR/GalapagosAlosAT133/PROCESS/DONE/IFG*/filt*snap_connect.byt
##---------geometry datasets:
mintpy.load.demFile = $DATA_DIR/GalapagosAlosAT133/PROCESS/DONE/IFG*100610-100910*/radar_*rlks.hgt
mintpy.load.lookupYFile = $DATA_DIR/GalapagosAlosAT133/PROCESS/GEO/geo_100610-100910/geomap_*rlks.trans
mintpy.load.lookupXFile = $DATA_DIR/GalapagosAlosAT133/PROCESS/GEO/geo_100610-100910/geomap_*rlks.trans
```
MintPy-1.6.2/docs/docker.md 0000664 0000000 0000000 00000007145 15032632755 0015500 0 ustar 00root root 0000000 0000000 ## The MintPy Docker container ##
[Docker](https://docs.docker.com/get-started/) allows you to run MintPy in a dedicated container, which is essentially an efficient virtual machine. Check [here](https://docs.docker.com/install/) for the installation instruction.
### 1. Pulling the mintpy Docker image ###
We publish the mintpy Docker images in the [GitHub Container Registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry) at [ghcr.io/insarlab/mintpy](https://github.com/insarlab/MintPy/pkgs/container/mintpy).
The latest stable released version can be pulled to your local machine via the `latest` tag as:
```shell
docker pull ghcr.io/insarlab/mintpy:latest
```
The latest development version (the current HEAD of the main branch) can be pulled via the `develop` tag as:
```shell
docker pull ghcr.io/insarlab/mintpy:develop
```
Note that both `latest` and `develop` are *rolling* tags, meaning they change as MintPy evolves. Thus, in a production system, one may want to use a specific version for reproducebility. This is available (since version 1.3.3) via the version tag as:
```shell
docker pull ghcr.io/insarlab/mintpy:v1.3.3
```
### 2. Running the mintpy Docker container ###
Run the following to start an interactive shell session in the container with a host path to the data directory using [volumes](https://docs.docker.com/storage/volumes/):
```shell
docker run -it -v :/home/mambauser/data ghcr.io/insarlab/mintpy:latest
# use "docker run --name" option to name the container, e.g. "--name mintpy"
# then enter the running container as "docker exec -it mintpy"
# now inside the container
cd data/FernandinaSenDT128/mintpy
smallbaselineApp.py FernandinaSenDT128.txt
```
Or run mintpy executables directly as:
```shell
docker run -it -v :/home/mambauser/data ghcr.io/insarlab/mintpy:latest smallbaselineApp.py --help
docker run -it -v :/home/mambauser/data ghcr.io/insarlab/mintpy:latest smallbaselineApp.py /home/mambauser/data/FernandinaSenDT128/mintpy/FernandinaSenDT128.txt
```
Or run the following to launch the Jupyter Lab server, then copy and paste the printed `http://localhost:8888/lab?token=` url in a browser.
```shell
# to launch a Jupyter Notebook frontend, replace "lab" with "notebook" in the command below
docker run -p 8888:8888 -it ghcr.io/insarlab/mintpy:latest jupyter lab
```
Or launch the Jupyter server with custom startup options as:
```shell
docker run -p 8888:8888 -it ghcr.io/insarlab/mintpy:latest jupyter {lab,notebook} [JUPYTER_OPTIONS]
# to see all the custom startup option:
docker run -p 8888:8888 -it ghcr.io/insarlab/mintpy:latest jupyter {lab,notebook} --help-all
```
### Notes ###
+ The container image is built using the [mambaorg/micromamba](https://hub.docker.com/r/mambaorg/micromamba) as a base. To manage conda environments inside the container use the `micromamba` command. For more information on micromamba, see: https://github.com/mamba-org/mamba#micromamba
+ Docker tightly maps user/group ids (uid/gid) inside and outside the container. By default, a `mambauser` with `uid=1000` and `gid=1000` will run inside the container and write files as that user. If you mount in a volume, files written to that volume will be owned by the *user on your local machine* with `uid=1000` and `gid=1000`. On linux and mac these are the default uid/gid values, but on a shared or managed system, these may not be *your* uid/gid values. You can override the users running inside the container with the `--user` argument to `docker run`, see: https://docs.docker.com/engine/reference/run/#user
MintPy-1.6.2/docs/google_earth.md 0000664 0000000 0000000 00000006501 15032632755 0016663 0 ustar 00root root 0000000 0000000 MintPy use [pyKML](https://pythonhosted.org/pykml/) to generate KMZ (Keyhole Markup Zip) files for easy offline viewing in [Google Earth](https://www.google.com/earth/) via `save_kmz_timeseries.py` and `save_kmz.py` script. Below are screenshots of the displacement time-series and average velocity of [Fernandina volcano estimated from Sentinel-1 data](demo_dataset.md).
### 1. Displacement time-series ###
`save_kmz_timeseries.py` takes 3D displacement time-series file and outputs a KMZ file with interactive time-series plot.
[Download KMZ file](https://miami.box.com/v/FernandinaSenDT128TS)
### 2. Raster image ###
`save_kmz.py` takes any 2D matrix and outputs a KMZ file with a overlay image.
[Download KMZ file](https://miami.box.com/v/FernandinaSenDT128VEL)
### Notes for developers ###
save_kmz_timeseries.py embeds a [dygraphs](http://dygraphs.com) javascript for interactive plot of the time-series deformation at each point. This allows the user to select any placemark onscreen to display the time-series data in an interactive chart. Placemarks are colored based on the velocity.
The script also use the [regions KML feature](https://developers.google.com/kml/documentation/regions) to support very large datasets without sacrificing resolution. It divides the data matrix into regionalized boxes, nests them using network links so that Google Earth could load them in a "smart" way.
**Alert: for very large datasets, the default settings are not generic due to the various computer memories, data sizes and different preferred details. The user is highly recommended to read the following to understand how the regions feature works and adjust parameters accordingly.**
1. Level of Detail (LOD)
The script samples the input 3D dataset at 3 levels of details by default (`--steps` option): low-, moderate- and high-resolution. Each LOD is displayed at a different zoom-level (`--level-of-details` option) within Google Earth. On startup, the low-resolution LOD is displayed; then at ~20km in altitude, the low-resolution LOD disappears and the moderate-resolution LOD becomes visible; similarly, the high-resolution LOD shows at ~10km. In this way, Google Earth only has to load as many placemark as are on the screen currently. This LOD strategy drastically increases performance.
The low- and moderate-resolution LODs cover the entire region, while the high-resolution LOD covers only the actively deforming regions. These regions (red boxes below) are currently identified as boxes having >20% pixels with velocity magnitude > the global velocity median absolute deviation (`mintpy.save_kmz_timeseries.get_boxes4deforming_area`).
2. Region-based Network Links
To further increase performance, the script splits each LOD into 300x300 point subsets known as regions. Each region is written to a separate KML file and referenced via a "Network Link" in a root level KML file. Based on whether the bounding box of each region is currently on screen or not, Google Earth will load them accordingly.
MintPy-1.6.2/docs/hdfeos5.md 0000664 0000000 0000000 00000014571 15032632755 0015567 0 ustar 00root root 0000000 0000000 We support output geocoded displacement time-series product into [HDF-EOS5](http://hdfeos.org) format via `save_hdfeos5.py`. This is designed to easily share the InSAR time-series product to the broader community.
```bash
save_hdfeos5.py geo_timeseries_ERA5_ramp_demErr.h5 --tc geo_temporalCoherence.h5 --asc geo_avgSpatialCoh.h5 -m geo_maskTempCoh.h5 -g geo_geometryRadar.h5
save_hdfeos5.py timeseries_ERA5_ramp_demErr.h5 --tc temporalCoherence.h5 --asc avgSpatialCoh.h5 -m maskTempCoh.h5 -g inputs/geometryGeo.h5
```
### 1. File structure ###
```
/ Root level group
Attributes metadata in dict
/HDFEOS/GRIDS/timeseries timeseries group
/observation
/displacement 3D array of float32 in size of (n, l, w) in meter
/date 1D array of string in size of (n, ) in YYYYMMDD format.
/bperp 1D array of float32 in size of (n, ) in meter
/quality
/mask 2D array of bool_ in size of ( l, w).
/temporalCoherence 2D array of float32 in size of ( l, w).
/avgSpatialCoherence 2D array of float32 in size of ( l, w).
/geometry
/height 2D array of float32 in size of ( l, w) in meter.
/incidenceAngle 2D array of float32 in size of ( l, w) in degree.
/slantRangeDistance 2D array of float32 in size of ( l, w) in meter.
/azimuthAngle 2D array of float32 in size of ( l, w) in degree. (optional)
/shadowMask 2D array of bool in size of ( l, w). (optional)
/waterMask 2D array of bool in size of ( l, w). (optional)
/bperp 3D array of float32 in size of (n, l, w) in meter. (optional)
```
### 2. Metadata
Besides [the attributes used in MintPy](./api/attributes.md), we add extra metadata inheritated from [UNAVCO InSAR Product Archive](https://winsar.unavco.org/insar/) ([format specification](https://docs.google.com/document/d/1fm6RY8aL4hhRa88M9cd_Ejh6OL3YfibfjN1UQ7TWsmI/edit?usp=sharing)) as below:
#### 2.1 required & manual
The following metadata requires manual specification in the custom template file, e.g. [WellsEnvD2T399.txt](./templates/WellsEnvD2T399.txt).
+ **mission:** short name of the air-/space-borne SAR (constellation) mission, e.g. ALOS, ALOS2, CSK, ENV, ERS, JERS, NISAR, RS1, RS2, S1, TSX, UAV [auto-grabbed for tops/stripmap/alosStack only]
+ **beam_mode:** short name of the beam mode as used by the space agency, e.g. IW for Sentinel-1, SM for stripmap, SL for spotlight, etc. [auto-grabbed for tops/stripmapStack only]
+ **relative_orbit:** relative orbit (track / path) number [auto-grabbed for tops/stripmapStack only]
+ **first/last_frame:** first and last frame number (same if only one frame) [auto-grabbed for tops/alosStack only]
#### 2.2 recommended & manual
+ **beam_swath:** value used by the space agency, e.g. 1/2/3 for Sentinel-1 IW (default: 0)
+ **processing_dem:** DEM data source used during processing, e.g. SRTM, ASTER, NED (default: Unknown) ...
+ **unwrap_method:** method used for phase unwrapping, e.g. snaphu (default: Unknown)
+ **atmos_correct_method:** method/model used for atmospheric correction (default: None)
#### 2.3 auto-grabbed / hardwired by script
+ **first/last_date:** ISO 8601 format (YYYY-MM-DD) [auto-grabbed]
+ **data_footprint:** WKT formatted polygon outlining the area covered by the data [precise; for geocoded file only; auto-grabbed from Y/X_FIRST/STEP]. This is temporary and should be merged into scene_footprint.
+ **scene_footprint:** WKT formatted polygon outlining the area covered by the data [coarse; auto-grabbed from LON/LAT_REF1/2/3/4]
+ **processing_type:** data product processing level, e.g. INTERFEROGRAM, LOS_VELOCITY, LOS_TIMESERIES [hardwired as LOS_TIMESERIES]
+ **history:** creation date and time in ISO 8601 format (YYYY-MM-DD) [auto-grabbed]
+ **processing_software:** method/software used to generate interferograms/offsets (default: isce) [auto-grabbed from PROCESSOR]
+ **post_processing_software:** method/software used to generate time-series or velocity field [hardwired as MintPy].
+ **flight_direction:** flight direction of the satellite platform, A(scending) or D(escending) (default: Unknown) [auto-grabbed from ORBIT_DIRECTION]
+ **look_direction:** R(ight) or L(eft) [auto-grabbed from ANTENNA_SIDE]
+ **polarization:** transmit and received polarization of the radar wave: HH, VV, HH+VV, etc. (default: Unknown) [auto-grabbed from POLARIZATION]
+ **prf:** pulse repetition frequency (default: 0) [auto-grabbed from PRF]
+ **wavelength:** radar wavelength [auto-grabbed from WAVELENGTH]
### 3. Filename convention ###
Inherited from [UNAVCO InSAR Product Archive](https://winsar.unavco.org/insar/) ([format specification](https://docs.google.com/document/d/1fm6RY8aL4hhRa88M9cd_Ejh6OL3YfibfjN1UQ7TWsmI/edit?usp=sharing)), we use the filename convention below:
<SAT>\_<SW>\_<RELORB>\_<FRAME1>(\_<FRAME2>)\_<DATE1>\_<DATE2>(\_<SUB>).he5
E.g. S1_IW12_128_0593_0597_20141213_20170928.he5
| Items | Descriptions | Values |
| --------- | ------------ | -------|
| <SAT> | Mission name | ALOS, ALOS2, CSK, ENV, ERS, JERS, NISAR, RS1, RS2, S1, TSX, UAV |
| <SW> | Beam mode with swath number | SM2 (for ENV), IW3 (for S1) |
| <RELORB> | Relative orbit (track) number | 3 digits with zero padding |
| <FRAME1> | Start frame number | 4 digits with zero padding |
| <FRAME2> | End frame number | 4 digits with zero padding; shown only if it's different from \ |
| <DATE1> | Start date | YYYYMMDD |
| <DATE2> | End date | YYYYMMDD; "XXXXXXXX" if update mode is ON. |
| <SUB> | Subset range | N{:05d}_S{:05d}_W{:05d}_E{:05d} in degrees; number with precision of 3 digits after decimal * 1000; e.g. S00500_N01300_W001200_E005800; shown only if data is cropped. |
### 4. Web Viewer ###
HDF-EOS5 file format is used as the input of the University of Miami's web viewer for InSAR time-series products. Below is a screenshot of the web viewer for the dataset on Kuju volcano from ALOS-1 ascending track 422.
http://insarmaps.miami.edu
[](http://insarmaps.miami.edu/)
MintPy-1.6.2/docs/installation.md 0000664 0000000 0000000 00000026460 15032632755 0016733 0 ustar 00root root 0000000 0000000 ## 1. Install the released version ##
via conda / mamba
MintPy is available on the conda-forge channel. The latest released version can be installed via conda as:
```bash
conda install -c conda-forge mintpy
```
or via mamba as:
```bash
mamba install -c conda-forge mintpy
```
or via docker
Docker allows one to run MintPy in a dedicated container, which is essentially an efficient virtual machine, and to be independent of the platform OS. First, install docker if you have not already done so. Then run the following to pull the latest stable released container image version from MintPy GitHub Container Registry to your local machine:
```bash
docker pull ghcr.io/insarlab/mintpy:latest
```
Check docker.md for more details on Docker container image usage, e.g. pulling the development version and running in a shell or Jupyter server.
or via apt (for Linux Debian)
MintPy is available in the main archive of the Debian GNU/Linux OS. It can be installed by using your favorite package manager or running the following command:
```bash
apt install mintpy
```
The same procedure, in principle, can be used in Ubuntu and all the other Debian derivatives. Check the Debian GIS Project page for more detailed usage.
## 2. Install the development version ##
Note: The installation note below is tested on Linux and macOS, and is still experimental on Windows (may have bugs).
MintPy is written in Python 3 and relies on several Python modules, check the requirements.txt file for details. We recommend using conda to install the python environment and the prerequisite packages, because of the convenient management and default performance setting with numpy/scipy and pyresample.
### 2.1 Install on Linux ###
Click to expand for more details
a. Download source code
Run the following in your terminal to download the development version of MintPy:
```bash
cd ~/tools
git clone https://github.com/insarlab/MintPy.git
```
b. Install dependencies via conda / mamba
Install miniforge if you have not already done so. You may need to close and restart the shell for changes to take effect.
```bash
# use wget or curl to download in the command line or click from the web browser
# for macOS, use Miniforge3-MacOSX-x86_64.sh instead.
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh
bash Miniforge3-Linux-x86_64.sh -b -p ~/tools/miniforge
~/tools/miniforge/bin/mamba init bash
```
Install dependencies into a new environment, e.g. named "insar":
```bash
# Add "isce2" below to install extra dependencies if you use ISCE-2
# Add "gdal" below to install extra dependencies if you use ARIA, FRInGE, HyP3
# Add "gdal libgdal-netcdf" below to install extra dependencies if you use GMTSAR
mamba create --name insar --file ~/tools/MintPy/requirements.txt
```
or install dependencies into an existing environment:
```bash
# Add "isce2" below to install extra dependencies if you use ISCE-2
# Add "gdal" below to install extra dependencies if you use ARIA, FRInGE, HyP3
# Add "gdal libgdal-netcdf" below to install extra dependencies if you use GMTSAR
mamba activate my-existing-env
mamba install --file ~/tools/MintPy/requirements.txt
```
c. Install MintPy
via pip [recommended]
We recommend installing MintPy in the "editable" mode. This mode installs the package without copying files to your interpreter directory (e.g. the site-packages directory), thus, one could "edit" the source code and have changes take effect immediately without having to rebuild and reinstall.
```bash
python -m pip install -e ~/tools/MintPy
```
or via path setup
Add below in your source file, e.g. \~/.bash_profile for bash users or \~/.cshrc for csh/tcsh users:
```bash
if [ -z ${PYTHONPATH+x} ]; then export PYTHONPATH=""; fi
export MINTPY_HOME=~/tools/MintPy
export PATH=${PATH}:${MINTPY_HOME}/src/mintpy/cli
export PYTHONPATH=${PYTHONPATH}:${MINTPY_HOME}/src
```
### 2.2 Install on macOS ###
Click to expand for more details
Install Xcode with command line tools, if you have not already done so.
Install Xcode from App store
Install command line tools within XCode and agree to the terms of license.
Install MintPy via conda [recommended], which is the same as the instruction for Linux.
Or install MintPy via MacPorts [obsolete]
Same as the instruction for Linux, except for the "b. Install dependencies" section, which is as below. Note that the installation procedure via MacPorts has not been maintained since Sep 2022, and will likely be phased out at some point, since conda/mamba works seamlessly on both MacOS and Linux.
Install macports if you have not done so. Add the following at the bottom of your ~/.bash_profile file:
```bash
# MacPorts Installer addition on 2017-09-02_at_01:27:12: adding an appropriate PATH variable for use with MacPorts.
export PATH=/opt/local/bin:/opt/local/sbin:${PATH}
export MANPATH=/opt/local/share/man:${MANPATH}
# Finished adapting your PATH environment variable for use with MacPorts.
```
Update the port tree with the following command. If your network prevents the use of rsync or svn via HTTP of the port tree, try Portfile Sync via a Snapshot Tarball.
```
sudo port selfupdate
```
Install the dependencies by running the following:
```bash
# install dependencies with macports
# use "port -N install" to use the safe default for prompt questions
sudo port install $(cat MintPy/docs/ports.txt)
# install dependencies not available on macports: pysolid, pykml, pykdtree, pyresample, cdsapi
sudo -H /opt/local/bin/pip install git+https://github.com/insarlab/PySolid.git
sudo -H /opt/local/bin/pip install git+https://github.com/insarlab/PyAPS.git
sudo -H /opt/local/bin/pip install git+https://github.com/tylere/pykml.git
sudo -H /opt/local/bin/pip install git+https://github.com/storpipfugl/pykdtree.git
sudo -H /opt/local/bin/pip install git+https://github.com/pytroll/pyresample.git
sudo -H /opt/local/bin/pip install git+https://github.com/ecmwf/cdsapi.git
```
### 2.3 Install on Windows ###
Click to expand for more details
Same as the instruction for Linux, except for the "c. Install MintPy" section, only the pip install approaches are recommended, as the path setup approach is not tested.
## 3. Post-Installation Setup ##
#### a. ERA5 for tropospheric correction ####
Set up an account for ERA5 to download weather re-analysis datasets for tropospheric delay correction as described in insarlab/PyAPS.
WEATHER_DIR: Optionally, if you defined an environment variable named WEATHER_DIR to contain the path to a directory, MintPy will download the GAM files into the indicated directory. Also, MintPy will look for the GAM files in the directory before downloading a new one to prevent downloading multiple copies if you work with different datasets that cover the same date/time.
#### b. Dask for parallel processing ####
We recommend setting the temporary-directory in your Dask configuration file, e.g. ~/.config/dask/dask.yaml, by adding the following line, to avoid the potential workspace lock issue. Check the dask.md file for more details on parallel processing.
```yaml
temporary-directory: /tmp # Directory for local disk like /tmp, /scratch, or /local
# If you share the same machine with others, use the following instead to avoid permission issues.
# temporary-directory: /tmp/{replace_this_with_your_user_name}
```
#### c. Extra environment variables setup ####
We recommend setting the following environment variables, e.g. in your ~/.bash_profile file, to avoid occasional errors with GDAL VRT and HDF5 files I/O.
```bash
export VRT_SHARED_SOURCE=0 # do not share dataset while using GDAL VRT in a multi-threading environment
export HDF5_DISABLE_VERSION_CHECK=2 # suppress the HDF5 version warning message (0 for abort; 1/2 for printout/suppress warning message)
export HDF5_USE_FILE_LOCKING=FALSE # request that HDF5 file locks should NOT be used
```
#### d. Tab complete sub-commands ####
We recommend activating the tab completion as below if you:
1. Use bash or zsh shells
2. On Linux or macOS
3. Run MintPy in sub-commands style, e.g. mintpy view instead of view.py
```bash
activate-global-python-argcomplete --user
```
On macOS, there is a bash version compatibility issue, which can be fixed as below. If you use the default zsh shell, no fix is needed.
Click to expand for more details
macOS ships with an older version of the bash shell (run echo $BASH_VERSION to check the version number), but argcomplete requires the newer version (>=4.2), which can be installed using Homebrew as:
```bash
brew install bash
```
You will also need to add the bash to /etc/shells and change your shell via chsh as:
```bash
echo "/usr/local/bin/bash" | sudo tee -a /etc/shells
chsh -s "/usr/local/bin/bash"
```
Then run activate-global-python-argcomplete --user again. You may need to add the following to your ~/.bash_profile file.
```bash
# bash completion
if [ -f ~/.bash_completion ]; then
. ~/.bash_completion
fi
```
MintPy-1.6.2/docs/ports.txt 0000664 0000000 0000000 00000002546 15032632755 0015617 0 ustar 00root root 0000000 0000000 # compilers
gcc5
gcc7
cmake
gmake
bison
gawk
autoconf
autoconf-archive
gconf
coreutils
automake
pkgconfig
dpkg
ctags
tree
unzip
unrar
szip
p7zip
gzip
gnutar
cabextract
gawk
gsed
wget +ssl
freetype
tiff
openmotif
python37
fftw +gcc7
fftw-single +gcc7
fftw-3 +gcc7
fftw-3-long +gcc7
fftw-3-single +gcc7
aria2
openldap
openmpi-default +gcc7
openmpi-gcc7 +fortran
xorg-libXt +flat_namespace
texlive +doc +full
lapack +gfortran
eigen3 +blas +gcc7
gsl +gcc7
cgal
sfcgal
bzr
git
rsync
hdf5 +gcc7
hdfeos
hdfeos5
h5utils
netcdf +gcc7
netcdf-cxx
netcdf-fortran
postgresql95
postgresql95-server
proj
cairo
scons
pandoc
opencv +python37
gimp2
ImageMagick
samba3
swig
swig-python
gdal +expat +geos +hdf5 +netcdf +openjpeg +postgresql95 +sqlite3
py37-bokeh
py37-cartopy
py37-cvxopt +accelerate +dsdp +fftw +glpk +gsl
py37-cython
py37-dask
py37-distributed
py37-gdbm
py37-h5py
py37-joblib
py37-jupyter
py37-mpi4py +gcc7 +openmpi
py37-numpy +gcc7 +openblas
py37-scipy +gcc7 +openblas
py37-matplotlib +cairo +tkinter +webagg
py37-netcdf4 +gcc7
py37-pandas
py37-pip
py37-rich
py37-scikit-image
py37-scikit-learn
py37-shapely
py37-sphinx
py37-yaml
kealib
pandoc
zmq
postgis2 +gui +postgresql95 +raster +sfcgal +topology
wdiff
cwdiff
ndiff
atlas +gcc5
metis +gcc7
parmetis +gcc7 +openmpi
vecLibFort
suitesparse +gcc7 +metis +atlas
superlu
superlu_dist +gcc7 +openmpi
hypre +gcc7 +openmpi
c2html
sowing
MintPy-1.6.2/docs/references.md 0000664 0000000 0000000 00000021635 15032632755 0016352 0 ustar 00root root 0000000 0000000 ## Revalent Literature
+ Berardino, P., Fornaro, G., Lanari, R., & Sansosti, E. (2002). A new algorithm for surface deformation monitoring based on small baseline differential SAR interferograms. _IEEE Transactions on Geoscience and Remote Sensing, 40_(11), 2375-2383. doi:[10.1109/TGRS.2002.803792](https://doi.org/10.1109/TGRS.2002.803792)
+ Blewitt, G., Hammond, W., & Kreemer, C. (2018). Harnessing the GPS data explosion for interdisciplinary science. _Eos, 99_. doi:[10.1029/2018EO104623](https://doi.org/10.1029/2018EO104623)
+ Chaussard, E., Amelung, F., & Aoki, Y. (2013). Characterization of open and closed volcanic systems in Indonesia and Mexico using InSAR time series. _Journal of Geophysical Research: Solid Earth, 118_(8), 3957-3969. doi:[10.1002/jgrb.50288](https://doi.org/10.1002/jgrb.50288)
+ Chaussard, E., Bürgmann, R., Fattahi, H., Nadeau, R. M., Taira, T., Johnson, C. W., & Johanson, I. (2015). Potential for larger earthquakes in the East San Francisco Bay Area due to the direct connection between the Hayward and Calaveras Faults. _Geophysical Research Letters, 42_(8), 2734-2741. doi:[10.1002/2015GL063575](https://doi.org/10.1002/2015GL063575)
+ Chen, C. W., & Zebker, H. A. (2001). Two-dimensional phase unwrapping with use of statistical models for cost functions in nonlinear optimization. _Journal of the Optical Society of America A, 18_(2), 338-351. doi:[10.1364/JOSAA.18.000338](https://doi.org/10.1364/JOSAA.18.000338)
+ Doin, M. P., Lasserre, C., Peltzer, G., Cavalié, O., & Doubre, C. (2009). Corrections of stratified tropospheric delays in SAR interferometry: Validation with global atmospheric models. _Journal of Applied Geophysics, 69_(1), 35-50. doi:[10.1016/j.jappgeo.2009.03.010](https://doi.org/10.1016/j.jappgeo.2009.03.010)
+ Efron, B., & Tibshirani, R. (1986). Bootstrap methods for standard errors, confidence intervals, and other measures of statistical accuracy. _Statistical science_, 54-75. doi:[10.1214/ss/1177013815](https://doi.org/10.1214/ss/1177013815)
+ Fattahi, H., & Amelung, F. (2013). DEM Error Correction in InSAR Time Series. _IEEE Transactions on Geoscience and Remote Sensing, 51_(7), 4249-4259. doi:[10.1109/TGRS.2012.2227761](https://doi.org/10.1109/TGRS.2012.2227761)
+ Fattahi, H., & Amelung, F. (2015). InSAR bias and uncertainty due to the systematic and stochastic tropospheric delay. _Journal of Geophysical Research: Solid Earth, 120_(12), 8758-8773. doi:[10.1002/2015JB012419](https://doi.org/10.1002/2015JB012419)
+ Fattahi, H., Agram, P., & Simons, M. (2016). A Network-Based Enhanced Spectral Diversity Approach for TOPS Time-Series Analysis. _IEEE Transactions on Geoscience and Remote Sensing, 55_(2), 777-786. doi:[10.1109/TGRS.2016.2614925](https://doi.org/10.1109/TGRS.2016.2614925)
+ Fattahi, H., Simons, M., & Agram, P. (2017). InSAR Time-Series Estimation of the Ionospheric Phase Delay: An Extension of the Split Range-Spectrum Technique. _IEEE Transactions on Geoscience and Remote Sensing, 55_(10), 5984-5996. doi:[10.1109/TGRS.2017.2718566](https://doi.org/10.1109/TGRS.2017.2718566)
+ Gomba, G., Parizzi, A., Zan, F. D., Eineder, M., & Bamler, R. (2016). Toward Operational Compensation of Ionospheric Effects in SAR Interferograms: The Split-Spectrum Method. _IEEE Transactions on Geoscience and Remote Sensing, 54_(3), 1446-1461. doi:[10.1109/TGRS.2015.2481079](https://doi.org/10.1109/TGRS.2015.2481079)
+ Heflin, M., Donnellan, A., Parker, J., Lyzenga, G., Moore, A., Ludwig, L. G., et al. (2020). Automated Estimation and Tools to Extract Positions, Velocities, Breaks, and Seasonal Terms From Daily GNSS Measurements: Illuminating Nonlinear Salton Trough Deformation. _Earth and Space Scien10.1029/2011JB008731ce, 7_(7), e2019EA000644, doi:[10.1029/2019EA000644](https://doi.org/10.1029/2019EA000644)
+ Hetland, E., Musé, P., Simons, M., Lin, Y., Agram, P., & DiCaprio, C. (2012). Multiscale InSAR time series (MInTS) analysis of surface deformation. _Journal of Geophysical Research: Solid Earth, 117_(B2). doi:[10.1029/2011JB008731](https://doi.org/10.1029/2011JB008731)
+ Jolivet, R., Grandin, R., Lasserre, C., Doin, M. P., & Peltzer, G. (2011). Systematic InSAR tropospheric phase delay corrections from global meteorological reanalysis data. _Geophysical Research Letters, 38_(17), L17311. doi:[10.1029/2011GL048757](https://doi.org/10.1029/2011GL048757)
+ Jolivet, R., Agram, P. S., Lin, N. Y., Simons, M., Doin, M. P., Peltzer, G., & Li, Z. (2014). Improving InSAR geodesy using global atmospheric models. _Journal of Geophysical Research: Solid Earth, 119_(3), 2324-2341. doi:[10.1002/2013JB010588](https://doi.org/10.1002/2013JB010588)
+ Kang, Y., Lu, Z., Zhao, C., Xu, Y., Kim, J.-w., & Gallegos, A. J. (2021). InSAR monitoring of creeping landslides in mountainous regions: A case study in Eldorado National Forest, California. _Remote Sensing of Environment, 258_, 112400. doi:[10.1016/j.rse.2021.112400](https://doi.org/10.1016/j.rse.2021.112400)
+ Liang, C., Liu, Z., Fielding, E. J., & Bürgmann, R. (2018). InSAR Time Series Analysis of L-Band Wide-Swath SAR Data Acquired by ALOS-2. _IEEE Transactions on Geoscience and Remote Sensing, 56_(8), 4492-4506. doi:[10.1109/TGRS.2018.2821150](https://doi.org/10.1109/TGRS.2018.2821150)
+ Liang, C., Agram, P., Simons, M., & Fielding, E. J. (2019). Ionospheric Correction of InSAR Time Series Analysis of C-band Sentinel-1 TOPS Data. _IEEE Transactions on Geoscience and Remote Sensing, 59_(9), 6755 - 6773. doi:[10.1109/TGRS.2019.2908494](https://doi.org/10.1109/TGRS.2019.2908494)
+ Marinkovic, P., & Larsen, Y. (2013). Consequences of long-term ASAR local oscillator frequency decay - An empirical study of 10 years of data. Paper presented at _Proceedings of the Living Planet Symposium_ (abstract), European Space Agency, Edinburgh, UK.
+ Milbert, D. (2018), "solid: Solid Earth Tide", [Online]. Available: http://geodesyworld.github.io/SOFTS/solid.htm. Accessd on: 2020-09-06.
+ Morales Rivera, A. M., Amelung, F., & Mothes, P. (2016). Volcano Deformation Survey over the Northern and Central Andes with ALOS InSAR Time Series. _Geochemistry, Geophysics, Geosystems, 17_, 2869-2883. doi:[10.1002/2016GC006393](https://doi.org/10.1002/2016GC006393)
+ Pepe, A., & Lanari, R. (2006). On the extension of the minimum cost flow algorithm for phase unwrapping of multitemporal differential SAR interferograms. _IEEE Transactions on Geoscience and Remote Sensing, 44_(9), 2374-2383. doi:[10.1109/TGRS.2006.873207](https://doi.org/10.1109/TGRS.2006.873207)
+ Perissin, D., & Wang, T. (2012). Repeat-pass SAR interferometry with partially coherent targets. _IEEE Transactions on Geoscience and Remote Sensing, 50_(1), 271-280. doi:[10.1109/tgrs.2011.2160644](https://doi.org/10.1109/tgrs.2011.2160644)
+ Rosen, P. A., Hensley, S., Peltzer, G., & Simons, M. (2004). Updated repeat orbit interferometry package released. _Eos Trans. AGU, 85_(5), 47-47. doi:[10.1029/2004EO050004](https://doi.org/10.1029/2004EO050004)
+ Rosen, P. A., Gurrola, E., Sacco, G. F. & Zebker, H. (2012). The InSAR scientific computing environment. Paper presented at _EUSAR 2012_, Nuremberg, Germany.
+ Seymour, M. S., & Cumming, I. G. (1994). Maximum likelihood estimation for SAR interferometry. Paper presented at the _Proceedings of IGARSS '94 - 1994 IEEE International Geoscience and Remote Sensing Symposium_. doi:[10.1109/IGARSS.1994.399711](https://doi.org/10.1109/IGARSS.1994.399711)
+ Tough, R. J. A., Blacknell, D., & Quegan, S. (1995). A Statistical Description of Polarimetric and Interferometric Synthetic Aperture Radar Data. _Proceedings: Mathematical and Physical Sciences, 449_(1937), 567-589. doi:[10.1098/rspa.1995.0059](https://doi.org/10.1098/rspa.1995.0059)
+ Werner, C., Wegmüller, U., Strozzi, T., & Wiesmann, A. (2000). Gamma SAR and interferometric processing software. Paper presented at the _Proceedings of the ERS-Envisat symposium_, Gothenburg, Sweden.
+ Yu, C., Li, Z., Penna, N. T., & Crippa, P. (2018). Generic Atmospheric Correction Model for Interferometric Synthetic Aperture Radar Observations. _Journal of Geophysical Research: Solid Earth, 123_(10), 9202-9222. doi:[10.1029/2017JB015305](https://doi.org/10.1029/2017JB015305)
+ Yunjun, Z., Fattahi, H., & Amelung, F. (2019). Small baseline InSAR time series analysis: Unwrapping error correction and noise reduction. _Computers & Geosciences, 133_, 104331. doi:[10.1016/j.cageo.2019.104331](https://doi.org/10.1016/j.cageo.2019.104331)
+ Yunjun, Z., Fattahi, H., Pi, X., Rosen, P., Simons, M., Agram, P., & Aoki, Y. (2022). Range Geolocation Accuracy of C-/L-Band SAR and its Implications for Operational Stack Coregistration. IEEE Transactions on Geoscience and Remote Sensing, 60, 5227219. doi:[10.1109/TGRS.2022.3168509](https://doi.org/10.1109/TGRS.2022.3168509)
+ Zebker, H. A., Rosen, P. A., & Hensley, S. (1997). Atmospheric effects in interferometric synthetic aperture radar surface deformation and topographic maps. _Journal of Geophysical Research: Solid Earth, 102_(B4), 7547-7563. doi:[10.1029/96JB03804](https://doi.org/10.1029/96JB03804)
MintPy-1.6.2/docs/templates/ 0000775 0000000 0000000 00000000000 15032632755 0015676 5 ustar 00root root 0000000 0000000 MintPy-1.6.2/docs/templates/FernandinaSenDT128.txt 0000664 0000000 0000000 00000003533 15032632755 0021641 0 ustar 00root root 0000000 0000000 # vim: set filetype=cfg:
##------------------------------- ISCE/topsStack ----------------------##
#ssaraopt = --platform=SENTINEL-1A,SENTINEL-1B -r 128 -f 589,590,591,592,593 -e 2017-07-01
#sentinelStack.boundingBox = '-1 0.15 -91.6 -90.9'
#sentinelStack.subswath = 1 2 # comment
#sentinelStack.numConnections = 5 # comment
#sentinelStack.azimuthLooks = 5 # comment
#sentinelStack.rangeLooks = 15 # comment
#sentinelStack.filtStrength = 0.2 # comment
#sentinelStack.unwMethod = snaphu # comment
#sentinelStack.coregistration = auto # comment
#subset.y0:y1,x0:x1 = 1150:1600,1070:1670
##-------------------------------- MintPy -----------------------------##
########## 1. Load Data (--load to exit after this step)
## load_data.py -H to check more details and example inputs.
mintpy.load.processor = isce
##---------for ISCE only:
mintpy.load.metaFile = ../reference/IW*.xml
mintpy.load.baselineDir = ../baselines
##---------interferogram datasets:
mintpy.load.unwFile = ../merged/interferograms/*/filt_*.unw
mintpy.load.corFile = ../merged/interferograms/*/filt_*.cor
mintpy.load.connCompFile = ../merged/interferograms/*/filt_*.unw.conncomp
##---------geometry datasets:
mintpy.load.demFile = ../merged/geom_reference/hgt.rdr
mintpy.load.lookupYFile = ../merged/geom_reference/lat.rdr
mintpy.load.lookupXFile = ../merged/geom_reference/lon.rdr
mintpy.load.incAngleFile = ../merged/geom_reference/los.rdr
mintpy.load.azAngleFile = ../merged/geom_reference/los.rdr
mintpy.load.shadowMaskFile = ../merged/geom_reference/shadowMask.rdr
mintpy.load.waterMaskFile = None
mintpy.reference.lalo = -0.30,-91.43
mintpy.topographicResidual.stepDate = 20170910,20180613 #eruption dates
mintpy.deramp = linear
MintPy-1.6.2/docs/templates/GalapagosAlosAT133.template 0000664 0000000 0000000 00000006511 15032632755 0022627 0 ustar 00root root 0000000 0000000 # vim: set filetype=cfg:
################### Job Submission Setting #################
walltimeSLC = 5:00
walltimeCoregist = 3:00
walltimeProcessFilt = 15:00
walltimeProcessDone = 8:00
memorySLC = 12000
memoryCoregist = 15000 # change this for more frames
memoryProcessFilt = 12000
memoryProcessDone = 8000
########### Data Download and Focusing #####################
track = 133
startFrame = 7160
endFrame = 7180
startDate = 070115
endDate = 110313
masterDate = 100610
raw2slc_OrbitType = HDR
ssaraopt = --platform=Alos -r 133 -f 7160,7170,7180 --beamMode FBS,FBD -s 2007-01-01
########### Select Pairs / Network #########################
select.network.method = all
select.network.perpBaseMax = 1800
select.network.lengthDayMax = 1800
select.network.lengthDayMin = 0
select.network.seasonal = yes
select.network.dopOverlapThresh = 15
############### 2 Pass InSAR - ROI_PAC #####################
DEM = $SC/GalapagosT133F7160_7180AlosA/DEM/srtm1.dem
DEMg = $SC/GalapagosT133F7160_7180AlosA/DEM/srtm1_60m.dem
flattening = orbit
OrbitType = HDR
Rlooks_sim = 2
Rlooks_int = 8
Rlooks_unw = 8
unw_method = snaphu
snap_conncomthresh = 60
Filt_method = psfilt_adapt_filt
FilterStrength = 0.5/4
UnwrappedThreshold = 0.10
maskingwith0height = TRUE
ampmagFineopt = 120/120/256/64
meter_per_cycle = 6.283
pixel_ratio = 2
cleanopt = 1
################ Time Series - MintPy ######################
mintpy.load.processor = roipac #[isce,roipac,gamma,], auto for isce
mintpy.load.updateMode = auto #[yes / no], auto for yes, skip re-loading if HDF5 files are complete
mintpy.load.compression = auto #[gzip / lzf / no], auto for no [recommended].
##---------interferogram datasets:
mintpy.load.unwFile = $GALAPAGOS_DIR/GalapagosAlosAT133/ROIPAC/interferograms/*/filt*.unw
mintpy.load.corFile = $GALAPAGOS_DIR/GalapagosAlosAT133/ROIPAC/interferograms/*/filt*.cor
mintpy.load.connCompFile = $GALAPAGOS_DIR/GalapagosAlosAT133/ROIPAC/interferograms/*/filt*snap_connect.byt
mintpy.load.intFile = None #$GALAPAGOS_DIR/GalapagosAlosAT133/ROIPAC/interferograms/*/filt*rlks.int
##---------geometry datasets:
mintpy.load.demFile = $GALAPAGOS_DIR/GalapagosAlosAT133/ROIPAC/geom_master/radar_*rlks.hgt
mintpy.load.lookupYFile = $GALAPAGOS_DIR/GalapagosAlosAT133/ROIPAC/geom_master/geomap_*rlks.trans
mintpy.load.lookupXFile = $GALAPAGOS_DIR/GalapagosAlosAT133/ROIPAC/geom_master/geomap_*rlks.trans
##---------extra metadata to be loaded (to adjust for the bias in ROIPAC lookup table)
SUBSET_XMIN = 1
SUBSET_YMIN = 15
mintpy.subset.yx = 800:3700,0:1400
mintpy.reference.lalo = -0.71, -91.31 #-0.31, -91.22
mintpy.unwrapError.method = bridging
mintpy.unwrapError.waterMaskFile = waterMask.h5
mintpy.unwrapError.ramp = linear
mintpy.network.coherenceBased = yes
mintpy.network.aoiLALO = -0.84:-0.81,-91.16:-91.12
mintpy.topographicResidual.stepFuncDate = 20080529, 20090420, 20100519 #Cerro Azul, Fernandina, Alcedo,
mintpy.deramp = linear
MintPy-1.6.2/docs/templates/GalapagosEnvA2T061.txt 0000664 0000000 0000000 00000001467 15032632755 0021554 0 ustar 00root root 0000000 0000000 # vim: set filetype=cfg:
##-------------------------------- MintPy ------------------------------##
########## 1. Load Data (--load to exit after this step)
## load_data.py -H to check more details and example inputs.
mintpy.load.processor = gamma
##---------interferogram datasets:
mintpy.load.unwFile = ../GAMMA/interferograms/*/diff*rlks.unw
mintpy.load.corFile = ../GAMMA/interferograms/*/*filt*rlks.cor
mintpy.load.connCompFile = None
##---------geometry datasets:
mintpy.load.demFile = ../GAMMA/geometry/sim*rlks.rdc.dem
mintpy.load.lookupYFile = ../GAMMA/geometry/sim*rlks.UTM_TO_RDC
mintpy.load.lookupXFile = ../GAMMA/geometry/sim*rlks.UTM_TO_RDC
mintpy.subset.yx = 200:2000,200:1562
mintpy.reference.lalo = -0.31,-91.22
mintpy.deramp = linear
MintPy-1.6.2/docs/templates/GalapagosSenDT128.template 0000664 0000000 0000000 00000005323 15032632755 0022465 0 ustar 00root root 0000000 0000000 # vim: set filetype=cfg:
##----------------------------- SentinelStack/ISCE ---------------------##
cleanopt = 1 # [ 0 / 1 / 2 / 3 4] 0: no cleaning, 1: largest files, 2: merged/etc, PROCESS dirs, 3: SLC,RAW, 4: everything
ssaraopt = --platform=SENTINEL-1A,SENTINEL-1B -r 128 -f 587,588,589,590,591,592,593 -e 2018-07-01
processor = isce
sentinelStack.demDir = /nethome/famelung/Sentinel/GalapagosT128SenVVD/DEM
sentinelStack.boundingBox = '-1 0.15 -91.6 -90.9'
sentinelStack.subswath = 1 2 # comment
sentinelStack.numConnections = 5 # comment
sentinelStack.azimuthLooks = 5 # comment
sentinelStack.rangeLooks = 15 # comment
sentinelStack.filtStrength = 0.2 # comment
sentinelStack.unwMethod = snaphu # comment
sentinelStack.coregistration = auto # comment
##-------------------------------- MintPy -----------------------------##
mintpy.load.processor = isce
##---------for ISCE only:
mintpy.load.metaFile = $GALAPAGOS_DIR/GalapagosSenDT128/master/IW*.xml
mintpy.load.baselineDir = $GALAPAGOS_DIR/GalapagosSenDT128/baselines
##---------interferogram datasets:
mintpy.load.unwFile = $GALAPAGOS_DIR/GalapagosSenDT128/merged/interferograms/*/filt_*.unw
mintpy.load.corFile = $GALAPAGOS_DIR/GalapagosSenDT128/merged/interferograms/*/filt_*.cor
mintpy.load.connCompFile = $GALAPAGOS_DIR/GalapagosSenDT128/merged/interferograms/*/filt_*.unw.conncomp
##---------geometry datasets:
mintpy.load.demFile = $GALAPAGOS_DIR/GalapagosSenDT128/merged/geom_master/hgt.rdr
mintpy.load.lookupYFile = $GALAPAGOS_DIR/GalapagosSenDT128/merged/geom_master/lat.rdr
mintpy.load.lookupXFile = $GALAPAGOS_DIR/GalapagosSenDT128/merged/geom_master/lon.rdr
mintpy.load.incAngleFile = $GALAPAGOS_DIR/GalapagosSenDT128/merged/geom_master/los.rdr
mintpy.load.azAngleFile = $GALAPAGOS_DIR/GalapagosSenDT128/merged/geom_master/los.rdr
mintpy.load.shadowMaskFile = $GALAPAGOS_DIR/GalapagosSenDT128/merged/geom_master/shadowMask.rdr
mintpy.load.waterMaskFile = $GALAPAGOS_DIR/GalapagosSenDT128/merged/geom_master/waterMask.rdr
mintpy.load.bperpFile = $GALAPAGOS_DIR/GalapagosSenDT128/merged/baseline_grid/*/bperp.rdr
mintpy.subset.yx = 400:2400,0:1700
mintpy.reference.lalo = -0.31,-91.22
mintpy.network.endDate = 20180626
mintpy.unwrapError.method = bridging+phase_closure #[bridging / phase_closure / no], auto for no
mintpy.topographicResidual.stepFuncDate = 20150524,20150616,20170321,20170910,20180613 #Wolf,Wolf,CerroAzul,Fernandina,Fernandina
mintpy.deramp = linear
MintPy-1.6.2/docs/templates/KirishimaAlos2DT23F2970.template 0000664 0000000 0000000 00000004546 15032632755 0023312 0 ustar 00root root 0000000 0000000 # vim: set filetype=cfg:
##------------------------------- ISCE/stripmapStack OPTIONS ------------------##
isce.processor = stripmapStack #[stripmapStack, topsStack]
isce.demSNWE = 31, 33, 130, 132 #[S, N, W, E] in degree
isce.demFile = ${SCRATCHDIR}/KirishimaAlos2DT23F2970/DEM/gsi10m.dem.wgs84
isce.azimuthLooks = 10
isce.rangeLooks = 8
isce.maxTempBaseline = 400
isce.maxPerpBaseline = 200
isce.unwrapMethod = snaphu
isce.filtStrength = 0.5
isce.applyWaterMask = yes
##------------------------------- mintpy OPTIONS -------------------------------##
## load_data.py -H to check more details and example inputs.
mintpy.load.processor = isce
##---------for ISCE only:
mintpy.load.metaFile = ${SCRATCHDIR}/KirishimaAlos2DT23F2970/masterShelve/data.dat
mintpy.load.baselineDir = ${SCRATCHDIR}/KirishimaAlos2DT23F2970/baselines
##---------interferogram datasets:
mintpy.load.unwFile = ${SCRATCHDIR}/KirishimaAlos2DT23F2970/Igrams/*/filt_*.unw
mintpy.load.corFile = ${SCRATCHDIR}/KirishimaAlos2DT23F2970/Igrams/*/filt_*.cor
mintpy.load.connCompFile = ${SCRATCHDIR}/KirishimaAlos2DT23F2970/Igrams/*/filt_*.unw.conncomp
##---------geometry datasets:
mintpy.load.demFile = ${SCRATCHDIR}/KirishimaAlos2DT23F2970/geom_master/hgt.rdr
mintpy.load.lookupYFile = ${SCRATCHDIR}/KirishimaAlos2DT23F2970/geom_master/lat.rdr
mintpy.load.lookupXFile = ${SCRATCHDIR}/KirishimaAlos2DT23F2970/geom_master/lon.rdr
mintpy.load.incAngleFile = ${SCRATCHDIR}/KirishimaAlos2DT23F2970/geom_master/los.rdr
mintpy.load.azAngleFile = ${SCRATCHDIR}/KirishimaAlos2DT23F2970/geom_master/los.rdr
mintpy.load.shadowMaskFile = ${SCRATCHDIR}/KirishimaAlos2DT23F2970/geom_master/shadowMask.rdr
mintpy.load.waterMaskFile = ${SCRATCHDIR}/KirishimaAlos2DT23F2970/geom_master/waterMask.rdr
mintpy.load.bperpFile = None
#mintpy.reference.lalo = 31.73, 131.07
mintpy.network.coherenceBased = yes
mintpy.network.keepMinSpanTree = no
mintpy.network.minCoherence = 0.6
mintpy.troposphericDelay.weatherModel = ERA5
mintpy.deramp = linear
##------------------------------- HDF-EOS 5 metadata ———————————————————————————##
ORBIT_DIRECTION = DESCENDING
trackNumber = 23
first_frame = 2970
last_frame = 2970
MintPy-1.6.2/docs/templates/KujuAlosAT422F650.txt 0000664 0000000 0000000 00000003575 15032632755 0021224 0 ustar 00root root 0000000 0000000 # vim: set filetype=cfg:
########## 1. Load Data (--load to exit after this step)
## auto - automatic path pattern for Univ of Miami file structure
## load_data.py -H to check more details and example inputs.
mintpy.load.processor = roipac #[isce,roipac,gamma,], auto for isce
##---------interferogram datasets:
mintpy.load.unwFile = ./../interferograms/*/filt_*.unw #[path2unw_file]
mintpy.load.corFile = ./../interferograms/*/filt_*.cor #[path2cor_file]
mintpy.load.connCompFile = None #[path2conn_file]
mintpy.load.intFile = None #[path2int_file]
##---------geometry datasets:
mintpy.load.demFile = ./../geometry/radar*.hgt #[path2hgt_file]
mintpy.load.lookupYFile = ./../geometry/geomap*.trans #[path2lookup_lat/y_file]
mintpy.load.lookupXFile = ./../geometry/geomap*.trans #[path2lookup_lon/x_file]
mintpy.load.incAngleFile = None #[path2los_file]
mintpy.load.azAngleFile = None #[path2los_file]
mintpy.load.shadowMaskFile = None #[path2shadow_file]
mintpy.load.waterMaskFile = None #[path2water_mask_file]
##————————————————————————————— PROCESSING Options ——-----————————————————————##
mintpy.reference.lalo = 33.0655, 131.2076
mintpy.deramp = linear
##————————————————————————————— HDF-EOS5 Attributes -—————————————————————————##
beam_mode = SM
relative_orbit = 422
processing_type = LOS_TIMESERIES
processing_software = ROIPAC
first_frame = 650
last_frame = 650
MintPy-1.6.2/docs/templates/NCalAlos2DT169.txt 0000664 0000000 0000000 00000003271 15032632755 0020650 0 ustar 00root root 0000000 0000000 # vim: set filetype=cfg:
##-------------------------------- MintPy -----------------------------##
########## 1. Load Data (--load to exit after this step)
## load_data.py -H to check more details and example inputs.
mintpy.load.processor = isce
##NOTE: 150408 is the reference date of alosStack processing.
## (parameter "reference date of the stack" of alosStack input xml file)
##---------for ISCE only:
mintpy.load.metaFile = $DATA_DIR/NCalAlos2DT169/pairs/*-*/150408.track.xml
mintpy.load.baselineDir = $DATA_DIR/NCalAlos2DT169/baseline
##---------interferogram datasets:
mintpy.load.unwFile = $DATA_DIR/NCalAlos2DT169/pairs/*-*/insar/filt_*-*_5rlks_28alks.unw
mintpy.load.corFile = $DATA_DIR/NCalAlos2DT169/pairs/*-*/insar/*-*_5rlks_28alks.cor
mintpy.load.connCompFile = $DATA_DIR/NCalAlos2DT169/pairs/*-*/insar/filt_*-*_5rlks_28alks.unw.conncomp
##---------geometry datasets:
mintpy.load.demFile = $DATA_DIR/NCalAlos2DT169/dates_resampled/150408/insar/*_5rlks_28alks.hgt
mintpy.load.lookupYFile = $DATA_DIR/NCalAlos2DT169/dates_resampled/150408/insar/*_5rlks_28alks.lat
mintpy.load.lookupXFile = $DATA_DIR/NCalAlos2DT169/dates_resampled/150408/insar/*_5rlks_28alks.lon
mintpy.load.incAngleFile = $DATA_DIR/NCalAlos2DT169/dates_resampled/150408/insar/*_5rlks_28alks.los
mintpy.load.azAngleFile = $DATA_DIR/NCalAlos2DT169/dates_resampled/150408/insar/*_5rlks_28alks.los
mintpy.load.waterMaskFile = $DATA_DIR/NCalAlos2DT169/dates_resampled/150408/insar/*_5rlks_28alks.wbd
mintpy.reference.yx = 1500, 200
mintpy.networkInversion.weightFunc = no
mintpy.topographicResidual.pixelwiseGeometry = no
MintPy-1.6.2/docs/templates/README.md 0000664 0000000 0000000 00000001344 15032632755 0017157 0 ustar 00root root 0000000 0000000 ### Example template files for various InSAR processors ###
#### ISCE/topsStack ####
+ [FernandinaSenDT128.txt](FernandinaSenDT128.txt)
+ [GalapagosSenDT128.template](GalapagosSenDT128.template)
#### ISCE/stripmapStack ####
+ [KirishimaAlos2DT23F2970.template](KirishimaAlos2DT23F2970.template)
#### ISCE/alosStack ####
+ [NCalAlos2DT169.txt](NCalAlos2DT169.txt)
#### ARIA ####
+ [SanFranSenDT42.txt](SanFranSenDT42.txt)
#### GAMMA ####
+ [GalapagosEnvA2T061.txt](GalapagosEnvA2T061.txt)
+ [WellsEnvD2T399.txt](WellsEnvD2T399.txt)
#### SNAP ####
+ [WCapeSenAT29.txt](WCapeSenAT29.txt)
#### ROI_PAC ####
+ [KujuAlosAT422F650.txt](KujuAlosAT422F650.txt)
+ [GalapagosAlosAT133.template](GalapagosAlosAT133.template)
MintPy-1.6.2/docs/templates/RidgecrestSenDT71.txt 0000664 0000000 0000000 00000001434 15032632755 0021602 0 ustar 00root root 0000000 0000000 # vim: set filetype=cfg:
mintpy.compute.cluster = local
mintpy.load.processor = hyp3
##---------interferogram datasets:
mintpy.load.unwFile = ../hyp3/*/*unw_phase_clip.tif
mintpy.load.corFile = ../hyp3/*/*corr_clip.tif
##---------geometry datasets:
mintpy.load.demFile = ../hyp3/*/*dem_clip.tif
mintpy.load.incAngleFile = ../hyp3/*/*lv_theta_clip.tif
mintpy.load.waterMaskFile = ../hyp3/*/*water_mask_clip.tif
mintpy.reference.lalo = 391.5e4,45e4
mintpy.networkInversion.weightFunc = var
mintpy.troposphericDelay.method = pyaps
mintpy.topographicResidual = yes
mintpy.topographicResidual.stepDate = 20190706T0320
mintpy.topographicResidual.pixelwiseGeometry = yes
MintPy-1.6.2/docs/templates/SanFranBaySenD42.txt 0000664 0000000 0000000 00000002113 15032632755 0021340 0 ustar 00root root 0000000 0000000 # vim: set filetype=cfg:
## manually add the following metadata
HEADING = -168
ALOOKS = 8
RLOOKS = 32
########## computing resource configuration
mintpy.compute.maxMemory = 8
mintpy.compute.cluster = local
mintpy.compute.numWorker = 4
########## 1. Load Data (--load to exit after this step)
mintpy.load.processor = gmtsar #[isce, aria, hyp3, gmtsar, snap, gamma, roipac], auto for isce
mintpy.load.metaFile = ../supermaster.PRM
mintpy.load.baselineDir = ../baseline_table.dat
##---------interferogram datasets:
mintpy.load.unwFile = ../interferograms/*/unwrap_ll*.grd
mintpy.load.corFile = ../interferograms/*/corr_ll*.grd
##---------geometry datasets:
mintpy.load.demFile = ../geometry/dem.grd
mintpy.load.incAngleFile = ../geometry/incidence_angle.grd
mintpy.load.azAngleFile = ../geometry/azimuth_angle.grd
mintpy.load.waterMaskFile = ../geometry/water_mask.grd
mintpy.reference.lalo = 37.69, -122.07
mintpy.troposphericDelay.method = pyaps
mintpy.deramp = no
mintpy.topographicResidual = yes
MintPy-1.6.2/docs/templates/SanFranSenDT42.txt 0000664 0000000 0000000 00000001473 15032632755 0021040 0 ustar 00root root 0000000 0000000 # vim: set filetype=cfg:
mintpy.load.processor = aria #[isce, aria, snap, gamma, roipac], auto for isce
##---------interferogram datasets:
mintpy.load.unwFile = ../stack/unwrapStack.vrt
mintpy.load.corFile = ../stack/cohStack.vrt
mintpy.load.connCompFile = ../stack/connCompStack.vrt
##---------geometry datasets:
mintpy.load.demFile = ../DEM/*.dem
mintpy.load.incAngleFile = ../incidenceAngle/*.vrt
mintpy.load.azAngleFile = ../azimuthAngle/*.vrt
mintpy.load.waterMaskFile = ../mask/watermask.msk
mintpy.reference.lalo = 37.69, -122.07
mintpy.unwrapError.method = bridging
mintpy.deramp = no
## options to speedup the processing (fast but not the best)
mintpy.networkInversion.weightFunc = no
mintpy.topographicResidual.pixelwiseGeometry = no
MintPy-1.6.2/docs/templates/WCapeSenAT29.txt 0000664 0000000 0000000 00000001227 15032632755 0020506 0 ustar 00root root 0000000 0000000 # vim: set filetype=cfg:
##-------------------------------- MintPy -----------------------------##
########## 1. Load Data (--load to exit after this step)
## load_data.py -H to check more details and example inputs.
mintpy.load.processor = snap
mintpy.load.unwFile = ../interferograms/*/*/Unw_*.img
mintpy.load.corFile = ../interferograms/*/*/coh_*.img
mintpy.load.demFile = ../dem*/dem*.img
mintpy.subset.lalo = -33.10:-32.95, 17.98:18.13
mintpy.reference.lalo = -33, 18.05
mintpy.networkInversion.weightFunc = var
mintpy.deramp = linear
mintpy.topographicResidual.pixelwiseGeometry = no
MintPy-1.6.2/docs/templates/WellsEnvD2T399.txt 0000664 0000000 0000000 00000002536 15032632755 0020763 0 ustar 00root root 0000000 0000000 # vim: set filetype=cfg:
##------------------------ MintPy ----------------------------------##
mintpy.load.processor = gamma
mintpy.load.unwFile = ./../interferograms/*/diff_*rlks.unw
mintpy.load.corFile = ./../interferograms/*/filt_*rlks.cor
mintpy.load.connCompFile = None
mintpy.load.intFile = None
mintpy.load.demFile = ./../geometry/sim_*.rdc.dem
mintpy.load.lookupYFile = ./../geometry/sim_*.UTM_TO_RDC
mintpy.load.lookupXFile = ./../geometry/sim_*.UTM_TO_RDC
mintpy.load.incAngleFile = None
mintpy.load.azAngleFile = None
mintpy.load.shadowMaskFile = None
mintpy.load.waterMaskFile = None
mintpy.subset.lalo = 41.02:41.32, -115.10:-114.65
mintpy.reference.lalo = 41.03, -114.70
mintpy.network.coherenceBased = yes #[yes / no], auto for yes, exclude interferograms with coherence < minCoherence
mintpy.network.keepMinSpanTree = no
mintpy.network.excludeDate = 20071231, 20080204, 20080310
mintpy.topographicResidual.stepDate = 20080221
##------------------------ HDF-EOS5 --------------------------------##
mission = Env # ERS,ENV,S1,RS1,RS2,CSK,TSX,JERS,ALOS,ALOS2
relative_orbit = 399
first_frame = 2781
last_frame = 2781
beam_mode = IS # S2,FB08,IW
processing_software = GAMMA
MintPy-1.6.2/mkdocs.yml 0000664 0000000 0000000 00000002714 15032632755 0014757 0 ustar 00root root 0000000 0000000 site_name: MintPy
site_url: https://github.com/insarlab/MintPy
site_description: Miami InSAR Time-series software in Python
site_author: Zhang Yunjun, Heresh Fattahi
repo_url: https://github.com/insarlab/MintPy/
google_analytics: ['UA-104225904-1', 'mkdocs.org']
theme:
name: readthedocs
highlightjs: true
hljs_languages:
- yaml
- rust
markdown_extensions:
- smarty
- toc:
permalink: "#"
baselevel: 2
separator: "_"
- sane_lists
nav:
- Home: README.md
- User Guide:
- Installation: installation.md
- Example datasets: demo_dataset.md
- Example directory structure: dir_structure.md
- Example template files: templates/README.md
- Parallel processing with Dask: dask.md
- Tutorials in Jupyter Notebook: https://github.com/insarlab/MintPy-tutorial
- Frequently Asked Questions: FAQs.md
- Output:
- Google Earth KMZ: google_earth.md
- HDF-EOS5: hdfeos5.md
- QGIS: QGIS.md
- API Documentation:
- Attributes: api/attributes.md
- Colormaps: api/colormaps.md
- Coordinates: api/coord.md
- Data structure: api/data_structure.md
- Docker: docker.md
- Documents generation: api/doc_generation.md
- Module hierarchy: api/module_hierarchy.md
- About:
- Contributing: CONTRIBUTING.md
- Code of conduct: CODE_OF_CONDUCT.md
- References: references.md
MintPy-1.6.2/pyproject.toml 0000664 0000000 0000000 00000012554 15032632755 0015673 0 ustar 00root root 0000000 0000000 [build-system]
requires = ["setuptools>=64.0", "setuptools_scm[toml]>=8"]
build-backend = "setuptools.build_meta"
[project]
name = "mintpy"
description = "Miami INsar Time-series software in PYthon"
authors = [
{ name = "Zhang Yunjun", email = "yunjunz@outlook.com" },
{ name = "Heresh Fattahi", email = "hersh.fattahi@gmail.com" },
]
requires-python = ">=3.8"
keywords = ["InSAR", "deformation", "time-series", "volcano", "tectonics", "geodesy", "geophysics", "remote-sensing"]
license = {text = "GPL-3.0-or-later"}
classifiers=[
"Development Status :: 4 - Beta",
"Intended Audience :: Science/Research",
"Topic :: Scientific/Engineering",
"License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
]
# see section: setuptools_scm
# https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#dynamic-metadata
# dependencies will be read from text files
dynamic = ["version", "readme", "dependencies", "optional-dependencies"]
[project.urls]
Homepage = "https://github.com/insarlab/MintPy"
Documentation = "https://mintpy.readthedocs.io/"
Issues = "https://github.com/insarlab/MintPy/issues"
# Entry points for the command line interface
[project.scripts]
"mintpy" = "mintpy.__main__:main"
"add.py" = "mintpy.cli.add:main"
"asc_desc2horz_vert.py" = "mintpy.cli.asc_desc2horz_vert:main"
"closure_phase_bias.py" = "mintpy.cli.closure_phase_bias:main"
"dem_error.py" = "mintpy.cli.dem_error:main"
"dem_gsi.py" = "mintpy.cli.dem_gsi:main"
"diff.py" = "mintpy.cli.diff:main"
"generate_mask.py" = "mintpy.cli.generate_mask:main"
"geocode.py" = "mintpy.cli.geocode:main"
"ifgram_inversion.py" = "mintpy.cli.ifgram_inversion:main"
"image_math.py" = "mintpy.cli.image_math:main"
"image_stitch.py" = "mintpy.cli.image_stitch:main"
"info.py" = "mintpy.cli.info:main"
"iono_split_spectrum.py" = "mintpy.cli.iono_split_spectrum:main"
"iono_tec.py" = "mintpy.cli.iono_tec:main"
"load_data.py" = "mintpy.cli.load_data:main"
"load_gbis.py" = "mintpy.cli.load_gbis:main"
"local_oscilator_drift.py" = "mintpy.cli.local_oscilator_drift:main"
"lookup_geo2radar.py" = "mintpy.cli.lookup_geo2radar:main"
"mask.py" = "mintpy.cli.mask:main"
"modify_network.py" = "mintpy.cli.modify_network:main"
"multilook.py" = "mintpy.cli.multilook:main"
"multi_transect.py" = "mintpy.multi_transect:main"
"plate_motion.py" = "mintpy.cli.plate_motion:main"
"plot_coherence_matrix.py" = "mintpy.cli.plot_coherence_matrix:main"
"plot_network.py" = "mintpy.cli.plot_network:main"
"plot_transection.py" = "mintpy.cli.plot_transection:main"
"prep_aria.py" = "mintpy.cli.prep_aria:main"
"prep_cosicorr.py" = "mintpy.cli.prep_cosicorr:main"
"prep_fringe.py" = "mintpy.cli.prep_fringe:main"
"prep_gamma.py" = "mintpy.cli.prep_gamma:main"
"prep_gmtsar.py" = "mintpy.cli.prep_gmtsar:main"
"prep_hyp3.py" = "mintpy.cli.prep_hyp3:main"
"prep_isce.py" = "mintpy.cli.prep_isce:main"
"prep_nisar.py" = "mintpy.cli.prep_nisar:main"
"prep_roipac.py" = "mintpy.cli.prep_roipac:main"
"prep_snap.py" = "mintpy.cli.prep_snap:main"
"reference_date.py" = "mintpy.cli.reference_date:main"
"reference_point.py" = "mintpy.cli.reference_point:main"
"remove_hdf5_dset.py" = "mintpy.cli.remove_hdf5_dset:main"
"remove_ramp.py" = "mintpy.cli.remove_ramp:main"
"s1ab_range_bias.py" = "mintpy.cli.s1ab_range_bias:main"
"save_gbis.py" = "mintpy.cli.save_gbis:main"
"save_gdal.py" = "mintpy.cli.save_gdal:main"
"save_gmt.py" = "mintpy.cli.save_gmt:main"
"save_hdfeos5.py" = "mintpy.cli.save_hdfeos5:main"
"save_kite.py" = "mintpy.cli.save_kite:main"
"save_kmz.py" = "mintpy.cli.save_kmz:main"
"save_kmz_timeseries.py" = "mintpy.cli.save_kmz_timeseries:main"
"save_qgis.py" = "mintpy.cli.save_qgis:main"
"save_roipac.py" = "mintpy.cli.save_roipac:main"
"save_explorer.py" = "mintpy.cli.save_explorer:main"
"smallbaselineApp.py" = "mintpy.cli.smallbaselineApp:main"
"solid_earth_tides.py" = "mintpy.cli.solid_earth_tides:main"
"spatial_average.py" = "mintpy.cli.spatial_average:main"
"spatial_filter.py" = "mintpy.cli.spatial_filter:main"
"subset.py" = "mintpy.cli.subset:main"
"temporal_average.py" = "mintpy.cli.temporal_average:main"
"temporal_derivative.py" = "mintpy.cli.temporal_derivative:main"
"temporal_filter.py" = "mintpy.cli.temporal_filter:main"
"timeseries2velocity.py" = "mintpy.cli.timeseries2velocity:main"
"timeseries_rms.py" = "mintpy.cli.timeseries_rms:main"
"tropo_gacos.py" = "mintpy.cli.tropo_gacos:main"
"tropo_phase_elevation.py" = "mintpy.cli.tropo_phase_elevation:main"
"tropo_pyaps3.py" = "mintpy.cli.tropo_pyaps3:main"
"tsview.py" = "mintpy.cli.tsview:main"
"unwrap_error_bridging.py" = "mintpy.cli.unwrap_error_bridging:main"
"unwrap_error_phase_closure.py" = "mintpy.cli.unwrap_error_phase_closure:main"
"view.py" = "mintpy.cli.view:main"
[tool.setuptools]
include-package-data = true
[tool.setuptools.dynamic]
dependencies = { file = ["requirements.txt"] }
readme = { file = ["docs/README.md"], content-type = "text/markdown" }
# extra requirements: `pip install mintpy[test]` or `pip install .[test]`
[tool.setuptools.dynamic.optional-dependencies.test]
file = ["tests/requirements.txt"]
[tool.setuptools.packages.find]
where = ["src"]
[tool.setuptools.package-data]
mintpy = [
"data/*.js",
"data/*.png",
"data/colormaps/*.cpt",
"defaults/*.cfg",
"defaults/*.yaml",
]
[tool.setuptools_scm]
version_scheme = "post-release"
local_scheme = "no-local-version"
MintPy-1.6.2/requirements.txt 0000664 0000000 0000000 00000000276 15032632755 0016241 0 ustar 00root root 0000000 0000000 pip
argcomplete
cartopy
cvxopt
dask>=1.0
dask-jobqueue>=0.3
h5py
joblib
lxml
matplotlib
numpy
pyaps3>=0.3.6
pykml>=0.2
pyproj
pyresample
pysolid
requests
rich
scikit-image
scipy
shapely
utm
MintPy-1.6.2/scripts/ 0000775 0000000 0000000 00000000000 15032632755 0014437 5 ustar 00root root 0000000 0000000 MintPy-1.6.2/scripts/compare_velocity_with_diff_tropo.sh 0000775 0000000 0000000 00000004262 15032632755 0023614 0 ustar 00root root 0000000 0000000 #! /bin/sh
## Compare the estimated velocities from time-series with different troposphric delay corrections
## Created by Zhang Yunjun, Sep 6th, 2018
## Run Control: change to 0 to skip the part
run_proc=1
run_plot=1
## Run Customized Processing
if [ $run_proc -eq 1 ]; then
generate_mask.py temporalCoherence.h5 -m 0.8 -o maskTempCoh.h5
# Tropospheric Correction with ERA-Interim
tropo_pyaps.py -f timeseries.h5 -g inputs/geometryRadar.h5 -m ECMWF -w ~/insarlab/WEATHER
dem_error.py timeseries_ECMWF.h5 -g inputs/geometryRadar.h5
remove_ramp.py timeseries_ECMWF_demErr.h5 -m maskTempCoh.h5 -s linear
timeseries2velocity.py timeseries_ECMWF_demErr_ramp.h5 -o velocity_tropECMWF.h5
# Tropospheric Correction with MERRA-2
tropo_pyaps.py -f timeseries.h5 -g inputs/geometryRadar.h5 -m MERRA -w ~/insarlab/WEATHER
dem_error.py timeseries_MERRA.h5 -g inputs/geometryRadar.h5
remove_ramp.py timeseries_MERRA_demErr.h5 -m maskTempCoh.h5 -s linear
timeseries2velocity.py timeseries_MERRA_demErr_ramp.h5 -o velocity_tropMERRA.h5
# Tropospheric Correction with Phase/Elevation Ratio
dem_error.py timeseries.h5 -g -g inputs/geomtropo_phase_elevationetryRadar.h5
tropo_phase_elevation.py timeseries_demErr.h5 -g inputs/geometryRadar.h5 -m maskTempCoh.h5
remove_ramp.py timeseries_demErr_tropHgt.h5 -m maskTempCoh.h5 -s linear
timeseries2velocity.py timeseries_demErr_tropHgt_ramp.h5 -o velocity_tropHgt.h5
# No tropospheric Correction
remove_ramp.py timeseries_demErr.h5 -m maskTempCoh.h5 -s linear
timeseries2velocity.py timeseries_demErr_ramp.h5 -o velocity_tropNone.h5
fi
## Run plotting
opt=' velocity --wrap --wrap-range -1 1 --nodisplay --cbar-nbins 2 --notitle --figsize 3 3 --fontsize 12 --notick --dpi 600 --ref-size 3 --dem inputs/geometryRadar.h5 --dem-nocontour '
proj_name='AlcedoSenDT128'
if [ $run_plot -eq 1 ]; then
view.py velocity_tropNone.h5 $opt -o ${proj_name}_velocity_0_tropNone.png
view.py velocity_tropECMWF.h5 $opt -o ${proj_name}_velocity_1_tropECMWF.png
view.py velocity_tropMERRA.h5 $opt -o ${proj_name}_velocity_2_tropMERRA.png
view.py velocity_tropHgt.h5 $opt -o ${proj_name}_velocity_3_tropHgt.png
fi
MintPy-1.6.2/scripts/fix_typos.sh 0000775 0000000 0000000 00000007176 15032632755 0017035 0 ustar 00root root 0000000 0000000 #!/bin/sh
# -*- coding: utf-8 -*-
###############################################################################
# $Id$
#
# Project: GDAL
# Purpose: (Interactive) script to identify and fix typos
# Author: Even Rouault
#
###############################################################################
# Copyright (c) 2016, Even Rouault
#
# 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.
###############################################################################
set -eu
SCRIPT_DIR=$(dirname "$0")
case $SCRIPT_DIR in
"/"*)
;;
".")
SCRIPT_DIR=$(pwd)
;;
*)
SCRIPT_DIR=$(pwd)"/"$(dirname "$0")
;;
esac
GDAL_ROOT=$SCRIPT_DIR/..
cd "$GDAL_ROOT"
if [ ! -f fix_typos/gdal_dict.txt ]; then
# Get our fork of codespell that adds --words-white-list and full filename support for -S option
mkdir -p fix_typos
(
cd fix_typos
if [ ! -d codespell ]; then
git clone https://github.com/rouault/codespell
fi
(cd codespell && git checkout gdal_improvements)
# Aggregate base dictionary + QGIS one + Debian Lintian one
curl https://github.com/qgis/QGIS/blob/master/scripts/spell_check/spelling.dat | sed "s/:/->/" | sed "s/:%//" | grep -v "colour->" | grep -v "colours->" > qgis.txt
curl https://salsa.debian.org/lintian/lintian/-/raw/master/data/spelling/corrections | grep "||" | grep -v "#" | sed "s/||/->/" > debian.txt
cat codespell/data/dictionary.txt qgis.txt debian.txt | awk 'NF' > gdal_dict.txt
echo "difered->deferred" >> gdal_dict.txt
echo "differed->deferred" >> gdal_dict.txt
grep -v 404 < gdal_dict.txt > gdal_dict.txt.tmp
mv gdal_dict.txt.tmp gdal_dict.txt
)
fi
EXCLUDED_FILES="*/.svn*,*/.git/*,configure,config.log,config.status,config.guess,config.sub,*/autom4te.cache/*,*.ai,*.svg"
if [ -z ${AUTHORIZED_LIST+x} ]; then export AUTHORIZED_LIST=""; fi
AUTHORIZED_LIST="$AUTHORIZED_LIST,te" # gdalwarp switch
AUTHORIZED_LIST="$AUTHORIZED_LIST,LaTeX,BibTeX"
AUTHORIZED_LIST="$AUTHORIZED_LIST,ALOS,Alos"
AUTHORIZED_LIST="$AUTHORIZED_LIST,lon,Lon,LON"
# New Mintpy ones
AUTHORIZED_LIST="$AUTHORIZED_LIST,alos,ALOS,alosStack"
AUTHORIZED_LIST="$AUTHORIZED_LIST,NED,LOD,Lod,lod"
AUTHORIZED_LIST="$AUTHORIZED_LIST,waterMask,watermask"
AUTHORIZED_LIST="$AUTHORIZED_LIST,smallbaselineApp"
AUTHORIZED_LIST="$AUTHORIZED_LIST,Nealy" # Author in reference
python fix_typos/codespell/codespell.py -w -i 3 -q 2 -S "$EXCLUDED_FILES,./autotest/*,./build*/*,./fix_typos/*" \
--words-white-list="$AUTHORIZED_LIST" \
-D ./fix_typos/gdal_dict.txt .
MintPy-1.6.2/scripts/jupyter_notebook_config.py 0000664 0000000 0000000 00000000631 15032632755 0021740 0 ustar 00root root 0000000 0000000 # Copyright (c) Jupyter Development Team.
# Distributed under the terms of the Modified BSD License.
# https://github.com/jupyter/docker-stacks/blob/master/base-notebook/jupyter_notebook_config.py
c = get_config() # noqa: F821
c.ServerApp.ip = '0.0.0.0'
c.ServerApp.port = 8888
c.ServerApp.open_browser = True
# https://github.com/jupyter/notebook/issues/3130
c.FileContentsManager.delete_to_trash = False
MintPy-1.6.2/scripts/load_data_aoi.sh 0000775 0000000 0000000 00000004766 15032632755 0017553 0 ustar 00root root 0000000 0000000 #! /bin/bash
# Extract input datasets in mintpy/inputs for an area of interest (AOI) from the one of the whole frame
# Parameters: SNWE : string for the AOI
# step : string/number, output resolution in degree
# inputs_dir_src : source mintpy/inputs folder for the whole track in radar coordinates
# Returns: inputs_dir_dst : destination mintpy/inputs folder for the AOI in geo coordinates
# Author: Zhang Yunjun, 2019-05-18
# setup input/output directories
inputs_dir_src=$HOME'/insarlab/Kirishima/Alos2DT23F2970/mintpy/inputs' #input dir
inputs_dir_dst=$HOME'/insarlab/Kirishima/ShinmoedakeAlos2DT23/mintpy/inputs' #output dir
# setup AOI
SNWE="31.88 31.94 130.85 130.91"
step="0.000185185" #degrees
# degrees --> meters on equator
# 0.000925926 --> 100 m
# 0.000555556 --> 60 m
# 0.000277778 --> 30 m
# 0.000185185 --> 20 m
# 0.000092593 --> 10 m
###########################################################################
# create destination directory
if [ ! -d $inputs_dir_dst ]; then
echo "create "$inputs_dir_dst
mkdir -p $inputs_dir_dst
fi
# geocode - prepare script options
lut_file="$inputs_dir_src/geometryRadar.h5"
geocode_opt="-l $lut_file --bbox $SNWE --lat-step -$step --lon-step $step"
echo "geocode & subset - geometry file"
src_file=$inputs_dir_src"/geometryRadar.h5"
dst_file=$inputs_dir_dst"/geometryGeo.h5"
echo "geocode.py $src_file -o $dst_file $geocode_opt"
geocode.py $src_file -o $dst_file $geocode_opt
echo "geocode & subset - ifgramStack file"
src_file=$inputs_dir_src"/ifgramStack.h5"
dst_file=$inputs_dir_dst"/ifgramStack.h5"
echo "geocode.py $src_file -o $dst_file $geocode_opt"
geocode.py $src_file -o $dst_file $geocode_opt
echo "geocode & subset - ionStack file"
src_file=$inputs_dir_src"/ionStack.h5"
dst_file=$inputs_dir_dst"/ionStack.h5"
if [ -f $src_file ]; then
echo "geocode.py $src_file -o $dst_file $geocode_opt"
geocode.py $src_file -o $dst_file $geocode_opt
fi
# subset - prepare script options
# split SNWE into four variables to be used by subset.py
S="$(cut -d' ' -f1 <<<"$SNWE")"
N="$(cut -d' ' -f2 <<<"$SNWE")"
W="$(cut -d' ' -f3 <<<"$SNWE")"
E="$(cut -d' ' -f4 <<<"$SNWE")"
subset_opt=" --lat $S $N --lon $W $E"
echo "subset - DEM"
src_file=$inputs_dir_src"/../../../DEM/gsi10m.dem.wgs84" #adjust filename for specific dataset
dst_file=$inputs_dir_dst"/gsi10m.h5" #adjust filename for specific dataset
echo "subset.py $src_file -o $dst_file $subset_opt"
subset.py $src_file -o $dst_file $subset_opt
echo "Done."
MintPy-1.6.2/scripts/plot_smallbaselineApp.sh 0000775 0000000 0000000 00000010477 15032632755 0021321 0 ustar 00root root 0000000 0000000 #! /bin/sh
###############################################################
# Plot Results from Routine Workflow with smallbaselineApp.py
# Author: Zhang Yunjun, 2017-07-23
# Latest update: 2021-03-08
###############################################################
# Update the date above to enable auto copyover/overwrite
## Change to 0 if you do not want to re-plot loaded dataset again
plot_key_files=1
plot_loaded_data=1
plot_loaded_data_aux=1
plot_timeseries=1
plot_geocoded_data=1
plot_the_rest=1
# Default file name
mask_file='maskTempCoh.h5'
dem_file='./inputs/geometryRadar.h5'
if [ ! -f $dem_file ]; then
dem_file='./inputs/geometryGeo.h5'
fi
## Log File
log_file='plot_smallbaselineApp.log'
touch $log_file
printf "\n\n\n\n\n" >> $log_file
echo "######################## ./plot_smallbaselineApp.sh ########################" >> $log_file
date >> $log_file
echo "##############################################################################" >> $log_file
#use "echo 'yoyoyo' | tee -a log" to output message to both screen and file.
#use "echo 'yoyoyo' >> log" to output message to file only.
## Create pic folder
if [ ! -d "pic" ]; then
echo 'Create ./pic folder'
mkdir pic
fi
## common view.py option for all files
view='view.py --nodisplay --dpi 150 --update '
## Plot Key files
opt=' --dem '$dem_file' --mask '$mask_file' -u cm '
#opt=' --dem '$dem_file' --mask '$mask_file' -u cm --vlim -2 2'
if [ $plot_key_files -eq 1 ]; then
file='velocity.h5'; test -f $file && $view $file $opt >> $log_file
file='temporalCoherence.h5'; test -f $file && $view $file -c gray --vlim 0 1 >> $log_file
file='maskTempCoh.h5'; test -f $file && $view $file -c gray --vlim 0 1 >> $log_file
file='inputs/geometryRadar.h5'; test -f $file && $view $file >> $log_file
file='inputs/geometryGeo.h5'; test -f $file && $view $file >> $log_file
fi
## Loaded Dataset
if [ $plot_loaded_data -eq 1 ]; then
file='inputs/ifgramStack.h5'
test -f $file && h5ls $file/unwrapPhase && $view $file unwrapPhase- --zero-mask --wrap -c cmy >> $log_file
test -f $file && h5ls $file/unwrapPhase && $view $file unwrapPhase- --zero-mask >> $log_file
test -f $file && h5ls $file/coherence && $view $file coherence- --mask no -v 0 1 >> $log_file
test -f $file && h5ls $file/connectComponent && $view $file connectComponent- --mask no >> $log_file
# phase-unwrapping error correction
for dset in 'unwrapPhase_bridging' 'unwrapPhase_phaseClosure' 'unwrapPhase_bridging_phaseClosure'; do
test -f $file && h5ls $file/$dset && $view $file $dset- --zero-mask >> $log_file
done
fi
## Auxliary Files from loaded dataset
if [ $plot_loaded_data_aux -eq 1 ]; then
file='avgPhaseVelocity.h5'; test -f $file && $view $file >> $log_file
file='avgSpatialCoh.h5'; test -f $file && $view $file -c gray --vlim 0 1 >> $log_file
file='maskConnComp.h5'; test -f $file && $view $file -c gray --vlim 0 1 >> $log_file
fi
## Time-series files
opt='--mask '$mask_file' --noaxis -u cm --wrap --wrap-range -10 10 '
if [ $plot_timeseries -eq 1 ]; then
file='timeseries.h5'; test -f $file && $view $file $opt >> $log_file
find . -name 'timeseries_*.h5' -exec $view {} $opt >> $log_file \;
fi
## Geo coordinates for UNAVCO Time-series InSAR Archive Product
if [ $plot_geocoded_data -eq 1 ]; then
file='./geo/geo_maskTempCoh.h5'; test -f $file && $view $file -c gray >> $log_file
file='./geo/geo_temporalCoherence.h5'; test -f $file && $view $file -c gray >> $log_file
file='./geo/geo_velocity.h5'; test -f $file && $view $file velocity >> $log_file
find . -name './geo/geo_timeseries_*.h5' -exec $view {} $opt >> $log_file \;
fi
if [ $plot_the_rest -eq 1 ]; then
for tropo in 'ERA5' 'ERAI' 'ECMWF' 'MERRA' 'NARR'; do
file='velocity'${tropo}'.h5'; test -f $file && $view $file --mask no >> $log_file
done
file='numInvIfgram.h5'; test -f $file && $view $file --mask no >> $log_file
fi
## Move/copy picture files to pic folder
echo "Copy *.txt files into ./pic folder."
cp *.txt pic/
echo "Move *.png/pdf/kmz files into ./pic folder."
mv *.png *.pdf *.kmz ./geo/*.kmz pic/
MintPy-1.6.2/scripts/post_aoi.sh 0000775 0000000 0000000 00000012063 15032632755 0016615 0 ustar 00root root 0000000 0000000 #! /bin/sh
# This is an example for creating your own processing recipe using MintPy
# Created by Zhang Yunjun, 2016
##### Initial Setting #####
satellite='AlosA'
track='T424'
frame='F610_640'
sub='-l 31.14:31.30 -L 130.48:130.68'
seed='-l 31.2352 -L 130.5029'
row_col='-r 5 -p 6'
##### Process Flag ########
subset=0
timeseries=0
velocity=0
point_ts=1
key_ifg=0
##------------- Data Source ---------------------------------------##
projectDir=$KYUSHU_PROJECT/${satellite}${track}${frame}/TSSAR
#projectDir=$SC/Kyushu${track}${frame}${satellite}/TSSAR/Product
workDir=$KYUSHU_PROJECT/Volcanoes/Ata/${satellite}${track}
msk=$projectDir'/subset_geo_Mask_tempCoh_dis.h5'
ts=$projectDir'/subset_Seeded_geo_timeseries_ECMWF_demCor_refDate_quadratic.h5'
vel=$projectDir'/subset_Seeded_geo_velocity_ex_masked.h5'
dem=$projectDir'/subset_gsi10m_30m.dem'
coh=$projectDir'/subset_geo_temporal_coherence.h5'
cd $workDir
##--------------- Subset -------------------------------------------##
if [ $subset -eq 1 ]; then
subset.py --outfill-nan $sub -o ts.h5 -f ${ts}
subset.py --outfill-zero $sub -o gsi10m_30m.dem -f ${dem}
subset.py --outfill-zero $sub -o Mask.h5 -f ${msk}
subset.py --outfill-zero $sub -o tempCoh.h5 -f ${coh}
generate_mask.py -f tempCoh.h5 -m 0.7 -o Mask_tempCoh.h5
view.py -c gray --nodisplay -f Mask.h5
view.py -c gray --nodisplay -f tempCoh.h5
view.py -c gray --nodisplay -f Mask_tempCoh.h5
view.py --nodisplay -f gsi10m_30m.dem
msk='Mask_tempCoh.h5'
view='view.py '${row_col}' -u cm -m -5 -M 5 -D gsi10m_30m.dem --dem-noshade --mask '$msk' --noaxis --nodisplay'
$view -f ts.h5
#generate_mask.py -f velocity_ex_masked.h5 -m 0.01 -o mask_vel_1.h5
#diff.py Mask_tempCoh.h5 mask_vel_1.h5 Mask_tempCoh_dis.h5
fi
msk='Mask_tempCoh_dis.h5'
dem='gsi10m_30m.dem'
##--------------- Timeseries ----------------------------------------##
if [ $timeseries -eq 1 ]; then
view='view.py '${row_col}' -u cm -m -5 -M 5 -D gsi10m_30m.dem --mask '$msk' --noaxis --nodisplay'
reference_point.py $seed -f ts.h5 -m $msk
$view -f Seeded_ts.h5
sum_epochs.py Seeded_ts.h5
$view -u 1 -m 0 -M 1 -f sum_Seeded_ts.h5 -c gray
#mean_spatial.py -f sum_Seeded_ts.h5 -m $msk
cir_par='31.1800,130.5290,60;31.1892,130.6147,40'
mean_spatial.py -f sum_Seeded_ts.h5 -m $msk --circle $cir_par
reference_date.py Seeded_ts.h5 reference_date.txt
masking.py -f Seeded_ts_refDate.h5 -m $msk
$view -f Seeded_ts_refDate.h5
$view -f Seeded_ts_refDate.h5 -E drop_date.txt
#$view -f Seeded_ts_refDate.h5 --ref-epoch 20110420
fi
ts='Seeded_ts_refDate.h5'
##--------------- Velocity -------------------------------------------##
if [ $velocity -eq 1 ]; then
timeseries2velocity.py -f $ts -E drop_date.txt
view='view.py -u cm -m -2 -M 2 -D '$dem' --nodisplay --mask '${msk}' -f '
$view velocity_ex.h5
masking.py -f velocity_ex.h5 -m $msk
save_kmz.py -f velocity_ex_masked.h5 -m -0.02 -M 0.02
fi
##---------------- Point Time Series Displacement --------------------##
if [ $point_ts -eq 1 ]; then
view='view.py --displacement -u cm -m -5 -M 5 --mask '$msk' -D '$dem' --nodisplay -f'
##--- 1.1 Pre-eruptive Inflation
#save_unw.py Seeded_ts.h5 20100102 20101120
#$view 100102_101120.unw
#masking.py -f 100102_101120.unw -m Mask.h5
#save_kmz.py -f 100102_101120_masked.unw -m -0.05 -M 0.05 --displacement --cbar-label 'LOS displacement'
##--- 2. Point TS
#masking.py -f Seeded_ts_refDate.h5 -m $msk
ts='Seeded_ts_refDate_masked.h5'
vel='velocity_ex_masked.h5'
tsview='tsview.py -f '${ts}' -E drop_date.txt -F '$ts' -r 3 -D '$dem' -v '$vel' -a -0.015 -b 0.015 --rect-color crimson'
#$tsview -l -10 -h 4 --lalo 31.1783,130.5364 --LALO 31.1853,130.5231 --nodisplay -t 20060623 -T 20110421
#$tsview -l -7 -h 4 --lalo 31.1923,130.6184 --LALO 31.1959,130.5971 -r 2 --nodisplay -t 20060623 -T 20110421
$tsview -l -7 -h 4 --lalo 31.1923,130.6184 -r 2 --nodisplay -t 20060623 -T 20110421
point_lalo='31.1923,130.6184'
view='view.py -u cm -m -2 -M 2 --mask '$msk' -D '$dem' --nodisplay'
sub='-l 31.155:31.21 -L 130.505:130.635'
lineFile='../transect_lonlat.xy'
$view -f velocity_ex.h5 --point-lalo $point_lalo -o velocity_ex_poi.png $sub --line-lalo $lineFile
fi
##----------------- Velocity and Interferograms ----------------------##
if [ $key_ifg -eq 1 ]; then
view='view.py --mask '$msk' --displacement -u cm -m -5 -M 5 -D '$dem' --nodisplay'
save_kmz='save_kmz.py -m -0.05 -M 0.05 --displacement'
#### Post-eruptive
d1='110305'
d2='110420'
save_unw.py Seeded_ts.h5 $d1 $d2
#$view -f 091130_110118.unw
masking.py -f ${d1}_${d2}.unw -m $msk
$save_kmz -f ${d1}_${d2}_masked.unw --cbar-label 'LOS displacement'
ts='Seeded_ts_refDate_masked.h5'
vel='091130_110118_masked.unw'
tsview='tsview.py -f '${ts}' -E drop_date.txt -F '$ts' -r 3 -D '$dem' -v '$vel' --displacement -a -0.05 -b 0.05 --rect-color black'
#$tsview --lalo 31.9076,130.8284 -l -3 -h 3 --nodisplay --zoom-y 200:900 --zoom-x 700:1600
fi
MintPy-1.6.2/scripts/post_process_Alos.sh 0000775 0000000 0000000 00000025063 15032632755 0020505 0 ustar 00root root 0000000 0000000 #! /bin/sh
##### Customized Processing After 1st smallbaselineApp
project='KyushuT424F610_640AlosA'
#####
trans='geomap_4rlks.trans'
tmpl=$TE/$project.template
#cd $SC/$project/TSSAR
smallbaselineApp=0
plot_load_data=0
modify_network=0
unwrap_error=0
phaseCor=0
ts_sum=0
ref_dates=0
deramp=0
timeseries_view=0
velocity=0
geo=1
geo2=1
##------------ MintPy routine processing --------------------##
if [ $smallbaselineApp -eq 1 ]; then
smallbaselineApp.py $tmpl
fi
##------------ Plot Load Data ------------------------------##
if [ $plot_load_data -eq 1 ]; then
## Average Spatial Coherence, more reliable mask source than non-nan and temporal coherence
#generate_mask.py -f average_spatial_coherence.h5 -m 0.7 -o Mask_spatialCoh.h5
view='view4job.py -c gray -m 0 -M 1 --nodisplay -f'
#$view average_spatial_coherence.h5
#$view Mask_spatialCoh.h5
#$view Mask.h5
#$view temporal_coherence.h5
msk='Mask_spatialCoh.h5'
#remove_ramp.py Seeded_LoadedData.h5 quadratic $msk
view='view4job.py -r 3 -p 12 --nodisplay'
#$view -m 0 -M 1 -c gray -f Coherence.h5
#$view -m -7 -M 7 --mask $msk -f Seeded_LoadedData.h5
#$view -m -7 -M 7 --mask $msk -f Seeded_LoadedData_quadratic.h5
#unwrap_error.py -f Seeded_LoadedData.h5 -m $msk -o Seeded_LoadedData_unwCorTri.h5
#remove_plane.py Seeded_LoadedData_unwCorTri.h5 quadratic $msk
fi
## Based on plotted Coherence and LoadedData image, select low coherent ifgs and put them in template file.
##------------ Modify Network and Re-run smallbaselineApp ----------##
if [ $modify_network -eq 1 ]; then
modify_network.py -f LoadedData.h5 -C Coherence.h5 -T $tmpl
mean_spatial_coherence.py Modified_Coherence.h5 Modified_average_spatial_coherence.h5
# generate_mask.py -f Modified_average_spatial_coherence.h5 -m 0.75 -o Mask_spatialCoh_Modified.h5
view='view4job.py -m 0 -M 1 -c gray --nodisplay -f'
$view Modified_Mask.h5
$view Modified_average_spatial_coherence.h5
#plot_network.py -f Modified_LoadedData.h5 --nodisplay
fi
##------------ PU Error correction -------------------------##
##### PU Correction using bonding points
igram='Seeded_Modified_LoadedData'
if [ $unwrap_error -eq 1 ]; then
## Generate Individual Mask for Unwrapping Error Correction
ue_generate_mask=0
if [ $ue_generate_mask -eq 1 ]; then
#reference_point.py -f Modified_LoadedData.h5 -t $tmpl
#cp temporal_coherence.h5 temporal_coherence_1.h5
#generate_mask.py -f temporal_coherence_1.h5 -m 0.7 -o mask_1.h5
##### Calculate with Subset, faster
## width = 2832, length = 6728
sub='-y 4500:6700 -x 0:1500'
sub2='-y -4500:2228 -x 0:2832'
subset.py -f ${igram}.h5 $sub
subset.py -f Mask_spatialCoh.h5 $sub
reference_point.py -f subset_${igram}.h5 -x 550 -y 550 -M subset_Mask_spatialCoh.h5 -o subset_${igram}_2.h5
igram_inversion.py -f subset_${igram}_2.h5 -o subset_timeseries_2.h5
temporal_coherence.py subset_${igram}_2.h5 subset_timeseries_2.h5 subset_temporal_coherence_3.h5
subset.py -f subset_temporal_coherence_3.h5 $sub2 -o temporal_coherence_3.h5
generate_mask.py -f temporal_coherence_3.h5 -m 0.7 -o mask_3.h5
image_math.py mask_3.h5 '*' 3 mask_3_3.h5
#reference_point.py -f ${igram}.h5 -x 840 -y 5390 -o ${igram}_2.h5
#igram_inversion.py -f ${igram}_2.h5 -o timeseries_2.h5
#temporal_coherence.py ${igram}_2.h5 timeseries_2.h5 temporal_coherence_2.h5
#generate_mask.py -f temporal_coherence_2.h5 -m 0.7 -o mask_2.h5
#image_math.py mask_2.h5 '*' 2 mask_2_2.h5
reference_point.py -f ${igram}.h5 -x 550 -y 5050 -o ${igram}_2.h5
igram_inversion.py -f ${igram}_2.h5 -o timeseries_2.h5
temporal_coherence.py ${igram}_2.h5 timeseries_2.h5 temporal_coherence_3.h5
generate_mask.py -f temporal_coherence_3.h5 -m 0.7 -o mask_3.h5
image_math.py mask_3.h5 '*' 3 mask_3_3.h5
reference_point.py -f ${igram}.h5 -x 630 -y 5860 -o ${igram}_2.h5
igram_inversion.py -f ${igram}_2.h5 -o timeseries_2.h5
temporal_coherence.py ${igram}_2.h5 timeseries_2.h5 temporal_coherence_4.h5
generate_mask.py -f temporal_coherence_4.h5 -m 0.7 -o mask_4.h5
image_math.py mask_4.h5 '*' 4 mask_4_4.h5
fi
#cd mask
#generate_mask.py -f temporal_coherence_2.h5 -m 0.7 -x 660:930 -y 5200:5500 -o mask_2.h5
#image_math.py mask_2.h5 '*' 2 mask_2_2.h5
#diff.py mask_1.h5 mask_2.h5 mask_1_2.h5
#generate_mask.py -f mask_1_2.h5 -m 0.5 -x 910:944 -y 5457:5496 -o mask_small_1.h5
#generate_mask.py -f mask_1_2.h5 -m 0.5 -x 877:985 -y 5263:5357 -o mask_small_2.h5
#diff.py mask_1_2.h5 mask_small_1.h5 mask_1_3.h5
#diff.py mask_1_3.h5 mask_small_2.h5 mask_1_4.h5
#generate_mask.py -f mask_1_4.h5 -m 0.5 -o mask_1_1.h5
#cd ..
#add.py -f mask_1_1.h5,mask_2_2.h5,mask_3_3.h5,mask_4_4.h5 -o Mask_all.h5
msk='Mask_all.h5'
view='view.py --nodisplay -f'
#$view mask_1.h5
#$view mask_2.h5
#$view $msk
#reference_point.py -f Modified_LoadedData.h5 -t $tmpl -M $msk
unwrap_error.py -f ${igram}.h5 -m $msk -t $tmpl --ramp quadratic --save-detrend
remove_plane.py ${igram}_unwCor.h5 quadratic $msk
view='view4job.py -r 6 -p 19 -m -7 -M 7 --mask Mask_all.h5 --noaxis --nodisplay -f'
#$view ${igram}.h5
$view ${igram}_unwCor.h5
$view ${igram}_unwCor_quadratic.h5
#### Mask with Bonding Points
#point_yx='5430,955,5429,865,5293,834,5178,832,5403,780,5714,612'
#line_yx='5430,955,5429,865;5293,834,5178,832;5403,780,5714,612'
#view.py --point=${point_yx} --line=${line_yx} --nodisplay -f $msk -o bonding_points.png
#smallbaselineApp.py $tmpl
fi
##### Display Iono Pairs
view='view.py -r 3 -p 5 -m -7 -M 7 -f Seeded_Modified_LoadedData_unwCor_plane_masked.h5 --nodisplay'
#$view -d 100606 -o Seeded_Modified_LoadedData_unwCor_plane_masked_100606.png
#$view -d 060526 -o Seeded_Modified_LoadedData_unwCor_plane_masked_060526.png
##------------ Mask ----------------------------------------##
#igram_inversion.py Seeded_Modified_LoadedData_unwCor.h5
#temporal_coherence.py Seeded_Modified_LoadedData_unwCor.h5 timeseries.h5
#generate_mask.py -f temporal_coherence.h5 -m 0.7 -x 180:2560 -o Mask_tempCoh_dis.h5
msk='Mask_tempCoh_dis.h5'
view='view.py -m 0 -M 1 -c gray --nodisplay -f'
#$view $msk
#$view temporal_coherence.h5
##------------ Phase Correction ----------------------------##
if [ $phaseCor -eq 1 ]; then
remove_plane.py -f timeseries_ECMWF.h5 -t $tmpl
dem_error.py timeseries_ECMWF_plane.h5 Seeded_Modified_LoadedData_unwCor.h5
masking.py -f DEM_error.h5 -m $msk
view.py -m -25 -M 25 --nodisplay -f DEM_error_masked.h5
fi
ts='timeseries_ECMWF_plane_demCor.h5'
##------------ Reference & Exclude Dates -------------------##
## Reference date and drop turbulence dates
if [ $ts_sum -eq 1 ]; then
#sum_epochs.py timeseries_ECMWF_demCor_plane.h5 ts_sum_0.h5
view.py -r 3 -p 10 -m 0 -M 1 --mask $msk --noaxis --nodisplay -f ts_sum_0.h5
fi
#ex_date='20060526,20060826,20070111,20091019,20100606,20100906'
ex_date='20060624,20070812,20080629,20090702,20090817,20091002,20100705'
ref_date='20090214'
if [ $ref_dates -eq 1 ]; then
#reference_date.py timeseries_ECMWF_demCor.h5 $ref_date
#remove_plane.py -f timeseries_ECMWF_demCor_ref${ref_date}.h5 -s quadratic -m $msk
ts='timeseries_ECMWF_demCor_ref'${ref_date}'_quadratic.h5'
#sum_epochs.py $ts ts_sum.h5
view4job.py -r 3 -p 10 -m 0 -M 1 --noaxis --nodisplay --mask $msk -f ts_sum.h5
fi
if [ $deramp -eq 1 ]; then
ysub='0,4000,3800,6728'
remove_plane.py -f timeseries_ECMWF_demCor_ref${ref_date}.h5 -s quadratic -m $msk -y $ysub --save-mask
ts='timeseries_ECMWF_demCor_ref'${ref_date}'_quadratic.h5'
#sum_epochs.py $ts ts_sum.h5
#view4job.py -r 2 -p 11 -m 0 -M 1 --noaxis --nodisplay --mask $msk -f ts_sum.h5
#diff.py timeseries_ECMWF_demCor_ref${ref_date}.h5 ${ts} 2quadratic.h5
view='view.py -r 4 -p 8 --noaxis --nodisplay --mask '$msk
#$view -m 0 -M 1 -f ts_sum.h5
#$view -u cm -m -25 -M 25 -f quadratic.h5
#$view -u cm -m -5 -M 5 -f timeseries_ECMWF_demCor_quadratic.h5
#reference_date.py timeseries_ECMWF_demCor_quadratic.h5 $ref_date
#$view -u cm -m -5 -M 5 -f timeseries_ECMWF_demCor_quadratic_ref${ref_date}.h5
#$view -u cm -m -5 -M 5 -f timeseries_ECMWF_demCor_quadratic_ref${ref_date}.h5 -E ${ex_date}
fi
ts='timeseries_ECMWF_demCor_ref'${ref_date}'_quadratic.h5'
##------------ Time Series Correction View -----------------##
## MERRA
#tropo_pyaps.py -f timeseries.h5 -d radar_4rlks.hgt -s MERRA -h 12:00 -i incidence_angle.h5
if [ $timeseries_view -eq 1 ]; then
view='view4job.py -r 3 -p 10 -u cm -m -25 -M 25 --mask '$msk' --noaxis --nodisplay -f'
#$view timeseries.h5
#$view timeseries_ECMWF.h5
#$view timeseries_ECMWF_demCor.h5
#$view timeseries_ECMWF_demCor_ref${ref_date}.h5
#$view ${ts} -o ${ts}_0.png
view='view4job.py -r 3 -p 10 -u cm -m -5 -M 5 --mask '$msk' --noaxis --nodisplay -f'
#$view ${ts}
$view ${ts} -E $ex_date
##### error
#diff.py timeseries_ECMWF_demCor_plane.h5 timeseries_ECMWF_demCor.h5 plane.h5
#masking.py -m $msk -f ECMWF.h5
#masking.py -m $msk -f MERRA.h5
#masking.py -m $msk -f DEM_error.h5
#masking.py -m $msk -f plane.h5
#view.py -r 4 -p 8 -u cm -m -5 -M 5 --noaxis --nodisplay -f ECMWF_masked.h5
#view.py -r 4 -p 8 -c jet -m -25 -M 25 --nodisplay -f DEM_error_masked.h5
#view.py -r 4 -p 8 -u cm -m -25 -M 25 --noaxis --nodisplay -f plane_masked.h5
fi
##------------ Velocity ---------------------------------------##
if [ $velocity -eq 1 ]; then
timeseries2velocity.py -f $ts -E $ex_date
view.py -u cm/yr -m -2 -M 2 --mask $msk --nodisplay -f velocity_ex.h5
fi
if [ $geo -eq 1 ]; then
##### Geocoding
#geocode.py $msk $trans
#geocode.py velocity_ex.h5 $trans
#geocode.py ${ts} $trans
geocode.py Modified_Coherence.h5 $trans
## Find subset.lalo based on geo_velocity.h5
##### Seeding
#reference_point.py -t $tmpl -f geo_velocity_ex.h5
#reference_point.py -t $tmpl -f geo_${ts}
fi
if [ $geo2 -eq 1 ]; then
##### Subset
#subset.py -t $tmpl -f Seeded_geo_*.h5,geo_$msk,gsi10m_30m.dem --parallel
subset.py -t $tmpl -f geo_Modified_Coherence.h5
##### masking
#masking.py -m subset_geo_$msk -f subset_Seeded_geo_velocity_ex.h5
#masking.py -m subset_geo_$msk -f subset_Seeded_geo_${ts}
#multi_looking.py subset_gsi10m_30m.dem 5 5 subset_gsi10m_150m.dem
#view.py -u cm/yr -m -2 -M 2 --mask subset_geo_$msk -D subset_gsi10m_150m.dem --save -f subset_Seeded_geo_velocity_ex.h5
#save_kml.py -m -0.02 -M 0.02 -f subset_Seeded_geo_velocity_ex_masked.h5
fi
MintPy-1.6.2/scripts/run_stripmap_stack.sh 0000775 0000000 0000000 00000001311 15032632755 0020702 0 ustar 00root root 0000000 0000000 #! /bin/sh
# clean folders before re-run
if [ -d "Igrams" ]; then
echo "clean obsolete files/folders before rerunning"
rm -r baselines/ configs/ coregSLC/ geom_reference/ Igrams/ merged/ offsets/ refineSecondaryTiming/ run_files/ SLC/
rm run_unPackALOS
cd download
rm -rf 20*
mv ARCHIVED_FILES/* .
cd ..
fi
# prepare SAR data
prepRawALOS.py -i download/ -o SLC -t '' --dual2single
chmod 755 run_unPackALOS
./run_unPackALOS
# stack processing
stackStripMap.py -s SLC/ -d DEM/gsi*.dem -t 1800 -b 1800 -a 20 -r 8 -u snaphu -W interferogram -m 20080212 -f 0.5 --applyWaterMask
submit_run_files4stripmap_stack.py
# mintpy
cd mintpy
smallbaselineApp.py ../KirishimaAlosAT424F620_630.txt
MintPy-1.6.2/src/ 0000775 0000000 0000000 00000000000 15032632755 0013537 5 ustar 00root root 0000000 0000000 MintPy-1.6.2/src/mintpy/ 0000775 0000000 0000000 00000000000 15032632755 0015057 5 ustar 00root root 0000000 0000000 MintPy-1.6.2/src/mintpy/__init__.py 0000664 0000000 0000000 00000000127 15032632755 0017170 0 ustar 00root root 0000000 0000000 # get version info
from mintpy.version import logo as __logo__, version as __version__
MintPy-1.6.2/src/mintpy/__main__.py 0000664 0000000 0000000 00000051036 15032632755 0017156 0 ustar 00root root 0000000 0000000 ############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Aug 2022 #
############################################################
"""Command line interface for MintPy.
The Miami INsar Time-series software in PYthon (MintPy as /mint pai/)
is an open-source package for Interferometric Synthetic Aperture Radar
(InSAR) time series analysis.
It reads the stack of interferograms (coregistered and unwrapped) in
ISCE, ARIA, FRInGE, HyP3, GMTSAR, SNAP, GAMMA or ROI_PAC format, and
produces three dimensional (2D in space and 1D in time) ground surface
displacement in line-of-sight direction.
It includes a routine time series analysis (`smallbaselineApp.py`) and
some independent toolbox.
This is research code provided to you "as is" with NO WARRANTIES OF
CORRECTNESS. Use at your own risk.
"""
# PYTHON_ARGCOMPLETE_OK
import argparse
import logging
import sys
try:
from os import EX_OK
except ImportError:
EX_OK = 0
EX_FAILURE = 1
EX_INTERRUPT = 130
from mintpy import __version__
PROG = __package__
LOGFMT = '%(asctime)s %(levelname)-8s -- %(message)s'
DEFAULT_LOGLEVEL = "WARNING"
EXAMPLE = """example:
mintpy --version
mintpy smalbaselineApp FernandinaSenDT128.txt
mintpy tsview timeseries_ERA5_ramp_demErr.h5
mintpy view velocity.h5
# debug mode with complete trace back info
mintpy --debug view velocity.h5
"""
################################################################################################
def _autocomplete(parser):
try:
import argcomplete
except ImportError:
pass
else:
argcomplete.autocomplete(parser)
####################################### Sub-Parsers ##########################################
# in alphabetical order
# A-G
def get_add_parser(subparsers=None):
from mintpy.cli import add
parser = add.create_parser(subparsers)
parser.set_defaults(func=add.main)
return parser
def get_asc_desc2horz_vert_parser(subparsers=None):
from mintpy.cli import asc_desc2horz_vert
parser = asc_desc2horz_vert.create_parser(subparsers)
parser.set_defaults(func=asc_desc2horz_vert.main)
return parser
def get_closure_phase_bias_parser(subparsers=None):
from mintpy.cli import closure_phase_bias
parser = closure_phase_bias.create_parser(subparsers)
parser.set_defaults(func=closure_phase_bias.main)
return parser
def get_dem_error_parser(subparsers=None):
from mintpy.cli import dem_error
parser = dem_error.create_parser(subparsers)
parser.set_defaults(func=dem_error.main)
return parser
def get_dem_gsi_parser(subparsers=None):
from mintpy.cli import dem_gsi
parser = dem_gsi.create_parser(subparsers)
parser.set_defaults(func=dem_gsi.main)
return parser
def get_diff_parser(subparsers=None):
from mintpy.cli import diff
parser = diff.create_parser(subparsers)
parser.set_defaults(func=diff.main)
return parser
def get_generate_mask_parser(subparsers=None):
from mintpy.cli import generate_mask
parser = generate_mask.create_parser(subparsers)
parser.set_defaults(func=generate_mask.main)
return parser
def get_geocode_parser(subparsers=None):
from mintpy.cli import geocode
parser = geocode.create_parser(subparsers)
parser.set_defaults(func=geocode.main)
return parser
# H-N
def get_ifgram_inversion_parser(subparsers=None):
from mintpy.cli import ifgram_inversion
parser = ifgram_inversion.create_parser(subparsers)
parser.set_defaults(func=ifgram_inversion.main)
return parser
def get_image_math_parser(subparsers=None):
from mintpy.cli import image_math
parser = image_math.create_parser(subparsers)
parser.set_defaults(func=image_math.main)
return parser
def get_image_stitch_parser(subparsers=None):
from mintpy.cli import image_stitch
parser = image_stitch.create_parser(subparsers)
parser.set_defaults(func=image_stitch.main)
return parser
def get_info_parser(subparsers=None):
from mintpy.cli import info
parser = info.create_parser(subparsers)
parser.set_defaults(func=info.main)
return parser
def get_iono_split_spectrum_parser(subparsers=None):
from mintpy.cli import iono_split_spectrum
parser = iono_split_spectrum.create_parser(subparsers)
parser.set_defaults(func=iono_split_spectrum.main)
return parser
def get_iono_tec_parser(subparsers=None):
from mintpy.cli import iono_tec
parser = iono_tec.create_parser(subparsers)
parser.set_defaults(func=iono_tec.main)
return parser
def get_mask_parser(subparsers=None):
from mintpy.cli import mask
parser = mask.create_parser(subparsers)
parser.set_defaults(func=mask.main)
return parser
def get_multilook_parser(subparsers=None):
from mintpy.cli import multilook
parser = multilook.create_parser(subparsers)
parser.set_defaults(func=multilook.main)
return parser
def get_load_data_parser(subparsers=None):
from mintpy.cli import load_data
parser = load_data.create_parser(subparsers)
parser.set_defaults(func=load_data.main)
return parser
def get_load_gbis_parser(subparsers=None):
from mintpy.cli import load_gbis
parser = load_gbis.create_parser(subparsers)
parser.set_defaults(func=load_gbis.main)
return parser
def get_local_oscilator_drift_parser(subparsers=None):
from mintpy.cli import local_oscilator_drift
parser = local_oscilator_drift.create_parser(subparsers)
parser.set_defaults(func=local_oscilator_drift.main)
return parser
def get_lookup_geo2radar_parser(subparsers=None):
from mintpy.cli import lookup_geo2radar
parser = lookup_geo2radar.create_parser(subparsers)
parser.set_defaults(func=lookup_geo2radar.main)
return parser
def get_modify_network_parser(subparsers=None):
from mintpy.cli import modify_network
parser = modify_network.create_parser(subparsers)
parser.set_defaults(func=modify_network.main)
return parser
# O-Q
def get_plate_motion_parser(subparsers=None):
from mintpy.cli import plate_motion
parser = plate_motion.create_parser(subparsers)
parser.set_defaults(func=plate_motion.main)
return parser
def get_plot_coherence_matrix_parser(subparsers=None):
from mintpy.cli import plot_coherence_matrix
parser = plot_coherence_matrix.create_parser(subparsers)
parser.set_defaults(func=plot_coherence_matrix.main)
return parser
def get_plot_network_parser(subparsers=None):
from mintpy.cli import plot_network
parser = plot_network.create_parser(subparsers)
parser.set_defaults(func=plot_network.main)
return parser
def get_plot_transection_parser(subparsers=None):
from mintpy.cli import plot_transection
parser = plot_transection.create_parser(subparsers)
parser.set_defaults(func=plot_transection.main)
return parser
def get_prep_aria_parser(subparsers=None):
from mintpy.cli import prep_aria
parser = prep_aria.create_parser(subparsers)
parser.set_defaults(func=prep_aria.main)
return parser
def get_prep_cosicorr_parser(subparsers=None):
from mintpy.cli import prep_cosicorr
parser = prep_cosicorr.create_parser(subparsers)
parser.set_defaults(func=prep_cosicorr.main)
return parser
def get_prep_fringe_parser(subparsers=None):
from mintpy.cli import prep_fringe
parser = prep_fringe.create_parser(subparsers)
parser.set_defaults(func=prep_fringe.main)
return parser
def get_prep_gamma_parser(subparsers=None):
from mintpy.cli import prep_gamma
parser = prep_gamma.create_parser(subparsers)
parser.set_defaults(func=prep_gamma.main)
return parser
def get_prep_gmtsar_parser(subparsers=None):
from mintpy.cli import prep_gmtsar
parser = prep_gmtsar.create_parser(subparsers)
parser.set_defaults(func=prep_gmtsar.main)
return parser
def get_prep_hyp3_parser(subparsers=None):
from mintpy.cli import prep_hyp3
parser = prep_hyp3.create_parser(subparsers)
parser.set_defaults(func=prep_hyp3.main)
return parser
def get_prep_isce_parser(subparsers=None):
from mintpy.cli import prep_isce
parser = prep_isce.create_parser(subparsers)
parser.set_defaults(func=prep_isce.main)
return parser
def get_prep_nisar_parser(subparsers=None):
from mintpy.cli import prep_nisar
parser = prep_nisar.create_parser(subparsers)
parser.set_defaults(func=prep_nisar.main)
return parser
def get_prep_roipac_parser(subparsers=None):
from mintpy.cli import prep_roipac
parser = prep_roipac.create_parser(subparsers)
parser.set_defaults(func=prep_roipac.main)
return parser
def get_prep_snap_parser(subparsers=None):
from mintpy.cli import prep_snap
parser = prep_snap.create_parser(subparsers)
parser.set_defaults(func=prep_snap.main)
return parser
# R-T
def get_reference_date_parser(subparsers=None):
from mintpy.cli import reference_date
parser = reference_date.create_parser(subparsers)
parser.set_defaults(func=reference_date.main)
return parser
def get_reference_point_parser(subparsers=None):
from mintpy.cli import reference_point
parser = reference_point.create_parser(subparsers)
parser.set_defaults(func=reference_point.main)
return parser
def get_remove_hdf5_dset(subparsers=None):
from mintpy.cli import remove_hdf5_dset
parser = remove_hdf5_dset.create_parser(subparsers)
parser.set_defaults(func=remove_hdf5_dset.main)
return parser
def get_remove_ramp_parser(subparsers=None):
from mintpy.cli import remove_ramp
parser = remove_ramp.create_parser(subparsers)
parser.set_defaults(func=remove_ramp.main)
return parser
def get_s1ab_range_bias_parser(subparsers=None):
from mintpy.cli import s1ab_range_bias
parser = s1ab_range_bias.create_parser(subparsers)
parser.set_defaults(func=s1ab_range_bias.main)
return parser
def get_save_gbis_parser(subparsers=None):
from mintpy.cli import save_gbis
parser = save_gbis.create_parser(subparsers)
parser.set_defaults(func=save_gbis.main)
return parser
def get_save_gdal_parser(subparsers=None):
from mintpy.cli import save_gdal
parser = save_gdal.create_parser(subparsers)
parser.set_defaults(func=save_gdal.main)
return parser
def get_save_gmt_parser(subparsers=None):
from mintpy.cli import save_gmt
parser = save_gmt.create_parser(subparsers)
parser.set_defaults(func=save_gmt.main)
return parser
def get_save_hdfeos5_parser(subparsers=None):
from mintpy.cli import save_hdfeos5
parser = save_hdfeos5.create_parser(subparsers)
parser.set_defaults(func=save_hdfeos5.main)
return parser
def get_save_kite_parser(subparsers=None):
from mintpy.cli import save_kite
parser = save_kite.create_parser(subparsers)
parser.set_defaults(func=save_kite.main)
return parser
def get_save_kmz_timeseries_parser(subparsers=None):
from mintpy.cli import save_kmz_timeseries
parser = save_kmz_timeseries.create_parser(subparsers)
parser.set_defaults(func=save_kmz_timeseries.main)
return parser
def get_save_kmz_parser(subparsers=None):
from mintpy.cli import save_kmz
parser = save_kmz.create_parser(subparsers)
parser.set_defaults(func=save_kmz.main)
return parser
def get_save_qgis_parser(subparsers=None):
from mintpy.cli import save_qgis
parser = save_qgis.create_parser(subparsers)
parser.set_defaults(func=save_qgis.main)
return parser
def get_save_roipac_parser(subparsers=None):
from mintpy.cli import save_roipac
parser = save_roipac.create_parser(subparsers)
parser.set_defaults(func=save_roipac.main)
return parser
def get_save_explorer_parser(subparsers=None):
from mintpy.cli import save_explorer
parser = save_explorer.create_parser(subparsers)
parser.set_defaults(func=save_explorer.main)
return parser
def get_smallbaselineApp_parser(subparsers=None):
from mintpy.cli import smallbaselineApp
parser = smallbaselineApp.create_parser(subparsers)
parser.set_defaults(func=smallbaselineApp.main)
return parser
def get_solid_earth_tides_parser(subparsers=None):
from mintpy.cli import solid_earth_tides
parser = solid_earth_tides.create_parser(subparsers)
parser.set_defaults(func=solid_earth_tides.main)
return parser
def get_spatial_average_parser(subparsers=None):
from mintpy.cli import spatial_average
parser = spatial_average.create_parser(subparsers)
parser.set_defaults(func=spatial_average.main)
return parser
def get_spatial_filter_parser(subparsers=None):
from mintpy.cli import spatial_filter
parser = spatial_filter.create_parser(subparsers)
parser.set_defaults(func=spatial_filter.main)
return parser
def get_subset_parser(subparsers=None):
from mintpy.cli import subset
parser = subset.create_parser(subparsers)
parser.set_defaults(func=subset.main)
return parser
def get_temporal_average_parser(subparsers=None):
from mintpy.cli import temporal_average
parser = temporal_average.create_parser(subparsers)
parser.set_defaults(func=temporal_average.main)
return parser
def get_temporal_derivative_parser(subparsers=None):
from mintpy.cli import temporal_derivative
parser = temporal_derivative.create_parser(subparsers)
parser.set_defaults(func=temporal_derivative.main)
return parser
def get_temporal_filter_parser(subparsers=None):
from mintpy.cli import temporal_filter
parser = temporal_filter.create_parser(subparsers)
parser.set_defaults(func=temporal_filter.main)
return parser
def get_timeseries_rms_parser(subparsers=None):
from mintpy.cli import timeseries_rms
parser = timeseries_rms.create_parser(subparsers)
parser.set_defaults(func=timeseries_rms.main)
return parser
def get_timeseries2velocity_parser(subparsers=None):
from mintpy.cli import timeseries2velocity
parser = timeseries2velocity.create_parser(subparsers)
parser.set_defaults(func=timeseries2velocity.main)
return parser
def get_tropo_gacos_parser(subparsers=None):
from mintpy.cli import tropo_gacos
parser = tropo_gacos.create_parser(subparsers)
parser.set_defaults(func=tropo_gacos.main)
return parser
def get_tropo_phase_elevation_parser(subparsers=None):
from mintpy.cli import tropo_phase_elevation
parser = tropo_phase_elevation.create_parser(subparsers)
parser.set_defaults(func=tropo_phase_elevation.main)
return parser
def get_tropo_pyaps3_parser(subparsers=None):
from mintpy.cli import tropo_pyaps3
parser = tropo_pyaps3.create_parser(subparsers)
parser.set_defaults(func=tropo_pyaps3.main)
return parser
def get_tsview_parser(subparsers=None):
from mintpy.cli import tsview
parser = tsview.create_parser(subparsers)
parser.set_defaults(func=tsview.main)
return parser
# U-Z
def get_unwrap_error_bridging_parser(subparsers=None):
from mintpy.cli import unwrap_error_bridging
parser = unwrap_error_bridging.create_parser(subparsers)
parser.set_defaults(func=unwrap_error_bridging.main)
return parser
def get_unwrap_error_phase_closure_parser(subparsers=None):
from mintpy.cli import unwrap_error_phase_closure
parser = unwrap_error_phase_closure.create_parser(subparsers)
parser.set_defaults(func=unwrap_error_phase_closure.main)
return parser
def get_view_parser(subparsers=None):
from mintpy.cli import view
parser = view.create_parser(subparsers)
parser.set_defaults(func=view.main)
return parser
####################################### Main Parser ##########################################
def _add_logging_control_args(parser, default_loglevel=DEFAULT_LOGLEVEL):
"""Add command line options for logging control."""
loglevels = [logging.getLevelName(level) for level in range(10, 60, 10)]
group = parser.add_mutually_exclusive_group()
group.add_argument(
"--loglevel",
default=default_loglevel,
choices=loglevels,
help="logging level (default: %(default)s)",
)
group.add_argument(
"--quiet",
dest="loglevel",
action="store_const",
const="ERROR",
help="suppress standard output messages, "
"only errors are printed to screen",
)
group.add_argument(
"--verbose",
dest="loglevel",
action="store_const",
const="INFO",
help="print verbose output messages",
)
group.add_argument(
"--debug",
dest="loglevel",
action="store_const",
const="DEBUG",
help="print debug messages",
)
def get_parser():
"""Instantiate the command line argument parser."""
parser = argparse.ArgumentParser(
prog=PROG,
description=__doc__,
epilog=EXAMPLE,
formatter_class=argparse.RawTextHelpFormatter,
)
parser.add_argument("-v","--version", action="version", version=f"{__version__}")
# Sub-command management
sp = parser.add_subparsers(title="sub-commands", dest='func', required=True, metavar='')
_add_logging_control_args(parser)
# workflow
get_smallbaselineApp_parser(sp)
# standard processing
get_asc_desc2horz_vert_parser(sp)
get_geocode_parser(sp)
get_ifgram_inversion_parser(sp)
get_mask_parser(sp)
get_modify_network_parser(sp)
get_multilook_parser(sp)
get_reference_date_parser(sp)
get_reference_point_parser(sp)
get_spatial_average_parser(sp)
get_spatial_filter_parser(sp)
get_temporal_average_parser(sp)
get_temporal_derivative_parser(sp)
get_temporal_filter_parser(sp)
get_timeseries_rms_parser(sp)
get_timeseries2velocity_parser(sp)
# image operations
get_add_parser(sp)
get_diff_parser(sp)
get_image_math_parser(sp)
get_image_stitch_parser(sp)
get_subset_parser(sp)
# noise reduction / error correction
get_closure_phase_bias_parser(sp)
get_dem_error_parser(sp)
get_iono_split_spectrum_parser(sp)
get_iono_tec_parser(sp)
get_local_oscilator_drift_parser(sp)
get_plate_motion_parser(sp)
get_remove_ramp_parser(sp)
get_s1ab_range_bias_parser(sp)
get_solid_earth_tides_parser(sp)
get_tropo_gacos_parser(sp)
get_tropo_phase_elevation_parser(sp)
get_tropo_pyaps3_parser(sp)
get_unwrap_error_bridging_parser(sp)
get_unwrap_error_phase_closure_parser(sp)
# misc
get_dem_gsi_parser(sp)
get_generate_mask_parser(sp)
try:
get_lookup_geo2radar_parser(sp)
except ImportError:
pass
# pre-processing
get_prep_aria_parser(sp)
get_prep_cosicorr_parser(sp)
get_prep_fringe_parser(sp)
get_prep_gamma_parser(sp)
get_prep_gmtsar_parser(sp)
get_prep_hyp3_parser(sp)
get_prep_isce_parser(sp)
get_prep_nisar_parser(sp)
get_prep_roipac_parser(sp)
get_prep_snap_parser(sp)
# I/O
get_load_data_parser(sp)
get_load_gbis_parser(sp)
get_remove_hdf5_dset(sp)
get_save_gbis_parser(sp)
get_save_gdal_parser(sp)
get_save_gmt_parser(sp)
get_save_hdfeos5_parser(sp)
get_save_kite_parser(sp)
get_save_kmz_timeseries_parser(sp)
get_save_kmz_parser(sp)
get_save_qgis_parser(sp)
get_save_roipac_parser(sp)
get_save_explorer_parser(sp)
# visualization
get_info_parser(sp)
# get_multi_transect_parser(sp)
get_plot_coherence_matrix_parser(sp)
get_plot_network_parser(sp)
get_plot_transection_parser(sp)
get_tsview_parser(sp)
get_view_parser(sp)
_autocomplete(parser)
return parser
################################################################################################
def main(*argv):
"""Main CLI interface."""
# setup logging
logging.basicConfig(format=LOGFMT)
logging.captureWarnings(True)
log = logging.getLogger(PROG)
# parse cmd line arguments
parser = get_parser()
args = parser.parse_args(argv if argv else None)
# execute main tasks
exit_code = EX_OK
try:
# NOTE: use the root logger to set the logging level
logging.getLogger().setLevel(args.loglevel)
log.debug("args: %s", args)
exit_code = args.func(sys.argv[2:])
except Exception as exc:
log.critical(
"unexpected exception caught: {!r} {}".format(
type(exc).__name__, exc)
)
log.exception("stacktrace:") #, exc_info=True)
exit_code = EX_FAILURE
except KeyboardInterrupt:
log.warning("Keyboard interrupt received: exit the program")
exit_code = EX_INTERRUPT
return exit_code
################################################################################################
if __name__ == "__main__":
sys.exit(main())
MintPy-1.6.2/src/mintpy/add.py 0000664 0000000 0000000 00000012432 15032632755 0016163 0 ustar 00root root 0000000 0000000 ############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Zhang Yunjun, Heresh Fattahi, 2013 #
############################################################
import os
import numpy as np
from mintpy.diff import check_reference
from mintpy.objects import timeseries
from mintpy.utils import readfile, writefile
################################################################################
def add_matrix(data1, data2):
"""Sum of 2 input matrix"""
data1 = np.array(data1, dtype=np.float32)
data2 = np.array(data2, dtype=np.float32)
data = data1 + data2
data[np.isnan(data1)] = data2[np.isnan(data1)]
data[np.isnan(data2)] = data1[np.isnan(data2)]
return data
def add_file(fnames, out_file=None, force=False):
"""Generate sum of all input files
Parameters: fnames - list of str, path/name of input files to be added
out_file - str, optional, path/name of output file
Returns: out_file - str, path/name of output file
Example: 'mask_all.h5' = add_file(['mask_1.h5','mask_2.h5','mask_3.h5'], 'mask_all.h5')
"""
num_file = len(fnames)
print(f'input files to be added: ({num_file})\n{fnames}')
# Default output file name
ext = os.path.splitext(fnames[0])[1]
if not out_file:
out_file = os.path.splitext(fnames[0])[0]
for i in range(1, num_file):
out_file += '_plus_' + os.path.splitext(os.path.basename(fnames[i]))[0]
out_file += ext
# read FILE_TYPE
ftypes = [readfile.read_attribute(x)['FILE_TYPE'] for x in fnames]
print(f'input file types: {ftypes}')
if ftypes[0] == 'timeseries':
# check dates shared by two timeseries files
file1, file2 = fnames[0], fnames[1]
atr1 = readfile.read_attribute(file1)
atr2 = readfile.read_attribute(file2)
dateList1 = timeseries(file1).get_date_list()
dateList2 = timeseries(file2).get_date_list()
dateListShared = [i for i in dateList1 if i in dateList2]
dateShared = np.ones((len(dateList1)), dtype=np.bool_)
if dateListShared != dateList1:
print(f'WARNING: {file2} does not contain all dates in {file1}')
if force:
dateListEx = list(set(dateList1) - set(dateListShared))
print('Continue and enforce the differencing for their shared dates only.')
print(f'\twith following dates are ignored for differencing:\n{dateListEx}')
dateShared[np.array([dateList1.index(i) for i in dateListEx])] = 0
else:
raise Exception('To enforce the differencing anyway, use --force option.')
# check reference point
ref_date, ref_y, ref_x = check_reference(atr1, atr2)
# read data2 (consider different reference_date/pixel)
print(f'read from file: {file2}')
data2 = readfile.read(file2, datasetName=dateListShared)[0]
if ref_y and ref_x:
print(f'* referencing data from {os.path.basename(file2)} to y/x: {ref_y}/{ref_x}')
ref_box = (ref_x, ref_y, ref_x + 1, ref_y + 1)
ref_val = readfile.read(file2, datasetName=dateListShared, box=ref_box)[0]
data2 -= np.tile(ref_val.reshape(-1, 1, 1), (1, data2.shape[1], data2.shape[2]))
if ref_date:
print(f'* referencing data from {os.path.basename(file2)} to date: {ref_date}')
ref_ind = dateListShared.index(ref_date)
data2 -= np.tile(data2[ref_ind, :, :], (data2.shape[0], 1, 1))
# read data1
print(f'read from file: {file1}')
data = readfile.read(file1)[0]
# apply adding
mask = data == 0.
data[dateShared] += data2
data[mask] = 0. # Do not change zero phase value
del data2
# write file
writefile.write(data, out_file=out_file, metadata=atr1, ref_file=file1)
else:
# get common dataset list
ds_names_list = [readfile.get_dataset_list(x) for x in fnames]
ds_names = list(set.intersection(*map(set, ds_names_list)))
# if all files have one dataset, ignore dataset name variation and take the 1st one as reference
if all(len(x) == 1 for x in ds_names_list):
ds_names = ds_names_list[0]
print('List of common datasets across files: ', ds_names)
if len(ds_names) < 1:
raise ValueError(f'No common datasets found among files:\n{fnames}')
# loop over each file
dsDict = {}
for ds_name in ds_names:
print(f'adding {ds_name} ...')
data, atr = readfile.read(fnames[0], datasetName=ds_name)
for i, fname in enumerate(fnames[1:]):
# ignore ds_name if input file has single dataset
ds_name2read = None if len(ds_names_list[i+1]) == 1 else ds_name
# read
data2 = readfile.read(fname, datasetName=ds_name2read)[0]
# apply operation
data = add_matrix(data, data2)
dsDict[ds_name] = data
# output
print(f'use metadata from the 1st file: {fnames[0]}')
writefile.write(dsDict, out_file=out_file, metadata=atr, ref_file=fnames[0])
return out_file
MintPy-1.6.2/src/mintpy/asc_desc2horz_vert.py 0000664 0000000 0000000 00000027652 15032632755 0021236 0 ustar 00root root 0000000 0000000 ############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Zhang Yunjun, Heresh Fattahi, 2013 #
############################################################
import numpy as np
from mintpy.objects import sensor
from mintpy.utils import ptime, readfile, utils as ut, writefile
################################################################################
def get_overlap_lalo(atr_list):
"""Find overlap area in lat/lon of geocoded files based on their metadata.
Parameters: atr_list - list of dict, attribute dictionary of two input files in geo coord
Returns: S/N/W/E - float, West/East/South/North in deg
"""
S, N, W, E = None, None, None, None
for i, atr in enumerate(atr_list):
Si, Ni, Wi, Ei = ut.four_corners(atr)
if i == 0:
S, N, W, E = Si, Ni, Wi, Ei
else:
S = max(Si, S)
N = min(Ni, N)
W = max(Wi, W)
E = min(Ei, E)
return S, N, W, E
def get_design_matrix4east_north_up(los_inc_angle, los_az_angle, obs_direction=None):
"""Design matrix G to convert multi-track range/azimuth displacement into east/north/up direction.
Parameters: los_inc_angle - 1D np.ndarray in size of (num_obs,) in float32, LOS incidence angle in degree
los_az_angle - 1D np.ndarray in size of (num_obs,) in float32, LOS azimuth angle in degree
obs_direction - 1D np.ndarray in size of (num_obs,) in str, observation direction: range or azimuth
Returns: G - 2D np.ndarray in size of (num_obs, 3) in float32, design matrix
"""
num_obs = los_inc_angle.shape[0]
G = np.zeros((num_obs, 3), dtype=np.float32)
# obs_direction: default value
if not obs_direction:
obs_direction = ['range'] * num_obs
# obs_direction: check var type
if not isinstance(obs_direction, (list, np.ndarray)):
raise ValueError(f'input obs_direction ({obs_direction}) is NOT a list or numpy.ndarray!')
for i, (inc_angle, az_angle, obs_dir) in enumerate(zip(los_inc_angle, los_az_angle, obs_direction)):
# calculate the unit vector
if obs_dir == 'range':
# for range offset / InSAR phase [with positive value for motion toward the satellite]
ve = np.sin(np.deg2rad(inc_angle)) * np.sin(np.deg2rad(az_angle)) * -1
vn = np.sin(np.deg2rad(inc_angle)) * np.cos(np.deg2rad(az_angle))
vu = np.cos(np.deg2rad(inc_angle))
elif obs_dir == 'azimuth':
# for azimuth offset [with positive value for motion same as flight]
ve = np.sin(np.deg2rad(az_angle - 90)) * -1
vn = np.cos(np.deg2rad(az_angle - 90)) * 1
vu = 0.
else:
raise ValueError(f'un-recognized observation direction: {obs_dir}')
# fill the design matrix
G[i, :] = [ve, vn, vu]
return G
def get_design_matrix4horz_vert(los_inc_angle, los_az_angle, horz_az_angle=-90):
"""Design matrix G to convert asc/desc range displacement into horz/vert direction.
Only asc + desc -> hz + up is implemented for now.
Project displacement from LOS to Horizontal and Vertical components:
Math for 3D:
dLOS = dE * sin(inc_angle) * sin(az_angle) * -1
+ dN * sin(inc_angle) * cos(az_angle)
+ dU * cos(inc_angle)
Math for 2D:
dLOS = dH * sin(inc_angle) * cos(az_angle - az)
+ dV * cos(inc_angle)
with dH_perp = 0.0
This could be easily modified to support multiple view geometry
(e.g. two adjacent tracks from asc & desc) to resolve 3D
Parameters: los_inc_angle - 1D np.ndarray in size of (num_file), LOS incidence angle in degree.
los_az_angle - 1D np.ndarray in size of (num_file), LOS azimuth angle in degree.
horz_az_angle - float, azimuth angle for the horizontal direction of interest in degree.
Measured from the north with anti-clockwise direction as positive.
Returns: G - 2D matrix in size of (num_file, 2)
"""
num_file = los_inc_angle.shape[0]
G = np.zeros((num_file, 2), dtype=np.float32)
for i in range(num_file):
G[i, 0] = np.sin(np.deg2rad(los_inc_angle[i])) * np.cos(np.deg2rad(los_az_angle[i] - horz_az_angle))
G[i, 1] = np.cos(np.deg2rad(los_inc_angle[i]))
return G
def asc_desc2horz_vert(dlos, los_inc_angle, los_az_angle, horz_az_angle=-90, step=20):
"""Decompose asc / desc LOS data into horz / vert data.
Parameters: dlos - 3D np.ndarray in size of (num_file, length, width), LOS displacement in meters.
los_inc_angle - 1/3D np.ndarray in size of (num_file), length, width), LOS incidence angle in degree.
los_az_angle - 1/3D np.ndarray in size of (num_file), length, width), LOS azimuth angle in degree.
horz_az_angle - float, horizontal azimuth angle of interest in degree.
step - int, geometry step size
Returns: dhorz - 2D np.ndarray in size of (length, width), horizontal displacement in meters.
dvert - 2D np.ndarray in size of (length, width), vertical displacement in meters.
"""
# initiate output
(num_file, length, width) = dlos.shape
dhorz = np.zeros((length, width), dtype=np.float32) * np.nan
dvert = np.zeros((length, width), dtype=np.float32) * np.nan
# 0D (constant) incidence / azimuth angle --> invert once for all pixels
if los_inc_angle.ndim == 1:
G = get_design_matrix4horz_vert(los_inc_angle, los_az_angle, horz_az_angle)
print('decomposing asc/desc into horz/vert direction ...')
dhv = np.dot(np.linalg.pinv(G), dlos.reshape(num_file, -1)).astype(np.float32)
dhorz = dhv[0, :].reshape(length, width)
dvert = dhv[1, :].reshape(length, width)
# 2D incidence / azimuth angle --> invert [window-by-window to speed up]
elif los_inc_angle.ndim == 3:
num_row = np.ceil(length / step).astype(int)
num_col = np.ceil(width / step).astype(int)
print(f'decomposing asc/desc into horz/vert direction in windows of {step}x{step} ...')
prog_bar = ptime.progressBar(maxValue=num_row)
for i in range(num_row):
y0, y1 = step * i, min(step * (i + 1), length)
for j in range(num_col):
x0, x1 = step * j, min(step * (j + 1), width)
# calculate the median geometry for the local window
med_los_inc_angle = np.nanmedian(los_inc_angle[:, y0:y1, x0:x1], axis=(1,2))
med_los_az_angle = np.nanmedian( los_az_angle[:, y0:y1, x0:x1], axis=(1,2))
if np.all(~np.isnan(med_los_inc_angle)):
G = get_design_matrix4horz_vert(med_los_inc_angle, med_los_az_angle, horz_az_angle)
dhv = np.dot(np.linalg.pinv(G), dlos[:, y0:y1, x0:x1].reshape(num_file, -1))
dhorz[y0:y1, x0:x1] = dhv[0].reshape(y1-y0, x1-x0)
dvert[y0:y1, x0:x1] = dhv[1].reshape(y1-y0, x1-x0)
prog_bar.update(i+1, suffix=f'{i+1}/{num_row}')
prog_bar.close()
else:
raise ValueError(f'un-supported incidence angle matrix dimension ({los_inc_angle.ndim})!')
return dhorz, dvert
def run_asc_desc2horz_vert(inps):
"""Decompose asc / desc LOS files into horz / vert file(s).
Parameters: inps - namespace, input parameters
Returns: inps.outfile - str(s) output file(s)
"""
## 1. calculate the overlapping area in lat/lon
atr_list = [readfile.read_attribute(fname, datasetName=inps.ds_name) for fname in inps.file]
S, N, W, E = get_overlap_lalo(atr_list)
lat_step = float(atr_list[0]['Y_STEP'])
lon_step = float(atr_list[0]['X_STEP'])
length = int(round((S - N) / lat_step))
width = int(round((E - W) / lon_step))
print(f'overlapping area in SNWE: {(S, N, W, E)}')
## 2. read LOS data and geometry
num_file = len(inps.file)
dlos = np.zeros((num_file, length, width), dtype=np.float32)
if inps.geom_file:
los_inc_angle = np.zeros((num_file, length, width), dtype=np.float32)
los_az_angle = np.zeros((num_file, length, width), dtype=np.float32)
else:
los_inc_angle = np.zeros(num_file, dtype=np.float32)
los_az_angle = np.zeros(num_file, dtype=np.float32)
for i, (atr, fname) in enumerate(zip(atr_list, inps.file)):
# overlap SNWE --> box to read for each specific file
coord = ut.coordinate(atr)
y0, x0 = coord.lalo2yx(N, W)
box = (x0, y0, x0 + width, y0 + length)
# read data
dlos[i, :] = readfile.read(fname, box=box, datasetName=inps.ds_name)[0]
msg = f'{inps.ds_name} ' if inps.ds_name else ''
print(f'read {msg} from file: {fname}')
# read geometry
if inps.geom_file:
los_inc_angle[i, :] = readfile.read(inps.geom_file[i], box=box, datasetName='incidenceAngle')[0]
los_az_angle[i, :] = readfile.read(inps.geom_file[i], box=box, datasetName='azimuthAngle')[0]
print(f'read 2D LOS incidence / azimuth angles from file: {inps.geom_file[i]}')
else:
los_inc_angle[i] = ut.incidence_angle(atr, dimension=0, print_msg=False)
los_az_angle[i] = ut.heading2azimuth_angle(float(atr['HEADING']), look_direction='right')
print('calculate the constant LOS incidence / azimuth angles from metadata as:')
print(f'LOS incidence angle: {los_inc_angle[i]:.1f} deg')
print(f'LOS azimuth angle: {los_az_angle[i]:.1f} deg, assuming right-looking radar.')
## 3. decompose LOS displacements into horizontal / Vertical displacements
print('---------------------')
dhorz, dvert = asc_desc2horz_vert(dlos, los_inc_angle, los_az_angle, inps.horz_az_angle)
## 4. write outputs
print('---------------------')
# Update attributes
atr = atr_list[0].copy()
if inps.ds_name and atr['FILE_TYPE'] in ['ifgramStack', 'timeseries', 'HDFEOS']:
atr['FILE_TYPE'] = 'displacement'
atr['WIDTH'] = str(width)
atr['LENGTH'] = str(length)
atr['X_STEP'] = str(lon_step)
atr['Y_STEP'] = str(lat_step)
atr['X_FIRST'] = str(W)
atr['Y_FIRST'] = str(N)
# update REF_X/Y
ref_lat, ref_lon = float(atr['REF_LAT']), float(atr['REF_LON'])
[ref_y, ref_x] = ut.coordinate(atr).geo2radar(ref_lat, ref_lon)[0:2]
atr['REF_Y'] = int(ref_y)
atr['REF_X'] = int(ref_x)
# use ref_file for time-series file writing
ref_file = inps.file[0] if atr_list[0]['FILE_TYPE'] == 'timeseries' else None
if inps.one_outfile:
print(f'write asc/desc/horz/vert datasets into {inps.one_outfile}')
dsDict = {}
for i, atr_i in enumerate(atr_list):
# dataset name for LOS data
track_num = atr_i.get('trackNumber', None)
proj_name = atr_i.get('PROJECT_NAME', None)
if proj_name in ['none', 'None', None]:
proj_name = atr_i.get('FILE_PATH', None)
proj_name = sensor.project_name2sensor_name(proj_name)[0]
ds_name = proj_name if proj_name else ''
ds_name += 'A' if atr_i['ORBIT_DIRECTION'].lower().startswith('asc') else 'D'
ds_name += f'T{track_num}' if track_num else ''
ds_name += '_{}'.format(atr_i['DATE12'])
# assign dataset value
dsDict[ds_name] = dlos[i]
dsDict['horizontal'] = dhorz
dsDict['vertical'] = dvert
writefile.write(dsDict, out_file=inps.one_outfile, metadata=atr, ref_file=ref_file)
else:
print('writing horizontal component to file: '+inps.outfile[0])
writefile.write(dhorz, out_file=inps.outfile[0], metadata=atr, ref_file=ref_file)
print('writing vertical component to file: '+inps.outfile[1])
writefile.write(dvert, out_file=inps.outfile[1], metadata=atr, ref_file=ref_file)
return inps.outfile
MintPy-1.6.2/src/mintpy/cli/ 0000775 0000000 0000000 00000000000 15032632755 0015626 5 ustar 00root root 0000000 0000000 MintPy-1.6.2/src/mintpy/cli/__init__.py 0000664 0000000 0000000 00000000000 15032632755 0017725 0 ustar 00root root 0000000 0000000 MintPy-1.6.2/src/mintpy/cli/add.py 0000775 0000000 0000000 00000004610 15032632755 0016734 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import sys
from mintpy.utils.arg_utils import create_argument_parser
################################################################################
EXAMPLE = """example:
add.py mask_1.h5 mask_2.h5 mask_3.h5 -o mask_all.h5
add.py 081008_100220.unw 100220_110417.unw -o 081008_110417.unw
add.py timeseries_ERA5.h5 inputs/ERA5.h5 -o timeseries.h5
add.py timeseriesRg.h5 inputs/TECsub.h5 -o timeseriesRg_TECsub.h5 --force
"""
def create_parser(subparsers=None):
""" Command line parser """
synopsis = 'Generate the sum of multiple input files.'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', nargs='+', help='files (2 or more) to be added')
parser.add_argument('-o', '--output', dest='outfile', help='output file name')
parser.add_argument('--force', action='store_true',
help='Enforce the adding for the shared dates only for time-series files')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import readfile
# check
num_file = len(inps.file)
atr = readfile.read_attribute(inps.file[0])
# check: number of files a) >= 2 and b) == 2 for time-series
if num_file < 2:
parser.print_usage()
sys.exit('ERROR: At least 2 input files needed!')
elif num_file > 2 and atr['FILE_TYPE'] == 'timeseries':
raise ValueError(f'Only TWO files are supported for time-series, input has {num_file}.')
return inps
################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.add import add_file
# run
add_file(inps.file, inps.outfile, force=inps.force)
################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/asc_desc2horz_vert.py 0000775 0000000 0000000 00000016474 15032632755 0022010 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import sys
from mintpy.utils.arg_utils import create_argument_parser
################################################################################
REFERENCE = """reference:
Fialko, Y., Simons, M., & Agnew, D. (2001). The complete (3-D) surface displacement
field in the epicentral area of the 1999 MW7.1 Hector Mine Earthquake, California,
from space geodetic observations. Geophysical Research Letters, 28(16), 3063-3066.
doi:10.1029/2001GL013174
Wright, T. J., B. E. Parsons, and Z. Lu (2004), Toward mapping surface deformation
in three dimensions using InSAR, Geophysical Research Letters, 31(1), L01607,
doi:10.1029/2003GL018827.
"""
EXAMPLE = """example:
# for data with different spatial resolution and coverage
# use geocode.py -x/y --bbox option to make them consistent
cd AlosAT424/mintpy
mask.py velocity.h5 -m maskTempCoh.h5
geocode.py velocity_msk.h5 -l inputs/geometryRadar.h5 -x 0.00027778 -y -0.00027778 --bbox 32.0 32.5 130.1 130.5
cd AlosDT73/mintpy
mask.py velocity.h5 -m maskTempCoh.h5
geocode.py velocity_msk.h5 -l inputs/geometryRadar.h5 -x 0.00027778 -y -0.00027778 --bbox 32.0 32.5 130.1 130.5
asc_desc2horz_vert.py AlosAT424/mintpy/geo_velocity_msk.h5 AlosDT73/mintpy/geo_velocity_msk.h5
# write horz/vert to two files
asc_desc2horz_vert.py AlosAT424/mintpy/velocity_msk.h5 AlosDT73/mintpy/velocity_msk.h5
asc_desc2horz_vert.py AlosAT424/mintpy/velocity_msk.h5 AlosDT73/mintpy/velocity_msk.h5 --azimuth 16
asc_desc2horz_vert.py AlosAT424/mintpy/velocity_msk.h5 AlosDT73/mintpy/velocity_msk.h5 --dset step20200107
# write all asc/desc/horz/vert datasets into one file
asc_desc2horz_vert.py Alos2AT131/mintpy/20171219_20190702.unw Alos2DT23/mintpy/20171211_20190819.unw --oo Kirishima2017post.h5
view.py Kirishima2017post.h5 -u cm --wrap --wrap-range -5 5 #check deformation signal with multiple viewing geometries.
# pixel-wise decomposition [for large area analysis]
asc_desc2horz_vert.py asc_velocity.h5 desc_velocity.h5 -g asc_geometry.h5 desc_geometry.h5
"""
def create_parser(subparsers=None):
synopsis = 'Project Asc and Desc LOS displacement to Horizontal and Vertical direction'
epilog = REFERENCE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
# input files
parser.add_argument('file', nargs=2,
help='Ascending and descending files\n'
'Both files need to be geocoded in the same spatial resolution.')
parser.add_argument('-d', '--dset', dest='ds_name', type=str, help='dataset to use, default: 1st dataset')
parser.add_argument('-g','--geom-file', dest='geom_file', nargs=2, help='Geometry files for the input data files.')
# inputs - checking
parser.add_argument('--max-ref-yx-diff', dest='max_ref_yx_diff', type=int, default=3,
help='Maximum difference between REF_Y/X (derived from REF_LAT/LON) of input files '+
'(default: %(default)s).')
# outputs - horizontal direction of interest
parser.add_argument('--az','--horz-az-angle', dest='horz_az_angle', type=float, default=-90.0,
help='Azimuth angle in degrees of the interested horizontal direction (default: %(default)s).\n'
'Measured from the north with positive for anti-clockwise direction.\n'
'E.g.: -90 for East direction\n'
' 0 for North direction\n'
'Set to the azimuth angle of the strike-slip fault to measure the fault-parallel displacement.\n'
'Note:\n'
'a. This assumes no deformation in its perpendicular direction\n'
'b. Near north direction can not be well resolved due to the lack of\n'
' diversity in viewing geometry. Check exact dilution of precision for \n'
' each component in Wright et al. (2004, GRL)')
# output - data files
parser.add_argument('-o', '--output', dest='outfile', nargs=2, metavar=('HZ_FILE','UP_FILE'), default=['hz.h5', 'up.h5'],
help='output file name for vertical and horizontal components')
parser.add_argument('--oo','--one-output', dest='one_outfile',
help='Stack the input/output files into one HDF5 file.\n' +
'This will disable the HZ/UP_FILE output option.')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import readfile
# check
atr1 = readfile.read_attribute(inps.file[0])
atr2 = readfile.read_attribute(inps.file[1])
# check: if input file type is supported
ts_ftypes = ['timeseries', 'HDFEOS']
ftype1, ftype2 = atr1['FILE_TYPE'], atr2['FILE_TYPE']
if any(x in ts_ftypes for x in [ftype1, ftype2]):
raise Exception(f'input file types ({ftype1}, {ftype2}) contains UN-supported file types: {ts_ftypes}!')
# check: if input is in geo-coordinates
if any('X_FIRST' not in i for i in [atr1, atr2]):
raise Exception('Not all input files are geocoded.')
# check: if input spatial resolutions are consistent
if any(atr1[i] != atr2[i] for i in ['X_STEP','Y_STEP']):
msg = '\tfile1: {}, Y/X_STEP: {} / {} {}\n'.format(inps.file[0], atr1['Y_STEP'], atr1['X_STEP'], atr1.get('X_UNIT', 'degrees'))
msg += '\tfile2: {}, Y/X_STEP: {} / {} {}\n'.format(inps.file[1], atr2['Y_STEP'], atr2['X_STEP'], atr2.get('X_UNIT', 'degrees'))
msg += '\tRe-run geocode.py --lat-step --lon-step to make them consistent.'
raise ValueError(f'input files do NOT have the same spatial resolution\n{msg}')
# check: if input reference points are consistent
ref_lat1, ref_lon1 = (float(atr1[i]) for i in ['REF_LAT', 'REF_LON'])
ref_lat2, ref_lon2 = (float(atr2[i]) for i in ['REF_LAT', 'REF_LON'])
ref_y_diff = abs((ref_lat1 - ref_lat2) / float(atr1['Y_STEP']))
ref_x_diff = abs((ref_lon1 - ref_lon2) / float(atr1['X_STEP']))
if any(ref_diff > inps.max_ref_yx_diff for ref_diff in [ref_y_diff, ref_x_diff]):
msg = f'REF_LAT/LON difference between input files > {inps.max_ref_yx_diff} pixels!\n'
for fname, ref_lat, ref_lon in zip(inps.file, [ref_lat1, ref_lat2], [ref_lon1, ref_lon2]):
msg += f'file: {fname}\n'
msg += f'\tREF_LAT/LON: [{ref_lat:.8f}, {ref_lon:.8f}]\n'
raise ValueError(msg)
return inps
################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.asc_desc2horz_vert import run_asc_desc2horz_vert
# run
run_asc_desc2horz_vert(inps)
################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/closure_phase_bias.py 0000775 0000000 0000000 00000011657 15032632755 0022047 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Yujie Zheng, Aug 2022 #
############################################################
import os
import sys
from mintpy.utils import arg_utils
################################################################################
REFERENCE = """reference:
Y. Zheng, H. Fattahi, P. Agram, M. Simons and P. Rosen, (2022). On Closure Phase
and Systematic Bias in Multi-looked SAR Interferometry, in IEEE Trans. Geosci.
Remote Sens., doi:10.1109/TGRS.2022.3167648.
"""
EXAMPLE = """example:
# Note: ONLY sequential network is supported in this implementation.
# Notebook tutorial:
# https://nbviewer.org/github/insarlab/MintPy-tutorial/blob/main/applications/closure_phase_bias.ipynb
# create mask for areas susceptible to biases
closure_phase_bias.py -i inputs/ifgramStack.h5 --nl 5 -a mask
closure_phase_bias.py -i inputs/ifgramStack.h5 --nl 20 -a mask --num-sigma 2.5
# estimate non-closure phase bias time-series [quick and approximate solution]
closure_phase_bias.py -i inputs/ifgramStack.h5 --nl 5 --bw 3 -a quick_estimate --num-worker 6
# estimate non-closure phase bias time-series
closure_phase_bias.py -i inputs/ifgramStack.h5 --nl 5 --bw 3 -a estimate --num-worker 6 -c local
closure_phase_bias.py -i inputs/ifgramStack.h5 --nl 20 --bw 10 -a estimate --num-worker 6 -c local
"""
def create_parser(subparsers=None):
synopsis = 'Phase non-closure related biases correction'
epilog = REFERENCE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = arg_utils.create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('-i','--ifgramstack', type=str, dest='stack_file',
help='interferogram stack file that contains the unwrapped phases')
parser.add_argument('--wm','--water-mask', dest='water_mask_file',
help='Water mask to skip pixels on water body.\n'
'Default: waterMask.h5 if exists, otherwise None.')
# bandwidth and bias free connection level
parser.add_argument('--nl','--conn-level', dest='nl', type=int, default=20,
help='connection level that we are correcting to (or consider as no bias)\n'
'(default: %(default)s)')
parser.add_argument('--bw', dest='bw', type=int, default=10,
help='bandwidth of time-series analysis that you want to correct')
parser.add_argument('-a','--action', dest='action', type=str, default='mask',
choices={'mask', 'quick_estimate', 'estimate'},
help='action to take (default: %(default)s):\n'
'mask - create a mask of areas susceptible to closure phase errors\n'
'quick_estimate - quick and approximate estimation on how bias decays with time\n'
' output sequential closure phase files\n'
'estimate - estimate how bias decays with time\n'
' processed for each pixel on a pixel by pixel basis [slow]')
# mask configuration
mask = parser.add_argument_group('Mask', 'Configuration for closure phase bias mask')
mask.add_argument('--num-sigma', dest='num_sigma', type=float, default=3,
help='Threashold for phase, in number of sigmas (default: %(default)s).\n'
'Assuming a Gaussian distribution for the cumulative closure phase'
' with sigma = pi / sqrt(3*num_cp)')
mask.add_argument('--eps','--epsilon', dest='epsilon', type=float, default=0.3,
help='Threashold for the normalized amplitude in [0-1] (default: %(default)s).')
# compute
parser = arg_utils.add_parallel_argument(parser)
parser = arg_utils.add_memory_argument(parser)
# output
parser.add_argument('-o', dest='outdir', type=str, default='./', help='output file directory')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# check: --water-mask option
if not inps.water_mask_file and os.path.isfile('./waterMask.h5'):
inps.water_mask_file = os.path.abspath('./waterMask.h5')
return inps
################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.closure_phase_bias import run_closure_phase_bias
# run
run_closure_phase_bias(inps)
################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/dem_error.py 0000775 0000000 0000000 00000016733 15032632755 0020173 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Heresh Fattahi, Aug 2022 #
############################################################
import argparse
import os
import sys
from mintpy.defaults.template import get_template_content
from mintpy.utils import arg_utils
############################################################################
TEMPLATE = get_template_content('correct_topography')
REFERENCE = """reference:
Fattahi, H., and F. Amelung (2013), DEM Error Correction in InSAR Time Series,
IEEE Trans. Geosci. Remote Sens., 51(7), 4249-4259, doi:10.1109/TGRS.2012.2227761.
"""
EXAMPLE = """example:
# correct DEM error with pixel-wise geometry parameters [slow]
dem_error.py timeseries_ERA5_ramp.h5 -g inputs/geometryRadar.h5 -t smallbaselineApp.cfg
# correct DEM error with mean geometry parameters [fast]
dem_error.py timeseries_ERA5_ramp.h5 -t smallbaselineApp.cfg
# get updated/corrected DEM
save_roipac.py inputs/geometryGeo.h5 -o dem.h5 #for dataset in geo coordinates
mask.py demErr.h5 -m maskTempCoh.h5 -o demErr_msk.h5
add.py demErr_msk.h5 dem.h5 -o demNew.h5
"""
def create_parser(subparsers=None):
synopsis = 'DEM Error (Topographic Residual) Correction'
epilog = REFERENCE + '\n' + TEMPLATE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = arg_utils.create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('ts_file', help='Time-series HDF5 file to be corrected.')
parser.add_argument('-g', '--geometry', dest='geom_file',
help='geometry file including datasets:\n'+
'incidence angle\n'+
'slant range distance\n' +
'and/or 3D perpendicular baseline')
parser.add_argument('-o', '--outfile', dest='ts_cor_file',
help='Output file name for corrected time-series (default: add suffix of "_demErr")')
parser.add_argument('--dem-err-file','--dem-error-file', dest='dem_err_file', default='demErr.h5',
help='Output file name for the estimated DEM error (default: %(default)s).')
defo_model = parser.add_argument_group('temporal deformation model')
defo_model.add_argument('-t', '--template', dest='template_file',
help='template file with the options')
defo_model.add_argument('--ex', '--exclude', dest='excludeDate', nargs='*', default=[],
help='Exclude date(s) for DEM error estimation.\n' +
'All dates will be corrected for DEM residual phase still.')
defo_model.add_argument('-p', '--poly-order', dest='polyOrder', type=int, default=2,
help='polynomial order number of temporal deformation model (default: %(default)s).')
defo_model.add_argument('-s', '--step-date', dest='stepDate', nargs='*', default=[],
help='Date of step jump for temporal deformation model (default: %(default)s).'+
' i.e. date of earthquake/volcanic eruption')
defo_model.add_argument('--periodic', '--period', '--peri', dest='periodic', type=float, nargs='+', default=[],
help='periodic functinos of temporal deformation model (default: %(default)s).')
parser.add_argument('--phase-velocity', dest='phaseVelocity', action='store_true',
help='Use phase velocity instead of phase for inversion constrain.')
parser.add_argument('--update', dest='update_mode', action='store_true',
help='Enable update mode, and skip inversion if:\n'+
'1) output time-series file already exists, readable '+
'and newer than input interferograms file\n' +
'2) all configuration parameters are the same.')
# computing
parser = arg_utils.add_memory_argument(parser)
parser = arg_utils.add_parallel_argument(parser)
return parser
def cmd_line_parse(iargs=None):
"""Command line parser."""
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.objects import cluster
# check
if inps.template_file:
inps = read_template2inps(inps.template_file, inps)
# check: --cluster and --num-worker option
inps.numWorker = str(cluster.DaskCluster.format_num_worker(inps.cluster, inps.numWorker))
if inps.cluster and inps.numWorker == '1':
print('WARNING: number of workers is 1, turn OFF parallel processing and continue')
inps.cluster = None
# check: --ex option (ignore non-existed exclude_date.txt)
if inps.excludeDate == 'exclude_date.txt' and not os.path.isfile(inps.excludeDate):
inps.excludeDate = []
# check: --poly-order option
if inps.polyOrder < 1:
raise argparse.ArgumentTypeError("Minimum polynomial order is 1")
# check: --output / --dem-error-file option (must be HDF5 file)
for fname in [inps.ts_cor_file, inps.dem_err_file]:
if fname:
fext = os.path.splitext(fname)[1]
if fext not in ['.h5','.he5']:
msg = f'--output / --dem-err-file option ({fext}) supports HDF5 file only!'
raise ValueError(msg)
# default: --output option
if not inps.ts_cor_file:
fbase = os.path.splitext(inps.ts_file)[0]
inps.ts_cor_file = f'{fbase}_demErr.h5'
return inps
def read_template2inps(template_file, inps):
"""Read input template file into inps.excludeDate"""
print('read options from template file:', os.path.basename(template_file))
from mintpy.dem_error import key_prefix
from mintpy.utils import ptime, readfile, utils1 as ut
iDict = vars(inps)
template = readfile.read_template(template_file, skip_chars=['[', ']'])
template = ut.check_template_auto_value(template)
# Read template option
key_list = [i for i in list(iDict.keys()) if key_prefix+i in template.keys()]
for key in key_list:
value = template[key_prefix+key]
if key in ['phaseVelocity']:
iDict[key] = value
elif value:
if key in ['polyOrder']:
iDict[key] = int(value)
elif key in ['excludeDate','stepDate']:
iDict[key] = ptime.yyyymmdd(value.split(','))
# computing configurations
dask_key_prefix = 'mintpy.compute.'
key_list = [i for i in list(iDict.keys()) if dask_key_prefix+i in template.keys()]
for key in key_list:
value = template[dask_key_prefix+key]
if key in ['cluster', 'config']:
iDict[key] = value
elif value:
if key in ['numWorker']:
iDict[key] = str(value)
elif key in ['maxMemory']:
iDict[key] = float(value)
return inps
############################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.dem_error import correct_dem_error, run_or_skip
# run or skip
if inps.update_mode and run_or_skip(inps) == 'skip':
return
# run
correct_dem_error(inps)
################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/dem_gsi.py 0000775 0000000 0000000 00000005141 15032632755 0017613 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import glob
import os
import sys
from mintpy.utils.arg_utils import create_argument_parser
##################################################################################################
EXAMPLE = """example:
cd $KIRISHIMA/KirishimaAlosAT424/DEM
dem_gsi.py -b 31.1 32.8 130.1 131.9
dem_gsi.py -b 31.1 32.8 130.1 131.9 --grid-dir ~/data/DEM/GSI_DEHM10m
"""
NOTE = """DEHM: Digital Ellipsoidal Height Model
yyxx.dehm with yy and xx indicating the coordinates of the upper left corner of the first pixel.
where latitude = (yy + 1) / 1.5, longitude = xx + 100
"""
def create_parser(subparsers=None):
synopsis = 'Prepare DEM from GSI (Japan) DEHM grib files.'
epilog = NOTE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('-b','--bbox', dest='SNWE', type=float, nargs=4, metavar=('S','N','W','E'), required=True,
help='Bounding box in latitude [-90, 90] and longitude [-180, 180].')
parser.add_argument('-o','--output', dest='outfile', default='gsi10m.dem.wgs84',
help='output file name (default: %(default)s).')
parser.add_argument('-g','--grid-dir', dest='grid_dir', default='$DEMDB/GSI_DEHM10m',
help='Directory of DEHM grib files (default: %(default)s).')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# check: --grid-dir option
inps.grid_dir = os.path.expanduser(inps.grid_dir)
inps.grid_dir = os.path.expandvars(inps.grid_dir)
inps.grid_dir = os.path.abspath(inps.grid_dir)
if len(glob.glob(os.path.join(inps.grid_dir, '*.dehm'))) == 0:
raise SystemExit(f'ERROR: no *.dehm file found in directory: {inps.grid_dir}')
return inps
##################################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.dem_gsi import prep_gsi_dem
# run
prep_gsi_dem(inps)
###################################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/diff.py 0000775 0000000 0000000 00000006464 15032632755 0017125 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import os
import sys
from mintpy.utils.arg_utils import create_argument_parser
#####################################################################################
EXAMPLE = """example:
# same file types
diff.py velocity.h5 velocity_demErr.h5
diff.py timeseries.h5 inputs/ERA5.h5 -o timeseries_ERA5.h5
diff.py timeseries.h5 inputs/ERA5.h5 -o timeseries_ERA5.h5 --force
diff.py timeseries_ERA5_ramp_demErr.h5 ../GIANT/Stack/LS-PARAMS.h5 -o mintpy_giant.h5
diff.py reconUnwrapIfgram.h5 ./inputs/ifgramStack.h5 -o diffUnwrapIfgram.h5
# different file types
diff.py filt_20220905_20230220.unw ./inputs/ERA5.h5 -o filt_20220905_20230220_ERA5.unw
diff.py timeseries.h5 ./inputs/ITRF14.h5 -o timeseries_ITRF14.h5
# multiple files
diff.py waterMask.h5 maskSantiago.h5 maskFernandina.h5 -o maskIsabela.h5
"""
def create_parser(subparsers=None):
synopsis = 'Generate the difference of two input files.'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file1', help='file to be subtracted.')
parser.add_argument('file2', nargs='+', help='file used to subtract')
parser.add_argument('-o', '--output', dest='out_file',
help='output file name, default is file1_diff_file2.h5')
parser.add_argument('--force','--force-diff', dest='force_diff', action='store_true',
help='Enforce the differencing for the shared dates only for time-series files')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import readfile
# check
# check: number of files == 2 for time-series and ifgram stack
ftype = readfile.read_attribute(inps.file1)['FILE_TYPE']
if ftype in ['timeseries', 'ifgramStack', '.unw']:
if len(inps.file2) > 1:
raise SystemExit(f'ERROR: ONLY ONE file2 is inputted for {ftype} type!')
# check: --output (output file is required for number of files >=2)
if not inps.out_file:
if len(inps.file2) > 1:
raise ValueError('--output is required for >=2 files!')
# default: --output
if not inps.out_file:
fbase1, fext = os.path.splitext(inps.file1)
fbase2 = os.path.splitext(os.path.basename(inps.file2[0]))[0]
inps.out_file = f'{fbase1}_diff_{fbase2}{fext}'
return inps
#####################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.diff import diff_file
# run
diff_file(
file1=inps.file1,
file2=inps.file2,
out_file=inps.out_file,
force_diff=inps.force_diff,
)
#####################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/generate_mask.py 0000775 0000000 0000000 00000021511 15032632755 0021010 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import sys
import warnings
from mintpy.utils.arg_utils import create_argument_parser
################################################################################################
EXAMPLE = """example:
generate_mask.py temporalCoherence.h5 -m 0.7 -o maskTempCoh.h5
generate_mask.py temporalCoherence.h5 -m 0.7 -o maskTempCoh.h5 --base inputs/geometryRadar.h5 --base-dset shadow --base-value 1
generate_mask.py avgSpatialCoh.h5 -m 0.7 --base waterMask.h5 -o maskSpatialCoh.h5
# exclude area by min/max value and/or subset in row/col direction
generate_mask.py 081018_090118.unw -m 3 -M 8 -y 100 700 -x 200 800 -o mask_1.h5
# exclude pixel cluster based on minimum number of pixels
generate_mask.py maskTempCoh.h5 -p 10 -o mask_1.h5
# exclude pixels with large velocity STD: |velocity| > cutoff (2 by default) * velocityStd
generate_mask.py velocity.h5 --vstd
generate_mask.py velocity.h5 --vstd --vstd-num 3
# exclude / include an circular area
generate_mask.py maskTempCoh.h5 -m 0.5 --ex-circle 230 283 100 -o maskTempCoh_nonDef.h5
generate_mask.py maskTempCoh.h5 -m 0.5 --in-circle 230 283 100 -o maskTempCoh_Def.h5
# maskout an area within a circle AND with height smaller than a threshold
generate_mask.py inputs/geometryGeo.h5 height --in-circle 339 370 21 -M 1400 --revert -o maskCrater.h5
# use an specific dataset from multiple dataset file
generate_mask.py geometryRadar.dem height -m 0.5 -o waterMask.h5
generate_mask.py ifgramStack.h5 unwrapPhase-20101120_20110220 -m 4
# common mask file of pixels in all connected components / with non-zero unwrapped phase
generate_mask.py ifgramStack.h5 --nonzero -o maskConnComp.h5 --update
# interactive polygon selection of region of interest
# useful for custom mask generation in unwrap error correction with bridging
generate_mask.py waterMask.h5 -m 0.5 --roipoly
generate_mask.py azOff.h5 --roipoly --view-cmd "-v -0.1 0.1"
generate_mask.py velocity.h5 --roipoly --view-cmd "--dem ./inputs/geometryGeo.h5 --contour-step 100 --contour-smooth 0.0"
"""
def create_parser(subparsers=None):
synopsis = 'Generate mask file from input file'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', help='input file')
parser.add_argument('dset', nargs='?',
help='date of timeseries, or date12 of interferograms to be converted')
parser.add_argument('-o', '--output', dest='outfile',
help='output file name.')
parser.add_argument('--keep-nan', dest='keep_nan', action='store_true',
help='Do not exclude pixels with NaN value')
parser.add_argument('--revert', action='store_true', help='revert 0 and 1 value of output mask file')
parser.add_argument('-m', '--min', dest='vmin', type=float,
help='minimum value for selected pixels')
parser.add_argument('-M', '--max', dest='vmax', type=float,
help='maximum value for selected pixels')
parser.add_argument('-p','--mp','--minpixels', dest='minpixels', type=int,
help='minimum cluster size in pixels, to remove small pixel clusters.')
# vmask
vmask = parser.add_argument_group('AOI for threshold', 'Define the AOI for thresholding operations.')
vmask.add_argument('--vx', dest='v_subset_x', nargs=2, type=int, metavar=('XMIN', 'XMAX'),
help='AOI range in X for threshold operation (and keep the rest untouched.)')
vmask.add_argument('--vy', dest='v_subset_y', nargs=2, type=int, metavar=('YMIN', 'YMAX'),
help='AOI range in Y for threshold operation (and keep the rest untouched.)')
vmask.add_argument('--vroipoly', action='store_true',
help='AOI via interactive polygonal region of interest (ROI) selection.')
# velocity masking by velocityStd
parser.add_argument('--vstd', action='store_true',
help='mask according to the formula: |velocity| > a * velocityStd')
parser.add_argument('--vstd-num', dest='vstd_num', type=int, default=2,
help='multiple of velocityStd (a) to use for cutoff')
aoi = parser.add_argument_group('AOI', 'define secondary area of interest')
# AOI defined by parameters in command line
aoi.add_argument('-x','--sub-x', dest='subset_x', type=int, nargs=2, metavar=('XMIN', 'XMAX'),
help='selection range in x/cross-track/range direction')
aoi.add_argument('-y','--sub-y', dest='subset_y', type=int, nargs=2, metavar=('YMIN', 'YMAX'),
help='selection range in y/along-track/azimuth direction')
aoi.add_argument('--ex-circle', dest='ex_circle', nargs=3, type=int, metavar=('X', 'Y', 'RADIUS'),
help='exclude area defined by an circle (x, y, radius) in pixel number')
aoi.add_argument('--in-circle', dest='in_circle', nargs=3, type=int, metavar=('X', 'Y', 'RADIUS'),
help='include area defined by an circle (x, y, radius) in pixel number')
# AOI defined by file
aoi.add_argument('--base', dest='base_file', type=str,
help='exclude pixels == base_value\n'
'output_mask[base_data == base_value] = 0')
aoi.add_argument('--base-dset','--base-dataset', dest='base_dataset', type=str,
help='dataset in base_file to be used, for file with multiple datasets.\n'
'i.e.: --base inputs/geometryRadar.h5 --base-dset shadow --base-value 1')
aoi.add_argument('--base-value', dest='base_value', type=float, default=0,
help='value of pixels in base_file to be excluded.\nDefault: 0')
# AOI manual selected
aoi.add_argument('--roipoly', action='store_true',
help='Interactive polygonal region of interest (ROI) selection.')
aoi.add_argument('--view-cmd', dest='view_cmd', type=str,
help='view.py command to facilitate the AOI selection.'
'E.g. "-v -0.1 0.1"')
# special type of mask
parser.add_argument('--nonzero', dest='nonzero', action='store_true',
help='Select all non-zero pixels.\n' +
'i.e. maskConnComp.h5 from ifgramStack.h5')
parser.add_argument('--update', dest='update_mode', action='store_true',
help='Enable update checking for --nonzero option.')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import readfile
# check: --base and --base-dset options
if inps.base_file and inps.base_dataset:
base_dataset_list = readfile.get_dataset_list(inps.base_file)
if inps.base_dataset not in base_dataset_list:
msg = f'dataset {inps.base_dataset} NOT found in input base file {inps.base_file}'
msg += f'\navailable datasets:\n{base_dataset_list}'
warnings.warn(msg)
print('ignore --base --base-dset option and continue')
inps.base_file = None
inps.base_dataset = None
# default: --output
if not inps.outfile:
if inps.roipoly:
inps.outfile = 'maskPoly.h5'
elif 'temporalCoherence' in inps.file:
inps.outfile = 'maskTempCoh' + inps.file.split('temporalCoherence')[1]
else:
inps.outfile = 'mask.h5'
# "geo_" prefix
if inps.file.startswith('geo_'):
inps.outfile = 'geo_' + inps.outfile
# default: --min (for temporal coherence)
if inps.vmin is None and inps.file.endswith('temporalCoherence.h5'):
inps.vmin = 0.7
# default: dset (dataset name for non-zero mask from ifgram stack)
ftype = readfile.read_attribute(inps.file)['FILE_TYPE']
if not inps.dset and inps.nonzero and ftype == 'ifgramStack':
dset_list = readfile.get_dataset_list(inps.file)
inps.dset = [i for i in ['connectComponent', 'unwrapPhase'] if i in dset_list][0]
return inps
################################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.generate_mask import create_mask
# run
create_mask(inps)
################################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/geocode.py 0000775 0000000 0000000 00000025133 15032632755 0017614 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import math
import os
import sys
from mintpy.defaults.template import get_template_content
from mintpy.utils import arg_utils
######################################################################################
TEMPLATE = get_template_content('geocode')
EXAMPLE = """example:
geocode.py velocity.h5
geocode.py velocity.h5 -b -0.5 -0.25 -91.3 -91.1
geocode.py velocity.h5 timeseries.h5 -t smallbaselineApp.cfg --outdir ./geo --update
# geocode file using ISCE-2 lat/lon.rdr file
multilook.py lat.rdr.full.vrt lon.rdr.full.vrt -x 9 -y 3
geocode.py filt_fine.int --lat-file lat.rdr --lon-file lon.rdr
# radar-code file in geo coordinates
geocode.py swbdLat_S02_N01_Lon_W092_W090.wbd -l geometryRadar.h5 -o waterMask.rdr --geo2radar
geocode.py geo_velocity.h5 --geo2radar
"""
DEG2METER = """
degrees --> meters on equator
0.000925926 --> 100
0.000833334 --> 90
0.000555556 --> 60
0.000462963 --> 50
0.000370370 --> 40
0.000277778 --> 30
0.000185185 --> 20
0.000092593 --> 10
"""
def create_parser(subparsers=None):
synopsis = 'Resample radar-coded files into geo-coordinates or vice versa'
epilog = TEMPLATE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = arg_utils.create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', nargs='+', help='File(s) to be geocoded')
parser.add_argument('-d', '--dset', help='dataset to be geocoded, for example:\n' +
'height for geometryRadar.h5\n' +
'unwrapPhase-20100114_20101017 for ifgramStack.h5')
parser.add_argument('-l', '--lookup', dest='lookupFile',
help='Lookup table file generated by InSAR processors.')
parser.add_argument('--lat-file', dest='latFile', help='lookup table file for latitude.')
parser.add_argument('--lon-file', dest='lonFile', help='lookup table file for longitude.')
parser.add_argument('--geo2radar', '--geo2rdr', dest='radar2geo', action='store_false',
help='resample geocoded files into radar coordinates.\n' +
'ONLY for lookup table in radar-coord (ISCE, Doris).')
parser.add_argument('-t', '--template', dest='templateFile',
help="Template file with geocoding options.")
# output grid / geometry
out = parser.add_argument_group('grid in geo-coordinates')
out.add_argument('-b', '--bbox', dest='SNWE', type=float, nargs=4, metavar=('S', 'N', 'W', 'E'),
help='Bounding box for the area of interest.\n'
'using coordinates of the upper left corner of the first pixel\n'
' and the lower right corner of the last pixel\n'
"for radar2geo, it's the output spatial extent\n"
"for geo2radar, it's the input spatial extent")
out.add_argument('--lalo', '--lalo-step', dest='laloStep', type=float, nargs=2, metavar=('LAT_STEP', 'LON_STEP'),
help=f'output pixel size in degree in latitude / longitude.{DEG2METER}')
# interpolation / resampling
interp = parser.add_argument_group('interpolation')
interp.add_argument('-i', '--interp', dest='interpMethod', default='nearest', choices={'nearest', 'linear'},
help='interpolation/resampling method (default: %(default)s).')
interp.add_argument('--fill', dest='fillValue', type=float, default=math.nan,
help='Fill value for extrapolation (default: %(default)s or 0 for *.int/unw files).')
interp.add_argument('-n','--nprocs', dest='nprocs', type=int, default=1,
help='number of processors to be used for calculation (default: %(default)s).\n'
'Note: Do not use more processes than available processor cores.')
interp.add_argument('--software', dest='software', default='pyresample', choices={'pyresample', 'scipy'},
help='software/module used for interpolation (default: %(default)s)\n'
'Note: --bbox is not supported for -p scipy')
parser.add_argument('--update', dest='updateMode', action='store_true',
help='skip resampling if output file exists and newer than input file')
parser.add_argument('-o', '--output', dest='outfile',
help="output file name. Default: add prefix 'geo_'")
parser.add_argument('--outdir', '--output-dir', dest='out_dir', help='output directory.')
# computing
parser = arg_utils.add_memory_argument(parser)
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import readfile, utils as ut
# save argv (to check the manually specified arguments)
# use iargs for python call
# use sys.argv[1:] for command line call
inps.argv = iargs or sys.argv[1:]
# check
if inps.templateFile:
inps = read_template2inps(inps.templateFile, inps)
# check: input file(s) existence
inps.file = ut.get_file_list(inps.file)
if not inps.file:
raise Exception('ERROR: no input file found!')
elif len(inps.file) > 1:
inps.outfile = None
# check: --lookup (lookup table existence)
if not inps.lookupFile:
# use isce-2 lat/lon.rdr file
if not inps.lookupFile and inps.latFile:
inps.lookupFile = inps.latFile
# grab default lookup table
inps.lookupFile = ut.get_lookup_file(inps.lookupFile)
# final check
if not inps.lookupFile:
raise FileNotFoundError('No lookup table found! Can not geocode without it.')
# check: src file coordinate & radar2geo operatioin
atr = readfile.read_attribute(inps.file[0])
if 'Y_FIRST' in atr.keys() and inps.radar2geo:
print('input file is already geocoded')
print('to resample geocoded files into radar coordinates, use --geo2radar option')
print('exit without doing anything.')
sys.exit(0)
elif 'Y_FIRST' not in atr.keys() and not inps.radar2geo:
print('input file is already in radar coordinates, exit without doing anything')
sys.exit(0)
# check: --lalo-step
# valid only if:
# 1. radar2geo = True AND
# 2. lookup table is in radar coordinates
if inps.laloStep:
if not inps.radar2geo:
print('ERROR: "--lalo-step" can NOT be used together with "--geo2radar"!')
sys.exit(0)
atr = readfile.read_attribute(inps.lookupFile)
if 'Y_FIRST' in atr.keys():
print('ERROR: "--lalo-step" can NOT be used with lookup table file in geo-coordinates!')
sys.exit(0)
# check: --nprocs (number of processors for multiprocessing)
inps.nprocs = check_num_processor(inps.nprocs)
# check: --geo2radar
if not inps.radar2geo:
if inps.SNWE:
print('ERROR: "--geo2radar" can NOT be used together with "--bbox"!')
sys.exit(0)
if inps.software == 'scipy':
print('ERROR: "--geo2radar" is NOT supported for "--software scipy"!')
sys.exit(0)
# default: --fill (set default to zero for .int/unw file)
fext = os.path.splitext(inps.file[0])[1]
if '--fill' not in inps.argv and fext in ['.int', '.unw']:
inps.fillValue = 0
return inps
def read_template2inps(template_file, inps):
"""Read input template options into Namespace inps"""
print('read input option from template file:', template_file)
from mintpy.utils import readfile, utils as ut
iDict = vars(inps)
template = readfile.read_template(template_file, skip_chars=['[', ']'])
template = ut.check_template_auto_value(template)
key_prefix = 'mintpy.geocode.'
key_list = [i for i in list(iDict.keys()) if key_prefix + i in template.keys()]
for key in key_list:
value = template[key_prefix + key]
if value:
if key in ['SNWE', 'laloStep']:
iDict[key] = [float(i) for i in value.split(',')]
elif key in ['interpMethod']:
iDict[key] = value
elif key == 'fillValue':
if 'nan' in value.lower():
iDict[key] = math.nan
else:
iDict[key] = float(value)
# ensure laloStep is a list of two items
key = 'laloStep'
if key in iDict.keys() and iDict[key]:
if len(iDict[key]) == 1:
lalo_step = iDict[key]
iDict[key] = [-1 * abs(lalo_step[0]), abs(lalo_step[0])]
print(f'single laloStep input {lalo_step} detected, convert into two as {iDict[key]}')
elif len(iDict[key]) > 2:
raise ValueError(f'laloStep input {iDict[key]} could NOT have >2 items!')
# computing configurations
key = 'mintpy.compute.maxMemory'
if key in template.keys() and template[key]:
iDict['maxMemory'] = float(template[key])
return inps
def check_num_processor(nprocs):
"""Check number of processors
Note by Yunjun, 2019-05-02:
1. conda install pyresample will install pykdtree and openmp, but it seems not working:
geocode.py is getting slower with more processors
Test on a TS HDF5 file in size of (241, 2267, 2390)
Memory: up to 10GB
Run time: 2.5 mins for nproc=1, 3 mins for nproc=4
2. macports seems to have minor speedup when more processors
Thus, default number of processors is set to 1; although the capability of using multiple
processors is written here.
"""
if not nprocs:
# OMP_NUM_THREADS is defined in environment variable for OpenMP
if 'OMP_NUM_THREADS' in os.environ:
nprocs = int(os.getenv('OMP_NUM_THREADS'))
else:
nprocs = int(os.cpu_count() / 2)
nprocs = min(os.cpu_count(), nprocs)
print(f'number of processor to be used: {nprocs}')
return nprocs
######################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.geocode import run_geocode
# run
run_geocode(inps)
######################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/ifgram_inversion.py 0000775 0000000 0000000 00000031215 15032632755 0021546 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import os
import sys
from mintpy.defaults.template import get_template_content
from mintpy.utils import arg_utils
################################################################################################
TEMPLATE = get_template_content('invert_network')
REFERENCE = """references:
# SBAS
Berardino, P., Fornaro, G., Lanari, R., & Sansosti, E. (2002). A new algorithm for surface
deformation monitoring based on small baseline differential SAR interferograms. IEEE TGRS,
40(11), 2375-2383. doi:10.1109/TGRS.2002.803792
# weighted SBAS: coh, fim, var
Perissin, D., and Wang, T. (2012), Repeat-pass SAR interferometry with partially coherent targets, IEEE TGRS,
50(1), 271-280, doi:10.1109/tgrs.2011.2160644.
Samiei-Esfahany, S., Martins, J. E., Van Leijen, F., and Hanssen, R. F. (2016), Phase Estimation for Distributed
Scatterers in InSAR Stacks Using Integer Least Squares Estimation, IEEE TGRS, 54(10), 5671-5687.
Seymour, M. S., and Cumming, I. G. (1994), Maximum likelihood estimation for SAR interferometry, 1994.
IGARSS '94., 8-12 Aug 1994.
Yunjun, Z., Fattahi, H., and Amelung, F. (2019), Small baseline InSAR time series analysis: Unwrapping error
correction and noise reduction, Computers & Geosciences, 133, 104331, doi:10.1016/j.cageo.2019.104331.
# temporal coherence
Pepe, A., and Lanari, R. (2006), On the extension of the minimum cost flow algorithm for phase unwrapping
of multitemporal differential SAR interferograms, IEEE-TGRS, 44(9), 2374-2383.
# time-series uncertainty
Yunjun, Z., Fattahi, H., Brancato, V., Rosen, P., Simons, M. (2021), Oral: Tectonic displacement mapping from SAR
offset time series: noise reduction and uncertainty quantification, ID 590, FRINGE 2021, 31 May – 4 Jun, 2021, Virtual.
"""
EXAMPLE = """example:
ifgram_inversion.py inputs/ifgramStack.h5 -t smallbaselineApp.cfg --update
ifgram_inversion.py inputs/ifgramStack.h5 -w no # turn off weight for fast processing
ifgram_inversion.py inputs/ifgramStack.h5 -c no # turn off parallel processing
# offset
ifgram_inversion.py inputs/ifgramStack.h5 -i rangeOffset -w no -m waterMask.h5 --md offsetSNR --mt 5
ifgram_inversion.py inputs/ifgramStack.h5 -i azimuthOffset -w no -m waterMask.h5 --md offsetSNR --mt 5
"""
def create_parser(subparsers=None):
synopsis = 'Invert network of interferograms into time-series.'
epilog = REFERENCE + '\n' + TEMPLATE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = arg_utils.create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
# input dataset
parser.add_argument('ifgramStackFile', help='interferograms stack file to be inverted')
parser.add_argument('-t','--template', dest='templateFile', help='template text file with options')
parser.add_argument('-i','-d', '--dset', dest='obsDatasetName', type=str,
help='dataset name of unwrap phase / offset to be used for inversion'
'\ne.g.: unwrapPhase, unwrapPhase_bridging, ...')
parser.add_argument('-m','--water-mask', dest='waterMaskFile',
help='Skip inversion on the masked out region, i.e. water.')
# options rarely used or changed
parser.add_argument('-o', '--output', dest='outfile', nargs=3,
metavar=('TS_FILE', 'TCOH_FILE', 'NUM_INV_FILE'),
help='Output file name. (default: %(default)s).')
parser.add_argument('--ref-date', dest='ref_date', help='Reference date, first date by default.')
parser.add_argument('--skip-reference','--skip-ref', dest='skip_ref', action='store_true',
help='[for offset and testing] do not apply spatial referencing.')
# solver
solver = parser.add_argument_group('solver', 'solver for the network inversion problem')
solver.add_argument('-w', '--weight-func', dest='weightFunc', default='var',
choices={'var', 'fim', 'coh', 'no'},
help='function used to convert coherence to weight for inversion:\n' +
'var - inverse of phase variance due to temporal decorrelation (default)\n' +
'fim - Fisher Information Matrix as weight' +
'coh - spatial coherence\n' +
'no - no/uniform weight')
solver.add_argument('--min-norm-phase', dest='minNormVelocity', action='store_false',
help=('Enable inversion with minimum-norm deformation phase,'
' instead of the default minimum-norm deformation velocity.'))
#solver.add_argument('--norm', dest='residualNorm', default='L2', choices=['L1', 'L2'],
# help='Optimization method, L1 or L2 norm. (default: %(default)s).')
# uncertainty propagation
parser.add_argument('--calc-cov', dest='calcCov', action='store_true',
help='Calculate time-series STD via linear propagation '
'from the network of interferograms or offset pairs.')
# mask
mask = parser.add_argument_group('mask', 'mask observation data before inversion')
mask.add_argument('--mask-dset','--mask-dataset','--md', dest='maskDataset',
help='dataset used to mask unwrapPhase, e.g. coherence, connectComponent')
mask.add_argument('--mask-thres','--mask-threshold','--mt', dest='maskThreshold', metavar='NUM', type=float, default=0.4,
help='threshold to generate mask when mask is coherence (default: %(default)s).')
mask.add_argument('--min-redun','--min-redundancy','--mr', dest='minRedundancy', metavar='NUM', type=float, default=1.0,
help='minimum redundancy of interferograms for every SAR acquisition. (default: %(default)s).')
# for offset ONLY
#mask.add_argument('--mask-min-snr', dest='maskMinSNR', type=float, default=10.0,
# help='minimum SNR to disable/ignore the threshold-based masking [for offset only].')
#mask.add_argument('--mask-min-area-size', dest='maskMinAreaSize', type=float, default=16.0,
# help='minimum area size to disable/ignore the threshold-based masking [for offset only]')
# computing
parser = arg_utils.add_memory_argument(parser)
parser = arg_utils.add_parallel_argument(parser)
# update / skip
parser.add_argument('--update', dest='update_mode', action='store_true',
help='Enable update mode, and skip inversion if output timeseries file already exists,\n' +
'readable and newer than input interferograms file')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.objects import cluster, ifgramStack
from mintpy.utils import readfile
# save argv (to check the manually specified arguments)
# use iargs for python call
# use sys.argv[1:] for command line call
inps.argv = iargs or sys.argv[1:]
# check
atr = readfile.read_attribute(inps.ifgramStackFile)
# check: input file type
if atr['FILE_TYPE'] not in ['ifgramStack']:
raise ValueError('input is {} file, support ifgramStack file only.'.format(atr['FILE_TYPE']))
# check: template file
if inps.templateFile:
inps, template = read_template2inps(inps.templateFile, inps)
else:
template = dict()
# check: --cluster and --num-worker option
inps.numWorker = str(cluster.DaskCluster.format_num_worker(inps.cluster, inps.numWorker))
if inps.cluster and inps.numWorker == '1':
print('WARNING: number of workers is 1, turn OFF parallel processing and continue')
inps.cluster = None
# default: --dset option
if not inps.obsDatasetName:
inps.obsDatasetName = 'unwrapPhase'
# determine suffix based on unwrapping error correction method
obs_suffix_map = {
'bridging' : '_bridging',
'phase_closure' : '_phaseClosure',
'bridging+phase_closure' : '_bridging_phaseClosure',
}
key = 'mintpy.unwrapError.method'
if key in template.keys() and template[key]:
unw_err_method = template[key].lower().replace(' ','') # fix potential typo
inps.obsDatasetName += obs_suffix_map[unw_err_method]
print(f'phase unwrapping error correction "{unw_err_method}" is turned ON')
print(f'use dataset "{inps.obsDatasetName}" by default')
# check: --dset option (if input observation dataset exists)
stack_obj = ifgramStack(inps.ifgramStackFile)
stack_obj.open(print_msg=False)
if inps.obsDatasetName not in stack_obj.datasetNames:
msg = f'input dataset name "{inps.obsDatasetName}" not found in file: {inps.ifgramStackFile}'
raise ValueError(msg)
# default: --skip-ref option
if ('offset' in inps.obsDatasetName.lower()
and 'REF_X' not in atr.keys()
and 'REF_Y' not in atr.keys()):
inps.skip_ref = True
# default: --output option
if not inps.outfile:
if inps.obsDatasetName.startswith('unwrapPhase'):
if os.path.basename(inps.ifgramStackFile).startswith('ion'):
inps.outfile = ['ion.h5', 'temporalCoherenceIon.h5', 'numInvIon.h5']
else:
inps.outfile = ['timeseries.h5', 'temporalCoherence.h5', 'numInvIfgram.h5']
elif inps.obsDatasetName.startswith('azimuthOffset'):
inps.outfile = ['timeseriesAz.h5', 'residualInvAz.h5', 'numInvOffAz.h5']
elif inps.obsDatasetName.startswith('rangeOffset'):
inps.outfile = ['timeseriesRg.h5', 'residualInvRg.h5', 'numInvOffRg.h5']
else:
raise ValueError(f'un-recognized input observation dataset name: {inps.obsDatasetName}')
# default: --output (split for easy reference)
inps.tsFile, inps.invQualityFile, inps.numInvFile = inps.outfile
# default: --water-mask option
if inps.waterMaskFile and not os.path.isfile(inps.waterMaskFile):
inps.waterMaskFile = None
return inps
def read_template2inps(template_file, inps):
"""Read input template options into Namespace inps"""
print('read input option from template file:', template_file)
from mintpy.ifgram_inversion import key_prefix
from mintpy.utils import readfile, utils1 as ut
iDict = vars(inps)
template = readfile.read_template(template_file)
template = ut.check_template_auto_value(template)
key_list = [x for x in list(iDict.keys()) if key_prefix+x in template.keys()]
# ensure manually specified options in command line overwrite template options
# by ignoring the keys appeared in command line
dest_opt_str = arg_utils.get_dest_option_str_dict(create_parser())
key_list = [x for x in key_list if all(y not in inps.argv for y in dest_opt_str[x])]
for key in key_list:
value = template[key_prefix+key]
if key in ['weightFunc', 'maskDataset', 'minNormVelocity']:
iDict[key] = value
elif value:
if key in ['maskThreshold', 'minRedundancy']:
iDict[key] = float(value)
elif key in ['residualNorm', 'waterMaskFile']:
iDict[key] = value
# computing configurations
dask_key_prefix = 'mintpy.compute.'
key_list = [x for x in list(iDict.keys()) if dask_key_prefix+x in template.keys()]
for key in key_list:
value = template[dask_key_prefix+key]
if key in ['cluster', 'config']:
iDict[key] = value
elif value:
if key in ['numWorker']:
iDict[key] = str(value)
elif key in ['maxMemory']:
iDict[key] = float(value)
# False/None --> 'no'
for key in ['weightFunc']:
if not iDict[key]:
iDict[key] = 'no'
return inps, template
################################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.ifgram_inversion import run_ifgram_inversion, run_or_skip
# run or skip
if inps.update_mode and run_or_skip(inps) == 'skip':
return
# run
run_ifgram_inversion(inps)
################################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/image_math.py 0000775 0000000 0000000 00000005267 15032632755 0020310 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import sys
from mintpy.utils.arg_utils import create_argument_parser
#######################################################################################
EXAMPLE = """example:
image_math.py velocity.h5 '+' 0.5
image_math.py geo_080212_101120.cor '-' 0.2
image_math.py timeseries.h5 '*' 1.5
image_math.py velocity.h5 '/' 2.0
image_math.py velocity.h5 '^' 2.0
# update isce2 offset files
image_math.py azimuth_*.off '+' 0.0077 --overwrite
"""
def create_parser(subparsers=None):
synopsis = 'Basic Mathmatic Operation of file'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', nargs='+', help='input file(s).')
parser.add_argument('-o', '--output', dest='outfile',
help='output file name.')
parser.add_argument('--overwrite', '--overwrite-input', dest='overwrite', action='store_true',
help='overwrite input file (disabled if -o/--output is turned on)')
parser.add_argument('operator', choices=[
'+', '-', '*', '/', '^'], help='mathmatical operator')
parser.add_argument('operand', metavar='VALUE', type=float,
help='value to be operated with input file')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# check: --overwrite vs --output
if inps.outfile and inps.overwrite:
print('-o/--output is turned ON, disable --overwrite option and continue.')
inps.overwrite = False
return inps
#######################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.image_math import file_operation
# run
num_file = len(inps.file)
for i, fname in enumerate(inps.file):
if num_file > 1:
print('-'*20 + f' {i+1}/{num_file} {fname}')
out_file = fname if inps.overwrite else inps.outfile
file_operation(fname, inps.operator, inps.operand, out_file)
#######################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/image_stitch.py 0000775 0000000 0000000 00000006253 15032632755 0020651 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Heresh Fattahi, Aug 2022 #
############################################################
import sys
from mintpy.utils.arg_utils import create_argument_parser
#############################################################################################
EXAMPLE = """example:
image_stitch.py vel_AlosAT422.h5 vel_AlosAT423.h5 vel_AlosAT424.h5 vel_AlosAT425.h5 -o vel_AlosA.h5
image_stitch.py geom_AlosAT422.h5 geom_AlosAT423.h5 geom_AlosAT424.h5 geom_AlosAT425.h5 -o geom_AlosA.h5 --no-offset
"""
NOTE = """
The function automatically:
1) finds the common area between adjacent input files
2) calculates the average offset between them
3) apply this average offset to the later file
"""
def create_parser(subparsers=None):
synopsis = 'Stitch/mosaic multiple geocoded datasets into one.'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis+NOTE, epilog=epilog, subparsers=subparsers)
parser.add_argument('file1', help='file to stitch')
parser.add_argument('file2s', nargs='+', metavar='file2', help='file(s) to stitch')
parser.add_argument('-o', '--output', dest='outfile', required=True, help='output file name')
# stitch option
parser.add_argument('--no-offset','--no-off', dest='apply_offset', action='store_false',
help='Do not apply offset if 1) data sets are merely to be stitched '
'AND 2) no adjustment of values needs to be made\n'
'(i.e., for two coherence maps), use this flag')
# plot options
parser.add_argument('--scale', dest='disp_scale', type=float, default=1.,
help='scale the data when plotting.')
parser.add_argument('-v','--vlim', dest='disp_vlim', type=float, default=None, nargs=2,
help='vmin and vmax when plotting.')
parser.add_argument('-c','--cmap', dest='disp_cmap', type=str, default=None,
help='colormap when plotting.')
parser.add_argument('--nodisplay', dest='disp_fig', action='store_false',
help='do not display the result plotting.')
return parser
def cmd_line_parse(iargs=None):
parser = create_parser()
inps = parser.parse_args(args=iargs)
return inps
#############################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.image_stitch import stitch_files
# run
stitch_files(
fnames=[inps.file1] + inps.file2s,
out_file=inps.outfile,
apply_offset=inps.apply_offset,
disp_fig=inps.disp_fig,
disp_scale=inps.disp_scale,
disp_vlim=inps.disp_vlim,
disp_cmap=inps.disp_cmap,
)
#############################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/info.py 0000775 0000000 0000000 00000007263 15032632755 0017146 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import os
import sys
from mintpy.utils.arg_utils import create_argument_parser
############################################################
EXAMPLE = """example:
info.py timeseries.h5
info.py velocity.h5
info.py ifgramStack.h5
# Display dataset
info.py timeseries.py --dset date
info.py timeseries.py --dset bperp
# Time / Date Info
info.py ifgramStack.h5 --date #print date1_date2 info for all interferograms
info.py timeseries.h5 --num #print date list of timeseries with its number
info.py ifgramStack.h5 --date --show kept #print date1_date2 info for kept interferograms
info.py ifgramStack.h5 --date --show dropped #print date1_date2 info for dropped/excluded interferograms
info.py LS-PARAMS.h5 --date > date_list.txt #print date list of timeseries and save it to txt file.
info.py S1_IW12_128_0593_0597_20141213_20180619.h5 --date
# save date1_date2 info of interferograms to a text file
info.py ifgramStack.h5 --date --show kept > date12_list.txt
# Slice / Dataset Info
info.py timeseries.h5 --slice
info.py inputs/ifgramStack.h5 --slice
info.py S1_IW12_128_0593_0597_20141213_20180619.h5 --slice
info.py LS-PARAMS.h5 --slice
"""
def create_parser(subparsers=None):
"""Create command line parser."""
synopsis = 'Display Metadata / Structure information of ANY File'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', type=str, help='File to check')
parser.add_argument('--compact', action='store_true',
help='show compact info by displaying only the top 20 metadata')
parser.add_argument('--dset', type=str, help='Show dataset')
par_list = parser.add_argument_group('List','list date/slice info')
par_list.add_argument('--date', dest='disp_date', action='store_true',
help='Show date/date12 info of input file')
par_list.add_argument('--num', dest='disp_num', action='store_true',
help='Show date/date12 info with numbers')
par_list.add_argument('--slice', dest='disp_slice', action='store_true',
help='Show slice list of the file')
par_list.add_argument('--show','--show-ifgram', dest='disp_ifgram',
choices={'all','kept','dropped'}, default='all',
help='Show all / kept / dropped interferograms only. Default: all.')
return parser
def cmd_line_parse(iargs=None):
"""Command line parser."""
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# check: input file existence
if not os.path.isfile(inps.file):
raise FileNotFoundError(inps.file)
# default: --compact option and max number of metadata to show
inps.max_meta_num = 10000
if inps.compact:
inps.max_meta_num = 20
return inps
############################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.info import print_info
# run
print_info(inps)
############################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/iono_split_spectrum.py 0000775 0000000 0000000 00000013656 15032632755 0022317 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Zhang Yunjun, Mar 2024 #
############################################################
import os
import sys
from mintpy.defaults.template import get_template_content
from mintpy.utils.arg_utils import create_argument_parser
# key configuration parameter name
key_prefix = 'mintpy.ionosphericDelay.'
###############################################################
TEMPLATE = get_template_content('correct_ionosphere')
REFERENCE = """reference:
Gomba, G., Parizzi, A., Zan, F. D., Eineder, M., & Bamler, R. (2016). Toward Operational Compensation
of Ionospheric Effects in SAR Interferograms: The Split-Spectrum Method. IEEE Transactions on
Geoscience and Remote Sensing, 54(3), 1446-1461. doi:10.1109/TGRS.2015.2481079
# ISCE-2 topsApp/topsStack
Liang, C., Agram, P., Simons, M., & Fielding, E. J. (2019). Ionospheric Correction of InSAR Time Series
Analysis of C-band Sentinel-1 TOPS Data. IEEE Trans. Geosci. Remote Sens., 59(9), 6755-6773,
doi:10.1109/TGRS.2019.2908494.
# ISCE-2 stripmapApp/stripmapStack
Fattahi, H., Simons, M., & Agram, P. (2017). InSAR Time-Series Estimation of the Ionospheric Phase
Delay: An Extension of the Split Range-Spectrum Technique. IEEE Trans. Geosci. Remote Sens., 55(10),
5984-5996, doi:10.1109/TGRS.2017.2718566
# ISCE-2 alos2App/alosStack
Liang, C., Liu, Z., Fielding, E. J., & Bürgmann, R. (2018). InSAR Time Series Analysis of L-Band
Wide-Swath SAR Data Acquired by ALOS-2. IEEE Trans. Geosci. Remote Sens., 56(8), 4492-4506,
doi:10.1109/TGRS.2018.2821150
"""
EXAMPLE = """example:
# CAUTION: Failed split spectrum estimations are common, check & locate pairs with failed estimations,
# exclude them using mintpy.ionosphericDelay.excludeDate(12) options.
# For alosStack, check plots in the "fig_ion" folder.
# estimate ionospheric delay time-series and correct time-series file
iono_split_spectrum.py -t JinshaAlos2A148.txt -f timeseries_SET.h5
# estimate ionospheric delay time-series
iono_split_spectrum.py -t JinshaAlos2A148.txt
"""
def create_parser(subparsers=None):
synopsis = 'Ionospheric correction using split spectrum (from ISCE-2 stack processing)'
epilog = REFERENCE + '\n' + TEMPLATE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
# inputs
parser.add_argument('-t', '--template', dest='template_file', required=True,
help='template file with ionospheric delay options.')
parser.add_argument('--iono-stack-file', dest='iono_stack_file', default='./inputs/ionStack.h5',
help='input ionospheric delay stack file (default: %(default)s).')
parser.add_argument('-f', '--file', dest='dis_file',
help='time-series HDF5 file to be corrected, e.g. timeseries.h5')
# modify network
parser.add_argument('--ex-date12','--exclude-date12', dest='excludeDate12', nargs='*',
help='pair(s) to remove/drop in YYYYMMDD_YYYYMMDD format.')
parser.add_argument('--ex-date','--exclude-date', dest='excludeDate', nargs='*',
help='date(s) to remove/drop, all pairs included date(s) will be removed')
# outputs
parser.add_argument('--iono-file', dest='iono_file', default='ion.h5',
help='output ionospheric delay time series file (default: %(default)s).')
parser.add_argument('-o', '--output', dest='cor_dis_file',
help='output corrected time-series file, e.g. timeseries_ion.h5')
return parser
def cmd_line_parse(iargs=None):
"""Command line parser."""
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# check
if inps.template_file:
inps = read_template2inps(inps.template_file, inps)
# check: existence of the input file
if inps.dis_file and not os.path.isfile(inps.dis_file):
raise FileNotFoundError(f'input file not exist: {inps.dis_file}')
# default: -o / --output option
if inps.dis_file and not inps.cor_dis_file:
fbase, fext = os.path.splitext(inps.dis_file)
inps.cor_dis_file = f'{fbase}_ion{fext}'
# default: use absolute path for all files
inps.template_file = os.path.abspath(inps.template_file)
inps.iono_stack_file = os.path.abspath(inps.iono_stack_file)
inps.iono_file = os.path.abspath(inps.iono_file)
if inps.dis_file:
inps.dis_file = os.path.abspath(inps.dis_file)
inps.cor_dis_file = os.path.abspath(inps.cor_dis_file)
return inps
def read_template2inps(template_file, inps):
"""Read input template options into Namespace inps"""
print('read input option from template file:', template_file)
from mintpy.utils import ptime, readfile, utils1 as ut
iDict = vars(inps)
template = readfile.read_template(template_file, skip_chars=['[', ']'])
template = ut.check_template_auto_value(template)
key_list = [i for i in list(iDict.keys()) if key_prefix + i in template.keys()]
for key in key_list:
value = template[key_prefix + key]
if value:
if key == 'excludeDate':
iDict[key] = ptime.yyyymmdd(value.split(','))
elif key == 'excludeDate12':
iDict[key] = ptime.yyyymmdd_date12(value.split(','))
return inps
###############################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.iono_split_spectrum import run_iono_split_spectrum
# run
run_iono_split_spectrum(inps)
###############################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/iono_tec.py 0000775 0000000 0000000 00000013733 15032632755 0020011 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import os
import sys
from mintpy.utils.arg_utils import create_argument_parser
#####################################################################################
REFERENCE = """references:
Yunjun, Z., Fattahi, H., Pi, X., Rosen, P., Simons, M., Agram, P., & Aoki, Y. (2022).
Range Geolocation Accuracy of C-/L-band SAR and its Implications for Operational
Stack Coregistration. IEEE Trans. Geosci. Remote Sens., 60, doi:10.1109/TGRS.2022.3168509.
Schaer, S., Gurtner, W., & Feltens, J. (1998). IONEX: The ionosphere map exchange format
version 1.1. Paper presented at the Proceedings of the IGS AC workshop, Darmstadt, Germany.
"""
EXAMPLE = """example:
iono_tec.py timeseriesRg.h5 -g inputs/geometryRadar.h5
iono_tec.py timeseriesRg.h5 -g inputs/geometryRadar.h5 -s cod
"""
def create_parser(subparsers=None):
synopsis = 'Calculate ionospheric ramps using Global Iono Maps from GNSS-based TEC products.'
epilog = REFERENCE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('dis_file', help='displacement time-series HDF5 file, i.e. timeseries.h5')
parser.add_argument('-g','--geomtry', dest='geom_file', type=str, required=True,
help='geometry file including incidence/azimuthAngle.')
parser.add_argument('-s','--sol','--sol-code', dest='sol_code', default='jpl',
choices={'cod','esa','igs','jpl','upc','uqr'},
help='GIM solution center code (default: %(default)s).\n'
'https://cddis.nasa.gov/Data_and_Derived_Products/GNSS/atmospheric_products.html')
parser.add_argument('--tec-dir', dest='tec_dir', default='${WEATHER_DIR}/IONEX',
help='directory of downloaded GNSS TEC data (default: %(default)s).')
# output
parser.add_argument('--update', dest='update_mode', action='store_true', help='Enable update mode.')
parser.add_argument('--iono-file', dest='iono_file', help='calculated LOS iono ramp time-series file.')
#parser.add_argument('-o', dest='cor_dis_file', help='Output file name for the corrected time-series.')
# GIM extraction
tec_cfg = parser.add_argument_group('GIM extraction', 'Parameters to extract TEC at point of interest from '
'GIM (mainly for impact demonstration).')
tec_cfg.add_argument('-i','--interp', dest='interp_method', default='linear3d',
choices={'nearest', 'linear2d', 'linear3d'},
help='Interpolation method to grab the GIM value at the point of interest'
' (default: %(default)s).')
tec_cfg.add_argument('--norotate', dest='rotate_tec_map', action='store_false',
help="Rotate TEC maps along the longitude direction to compensate the correlation\n"
"between the ionosphere and the Sun's position (Schaer et al. (1998).\n"
"For 'interp_method == linear3d' ONLY. (default: %(default)s).")
tec_cfg.add_argument('--ratio', dest='sub_tec_ratio', type=str,
help='Ratio to calculate the sub-orbital TEC from the total TEC.\n'
'Set to "adaptive" for seasonally adaptive scaling.\n'
' Based on equation (14) from Yunjun et al. (2022).\n'
'Set to "a value" within (0,1] for a fixed scaling\n'
'E.g. 0.75 for TerraSAR-X (Gisinger et al., 2021)\n'
' 0.90 for Sentinel-1 (Gisinger et al., 2021)\n'
' 0.69 for Sentinel-1 (Yunjun et al., 2022)\n')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import utils0 as ut
# check: --tec-dir option
inps.tec_dir = os.path.expanduser(inps.tec_dir)
inps.tec_dir = os.path.expandvars(inps.tec_dir)
if not os.path.isdir(inps.tec_dir):
print(f'WARNING: Input TEC dir "{inps.tec_dir}" does not exist!')
inps.tec_dir = os.path.join(os.path.dirname(inps.dis_file), 'TEC')
print(f'Use "{inps.tec_dir}" instead.')
# check: --ratio option
if inps.sub_tec_ratio is None:
suffix = ''
elif ut.is_number(inps.sub_tec_ratio):
suffix = f'R{float(inps.sub_tec_ratio)*100:.0f}'
elif inps.sub_tec_ratio.startswith('adap'):
suffix = 'RA'
else:
raise ValueError('Input is neither a number nor startswith adap!')
# default: input/output file paths
inps.dis_file = os.path.abspath(inps.dis_file)
inps.geom_file = os.path.abspath(inps.geom_file)
if not inps.iono_file:
geom_dir = os.path.dirname(inps.geom_file)
inps.iono_file = os.path.join(geom_dir, f'TEC{inps.sol_code[0]}lr{suffix}.h5')
#if not inps.cor_dis_file:
# dis_dir = os.path.dirname(inps.dis_file)
# fbase, fext = os.path.splitext(os.path.basename(inps.dis_file))
# suffix = os.path.splitext(os.path.basename(inps.iono_file))[0]
# inps.cor_dis_file = os.path.join(dis_dir, f'{fbase}_{suffix}{fext}')
return inps
#####################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.iono_tec import run_iono_tec
# run
run_iono_tec(inps)
#####################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/load_data.py 0000775 0000000 0000000 00000010572 15032632755 0020120 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import os
import sys
from mintpy.defaults import auto_path
from mintpy.defaults.template import get_template_content
from mintpy.utils.arg_utils import create_argument_parser
#################################################################
DEFAULT_TEMPLATE = """template:
########## 1. Load Data (--load to exit after this step)
{}\n
{}\n
{}""".format(
auto_path.AUTO_PATH_GAMMA,
auto_path.AUTO_PATH_ISCE_STRIPMAP,
auto_path.AUTO_PATH_ISCE_TOPS,
)
TEMPLATE = get_template_content('load_data')
NOTE = """NOTE:
For interferogram, unwrapPhase is required, the other dataset are optional, including coherence, connectComponent, wrapPhase, etc.
The unwrapPhase metadata file requires DATE12 attribute in YYMMDD-YYMMDD format.
All path of data file must contain the reference and secondary date, either in file name or folder name.
"""
EXAMPLE = """example:
# MUST run in the mintpy working directory!
# show example template file for ISCE/ROI_PAC/GAMMA products
load_data.py -H
# load & write the following HDF5 files:
# ./inputs/ifgramStack.h5 for interferogram stack
# ./inputs/ionStack.h5 for ionosphere stack
# ./inputs/offsetStack.h5 for range/azimuth offset stack
# ./inputs/geometryRadar.h5 for geometry in radar coordinates
# ./inputs/geometryGeo.h5 for geometry in geo coordinates
load_data.py -t smallbaselineApp.cfg
load_data.py -t smallbaselineApp.cfg GalapagosSenDT128.txt --project GalapagosSenDT128
# load geometry ONLY
smallbaselineApp.py SaltonSeaSenDT173.txt -g
load_data.py -t smallbaselineApp.cfg --geom
"""
def create_parser(subparsers=None):
"""Create command line parser."""
synopsis = 'Load stacks of interferograms to HDF5 files'
epilog = TEMPLATE + '\n' + NOTE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
# extra help
parser.add_argument('-H', dest='print_example_template', action='store_true',
help='Print/Show the example template file for loading.')
# input files
parser.add_argument('-t', '--template', dest='template_file', type=str, nargs='+',
help='template file(s) with path info.')
parser.add_argument('--geom','--geometry', dest='only_load_geometry', action='store_true',
help='Load the geometry file(s) ONLY.')
# options from template file name & content
parser.add_argument('--project', type=str, dest='PROJECT_NAME',
help='project name of dataset for INSARMAPS Web Viewer')
parser.add_argument('--enforce', '-f', dest='updateMode', action='store_false',
help='Disable the update mode, or skip checking dataset already loaded.')
return parser
def cmd_line_parse(iargs=None):
"""Command line parser."""
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# check: -H option
if inps.print_example_template:
print(DEFAULT_TEMPLATE)
sys.exit(0)
# check: -t/--template option
# -t option is required AND
# smallbaselineApp.cfg file is required
if not inps.template_file:
parser.print_usage()
script_name = os.path.basename(__file__)
print(f'{script_name}: error: -t/--template option is required.')
print(f'run {script_name} -H to show the example template file.')
sys.exit(1)
elif all(not x.endswith('smallbaselineApp.cfg') for x in inps.template_file):
script_name = os.path.basename(__file__)
print(f'{script_name}: error: at least smallbaselineApp.cfg file is required for -t/--template option.')
sys.exit(1)
return inps
#################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.load_data import load_data
# run
load_data(inps)
#################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/load_gbis.py 0000775 0000000 0000000 00000003611 15032632755 0020127 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import os
import sys
from mintpy.utils.arg_utils import create_argument_parser
##############################################################################
EXAMPLE = """example:
load_gbis.py invert_1_2_C.mat
load_gbis.py invert_1_2_C.mat --nodisplay
"""
def create_parser(subparsers=None):
synopsis = 'Load GBIS inversion result to HDF5 format.'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', help='GBIS inversion mat file.')
parser.add_argument('-o', '--output', dest='outfile', help='output file name.')
parser.add_argument('--nodisplay', dest='disp_fig', action='store_false', help='do not display the figure')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
import matplotlib.pyplot as plt
# check: input file path
inps.file = os.path.abspath(inps.file)
# check: --nodisplay (matplotlib backend setting)
if not inps.disp_fig:
plt.switch_backend('Agg')
return inps
##############################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.load_gbis import gbis_mat2hdf5
# run
gbis_mat2hdf5(inps.file, display=inps.disp_fig)
##############################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/local_oscilator_drift.py 0000775 0000000 0000000 00000004674 15032632755 0022557 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Heresh Fattahi, Aug 2022 #
############################################################
import sys
from mintpy.defaults.template import get_template_content
from mintpy.utils.arg_utils import create_argument_parser
#########################################################################################
TEMPLATE = get_template_content('correct_LOD')
REFERENCE = """reference:
Marinkovic, P., and Y. Larsen (2013), Consequences of long-term ASAR local oscillator
frequency decay - An empirical study of 10 years of data, 2013 Living Planet Symposium,
Edinburgh, U.K.
"""
EXAMPLE = """example:
local_oscilator_drift.py timeseries.h5 inputs/geometryRadar.h5
local_oscilator_drift.py filt_101020_110220_4rlks.unw inputs/geometryRadar.h5
"""
def create_parser(subparsers=None):
synopsis = 'Local Oscillator Drift (LOD) correction of Envisat'
epilog = REFERENCE + '\n' + TEMPLATE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument(dest='file', help='timeseries / interferograms file, i.e. timeseries.h5')
parser.add_argument(dest='range_dist_file',
help='Slant range distance file, i.e. inputs/geometryRadar.h5, inputs/geometryGeo.h5\n' +
'or use range_distance.py to generate it.')
parser.add_argument('-o', '--output', dest='out_file',
help='Output file name for corrected file.')
return parser
def cmd_line_parse(iargs=None):
parser = create_parser()
inps = parser.parse_args(args=iargs)
return inps
#########################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.local_oscilator_drift import correct_local_oscilator_drift
# run
inps.outfile = correct_local_oscilator_drift(
inps.file,
rg_dist_file=inps.range_dist_file,
out_file=inps.out_file,
)
#########################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/lookup_geo2radar.py 0000775 0000000 0000000 00000004035 15032632755 0021444 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Yunmeng Cao, Aug 2022 #
############################################################
import sys
from mintpy.utils.arg_utils import create_argument_parser
################################################################################
EXAMPLE = '''examples:
lookup_geo2radar.py geometryGeo.h5
lookup_geo2radar.py geometryGeo.h5 -w geometryRadar.h5
lookup_geo2radar.py geometryGeo.h5 -w geometryRadar.h5 --parallel 4
'''
def create_parser(subparsers=None):
synopsis = 'Convert lookup table from geo-coord (GAMMA, ROI_PAC) into radar-coord (ISCE)'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('geom_geo_file', help='The geometryGeo.h5 file which includes geo-coordinates based lookup-table')
parser.add_argument('-w','--write', dest='write', metavar='FILE', default='geometryRadar.h5',
help='update geometryRadar.h5 file by adding the radar-coordinates based lookup-table.')
parser.add_argument('--parallel', dest='parallelNumb', type=int, metavar='NUM', default=1,
help='Enable parallel processing and specify the the used processor number.[default: 1]')
return parser
def cmd_line_parse(iargs=None):
parser = create_parser()
inps = parser.parse_args(args=iargs)
return inps
################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.lookup_geo2radar import run_lookup_geo2radar
# run
run_lookup_geo2radar(inps)
##############################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/mask.py 0000775 0000000 0000000 00000005662 15032632755 0017147 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import math
import sys
from mintpy.utils.arg_utils import create_argument_parser
############################################################
EXAMPLE = """example:
mask.py velocity.h5 -m maskTempCoh.h5
mask.py timeseries.h5 -m temporalCoherence.h5 --vmin 0.7
mask.py ifgramStack.h5 -m 100102_101120.cor --vmin 0.9 -y 200 300 -x 300 400
mask.py filt_20060924_20090214.int -m waterMask.h5 -o filt_20060924_20090214_msk.int
mask.py filt_20060924_20090214.cor -m waterMask.h5 -o filt_20060924_20090214_msk.cor
"""
def create_parser(subparsers=None):
synopsis = 'Mask file'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', help='File to be masked')
parser.add_argument('-m', '--mask', dest='mask_file', required=True,
help='mask out pixels with mask value == 0.')
parser.add_argument('-o', '--outfile', help='Output file name.')
# modify input mask
parser.add_argument('--vmin','--mask-vmin', dest='mask_vmin', type=float,
help='mask out pixels with mask value < vmin.')
parser.add_argument('--vmax','--mask-vmax', dest='mask_vmax', type=float,
help='mask out pixels with mask value > vmax.')
parser.add_argument('-x', dest='subset_x', type=int, nargs=2,
help='subset range in x/cross-track/column direction')
parser.add_argument('-y', dest='subset_y', type=int, nargs=2,
help='subset range in y/along-track/row direction')
parser.add_argument('--fill', dest='fill_value', type=float, default=math.nan,
help='fill masked out area with input value. i.e. \n'
'np.nan (default), 0, 1000, ... \n'
'If np.nan and input data matrix is not float/complex, '
'convert matrix data type to np.float32.')
return parser
def cmd_line_parse(iargs=None):
parser = create_parser()
inps = parser.parse_args(args=iargs)
return inps
############################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.mask import mask_file
# run
mask_file(
inps.file,
mask_file=inps.mask_file,
out_file=inps.outfile,
fill_value=inps.fill_value,
inps=inps,
)
############################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/modify_network.py 0000775 0000000 0000000 00000030215 15032632755 0021244 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import os
import sys
from mintpy.defaults.template import get_template_content
from mintpy.utils.arg_utils import create_argument_parser
############################### Usage ################################
TEMPLATE = get_template_content('modify_network')
REFERENCE = """reference:
Yunjun, Z., Fattahi, H. and Amelung, F. (2019), Small baseline InSAR time series analysis:
Unwrapping error correction and noise reduction, Computers & Geosciences, 133, 104331,
doi:10.1016/j.cageo.2019.104331.
Chaussard, E., Bürgmann, R., Fattahi, H., Nadeau, R. M., Taira, T., Johnson, C. W. and Johanson, I.
(2015), Potential for larger earthquakes in the East San Francisco Bay Area due to the direct
connection between the Hayward and Calaveras Faults, Geophysical Research Letters, 42(8),
2734-2741, doi:10.1002/2015GL063575.
Kang, Y., Lu, Z., Zhao, C., Xu, Y., Kim, J. W., & Gallegos, A. J. (2021).InSAR monitoring
of creeping landslides in mountainous regions: A case study in Eldorado National Forest,
California. Remote Sensing of Environment, 258, 112400. doi:10.1016/j.rse.2021.112400
"""
EXAMPLE = """example:
modify_network.py inputs/ifgramStack.h5 -t smallbaselineApp.cfg
modify_network.py inputs/ifgramStack.h5 --reset
modify_network.py inputs/ifgramStack.h5 --manual
"""
def create_parser(subparsers=None):
synopsis = 'Modify the network of interferograms'
epilog = REFERENCE + '\n' + TEMPLATE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', help='Files to modify/drop network, e.g. inputs/ifgramStack.h5.')
parser.add_argument('-t', '--template', dest='template_file',
help='Template file with input options')
parser.add_argument('--reset', action='store_true',
help='restore all interferograms in the file, by marking all dropIfgram=True')
parser.add_argument('--noaux', dest='update_aux', action='store_false',
help='Do not update auxiliary files, e.g.\n' +
'maskConnComp.h5 or avgSpatialCoh.h5 from ifgramStack.h5')
# 1. temp/perp baseline, num of conn., dates, pair index, etc.
parser.add_argument('--max-tbase', dest='tempBaseMax',
type=float, help='max temporal baseline in days')
parser.add_argument('--max-pbase', dest='perpBaseMax',
type=float, help='max perpendicular baseline in meters')
parser.add_argument('--max-conn-num', dest='connNumMax', type=int,
help='max number of connections/neighbors per acquisition')
parser.add_argument('-r', '--reference', dest='referenceFile',
help='Reference hdf5 / list file with network information.\n'
'i.e. ifgramStack.h5, date12_list.txt')
parser.add_argument('--exclude-ifg-index', dest='excludeIfgIndex', nargs='*',
help='index of interferograms to remove/drop.\n1 as the first')
parser.add_argument('--exclude-ifg','--ex-ifg','--ex-date12', dest='excludeDate12', nargs='*',
help='pair(s) to remove/drop in YYYYMMDD_YYYYMMDD format.')
parser.add_argument('--exclude-date','--ex-date', dest='excludeDate', nargs='*',
help='date(s) to remove/drop, all interferograms included date(s) will be removed')
parser.add_argument('--start-date', '--min-date', dest='startDate',
help='remove/drop interferograms with date earlier than start-date in YYMMDD or YYYYMMDD format')
parser.add_argument('--end-date', '--max-date', dest='endDate',
help='remove/drop interferograms with date later than end-date in YYMMDD or YYYYMMDD format')
# 2. coherence-based network
cohBased = parser.add_argument_group('Data-driven network modification', 'Drop/modify network based on data')
# 2.1 coherence-based
cohBased.add_argument('--coherence-based', dest='coherenceBased', action='store_true',
help='Enable coherence-based network modification (default: %(default)s).')
cohBased.add_argument('--min-coherence', dest='minCoherence', type=float, default=0.7,
help='Minimum coherence value (default: %(default)s).')
# 2.2 area-ratio-based
cohBased.add_argument('--area-ratio-based', dest='areaRatioBased', action='store_true',
help='Enable area ratio-based network modification (default: %(default)s).')
cohBased.add_argument('--min-area-ratio', dest='minAreaRatio', type=float, default=0.75,
help='Minimum area ratio value (default: %(default)s).')
# common parameters
cohBased.add_argument('--no-mst', dest='keepMinSpanTree', action='store_false',
help='Do not keep interferograms in Min Span Tree network based on inversed mean coherene')
cohBased.add_argument('--mask', dest='maskFile', default='waterMask.h5',
help='Mask file used to calculate the spatial coherence '
'(default: waterMask.h5 or None)')
cohBased.add_argument('--aoi-yx', dest='aoiYX', type=int, nargs=4, metavar=('X0', 'Y0', 'X1', 'Y1'), default=None,
help='AOI in row/column range for coherence calculation (default: %(default)s).')
cohBased.add_argument('--aoi-lalo', dest='aoiLALO', type=float, nargs=4, metavar=('W', 'S', 'E', 'N'), default=None,
help='AOI in lat/lon range for coherence calculation (default: %(default)s).')
cohBased.add_argument('--lookup', dest='lookupFile',
help='Lookup table/mapping transformation file for geo/radar coordinate conversion.\n' +
'Needed for mask AOI in lalo')
# 3. manual selection
manual = parser.add_argument_group('Manual Network', 'Manually select/drop/modify network')
manual.add_argument('--manual', action='store_true',
help='display network to manually choose line/interferogram to remove')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import ptime, readfile, utils as ut
# check: --mask option
if not os.path.isfile(inps.maskFile):
inps.maskFile = None
# check: --exclude-ifg-index option (convert input index to continuous index list)
inps.excludeIfgIndex = read_input_index_list(inps.excludeIfgIndex, stackFile=inps.file)
# check: --ex-date(12) options
# and ignore , in the inputs
if inps.excludeDate:
inps.excludeDate = ' '.join(inps.excludeDate).replace(',', ' ').split()
inps.excludeDate = ptime.yyyymmdd(inps.excludeDate)
if inps.excludeDate12:
inps.excludeDat12e = ' '.join(inps.excludeDate12).replace(',', ' ').split()
inps.excludeDate12 = ptime.yyyymmdd_date12(inps.excludeDate12)
# check: -t / --template option
if inps.template_file:
inps = read_template2inps(inps.template_file, inps)
# check: input arguments (required at least one)
required_args = [
inps.referenceFile, inps.tempBaseMax, inps.perpBaseMax, inps.connNumMax,
inps.excludeIfgIndex, inps.excludeDate, inps.excludeDate12, inps.coherenceBased,
inps.areaRatioBased, inps.startDate, inps.endDate, inps.reset, inps.manual,
]
if all(not i for i in required_args + [inps.template_file]):
msg = 'No input option found to remove interferogram, exit.\n'
msg += 'To manually modify network, please use --manual option '
raise Exception(msg)
# default: --lookup option
if not inps.lookupFile:
inps.lookupFile = ut.get_lookup_file()
# check: --aoi-lalo option (not for radar-coded products without lookup files)
if inps.aoiLALO:
atr = readfile.read_attribute(inps.file)
if not inps.lookupFile and 'Y_FIRST' not in atr.keys():
msg = 'WARNING: Can NOT use --aoi-lalo option for files in radar coordinates '
msg += 'without lookup file. Ignore this option and continue.'
print(msg)
inps.aoiLALO = None
# default: turn --reset ON if:
# 1) no input options found to drop ifgram AND
# 2) there is template input
if inps.template_file and all(not i for i in required_args):
print('No input option found to remove interferogram')
print('Keep all interferograms by enable --reset option')
inps.reset = True
return inps
def read_template2inps(template_file, inps):
"""Read input template options into Namespace inps"""
print('read options from template file: '+os.path.basename(template_file))
from mintpy.utils import ptime, readfile, utils as ut
iDict = vars(inps)
template = readfile.read_template(inps.template_file, skip_chars=['[', ']'])
template = ut.check_template_auto_value(template)
# Update inps if key existed in template file
prefix = 'mintpy.network.'
key_list = [i for i in list(iDict.keys()) if prefix+i in template.keys()]
for key in key_list:
value = template[prefix+key]
if key in ['coherenceBased', 'areaRatioBased', 'keepMinSpanTree']:
iDict[key] = value
elif value:
if key in ['minCoherence', 'minAreaRatio', 'tempBaseMax', 'perpBaseMax']:
iDict[key] = float(value)
elif key in ['connNumMax']:
iDict[key] = int(value)
elif key in ['maskFile', 'referenceFile']:
iDict[key] = value
elif key == 'aoiYX':
tmp = [i.strip() for i in value.split(',')]
sub_y = sorted(int(i.strip()) for i in tmp[0].split(':'))
sub_x = sorted(int(i.strip()) for i in tmp[1].split(':'))
inps.aoiYX = (sub_x[0], sub_y[0], sub_x[1], sub_y[1])
elif key == 'aoiLALO':
tmp = [i.strip() for i in value.split(',')]
sub_lat = sorted(float(i.strip()) for i in tmp[0].split(':'))
sub_lon = sorted(float(i.strip()) for i in tmp[1].split(':'))
inps.aoiLALO = (sub_lon[0], sub_lat[1], sub_lon[1], sub_lat[0])
elif key in ['startDate', 'endDate']:
iDict[key] = ptime.yyyymmdd(value)
elif key == 'excludeDate':
iDict[key] = ptime.yyyymmdd(value.split(','))
elif key == 'excludeDate12':
iDict[key] = ptime.yyyymmdd_date12(value.split(','))
elif key == 'excludeIfgIndex':
iDict[key] += value.split(',')
iDict[key] = read_input_index_list(iDict[key], stackFile=inps.file)
return inps
def read_input_index_list(idxList, stackFile=None):
"""Read ['2','3:5','10'] into ['2','3','4','5','10']"""
from mintpy.objects import ifgramStack
if not idxList:
return []
idxListOut = []
for idx in idxList:
c = sorted(int(i) for i in idx.split(':'))
if len(c) == 2:
idxListOut += list(range(c[0], c[1]+1))
elif len(c) == 1:
idxListOut.append(c[0])
else:
print('Unrecoganized input: '+idx)
idxListOut = sorted(set(idxListOut))
# remove index not existing in the input ifgram stack file
if stackFile:
obj = ifgramStack(stackFile)
obj.open(print_msg=False)
idxListOut = [i for i in idxListOut if i < obj.numIfgram]
return idxListOut
######################### Main Function ##############################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.modify_network import modify_network
# run
modify_network(inps)
########################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/multilook.py 0000775 0000000 0000000 00000010607 15032632755 0020226 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import sys
from mintpy.utils.arg_utils import create_argument_parser
##################################################################################################
EXAMPLE = """example:
multilook.py velocity.h5 -r 15 -a 15
multilook.py srtm30m.dem -x 10 -y 10 -o srtm300m.dem
multilook.py filt_fine.int -r 2 -a 2 -o filt_fine_mli.int
# support GDAL VRT file from ISCE2 as input
multilook.py lat.rdr.full.vrt lon.rdr.full.vrt -x 9 -y 3
# --off-file option: use as reference to adjust for the irregular size from isce2 dense offsets
multilook.py lat.rdr.full.vrt -x 128 -y 64 -o lat.rdr.mli --off-file dense_offsets.bil -m nearest
multilook.py ../../geom_reference/lat.rdr.full -x 300 -y 100 -o lat.rdr --off-file offset.bip -m nearest
"""
def create_parser(subparsers=None):
synopsis = 'Multilook the input file'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
# basic
parser.add_argument('file', nargs='+', help='File(s) to multilook')
parser.add_argument('-r','--range','-x', dest='lks_x', type=int, default=1,
help='number of multilooking in range /x direction (default: %(default)s).')
parser.add_argument('-a','--azimuth','-y', dest='lks_y', type=int, default=1,
help='number of multilooking in azimuth/y direction (default: %(default)s).')
parser.add_argument('-o', '--outfile',
help='Output file name. Disabled when more than 1 input files')
parser.add_argument('-m','--method', dest='method', type=str, default='mean', choices=['mean', 'median', 'nearest'],
help='downsampling method (default: %(default)s) \n'
'e.g. nearest for geometry, average for observations')
# offset
ampcor = parser.add_argument_group('Ampcor options', 'Ampcor options for dense offsets to account for the extra margin')
ampcor.add_argument('--search','--search-win', dest='search_win', type=int, nargs=2, metavar=('X','Y'),
help='Ampcor (half) search window in (width, height) in pixel, e.g. 20 x 20.')
ampcor.add_argument('--xcorr','--xcorr-win', dest='xcorr_win', type=int, nargs=2, metavar=('X','Y'),
help='Ampcor cross-correlation window in (width, height) in pixel e.g. 32 x 32.')
ampcor.add_argument('--margin', dest='margin', type=int, default=0,
help='Ampcor margin offset (default: %(default)s).')
ampcor.add_argument('--off-file', dest='off_file', type=str,
help='Ampcor offset file as reference for the size.')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import utils1 as ut
# check: input file list
inps.file = ut.get_file_list(inps.file)
# check: -x/y options (num of multilooks)
if inps.lks_x == 1 and inps.lks_y == 1:
raise SystemExit('ERROR: no multilooking specified: lks_x/y=1!')
# check: -o / --outfile (output file name)
if len(inps.file) > 1 and inps.outfile:
inps.outfile = None
print('more than one file is input, disable custom output filename.')
return inps
##################################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.multilook import multilook_file
# run
for infile in inps.file:
multilook_file(
infile,
lks_y=inps.lks_y,
lks_x=inps.lks_x,
outfile=inps.outfile,
method=inps.method,
search_win=inps.search_win,
xcorr_win=inps.xcorr_win,
margin=inps.margin,
off_file=inps.off_file,
)
print('Done.')
###################################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/plate_motion.py 0000775 0000000 0000000 00000015106 15032632755 0020700 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Yuan-Kai Liu, Aug 2022 #
############################################################
import os
import sys
from mintpy.utils.arg_utils import create_argument_parser
ITRF2014_PMM_PLATES = [
'Antartica', 'Arabia', 'Australia', 'Eurasia',
'India', 'Nazca', 'NorthAmerica', 'Nubia',
'Pacific', 'SouthAmerica', 'Somalia'
]
######################################### Usage ##############################################
REFERENCE = """reference:
Stephenson, O. L., Liu, Y. K., Yunjun, Z., Simons, M., Rosen, P. and Xu, X., (2022),
The Impact of Plate Motions on Long-Wavelength InSAR-Derived Velocity Fields,
Geophys. Res. Lett. 49, e2022GL099835, doi:10.1029/2022GL099835.
# list of no-net-rotation (NNR) plate motion models (PMMs):
# ONLY ITRF14 should be used, as Sentinel-1's orbit is in ITRF2014 reference frame.
# Other values, e.g. MORVEL56, should be converted into ITR2014 before use.
ITRF14 - Table 1 of Altamimi et al. (2017) - 11 plates
Altamimi, Z., Métivier, L., Rebischung, P., Rouby, H., & Collilieux, X. (2017).
ITRF2014 plate motion model. Geophysical Journal International, 209(3), 1906-1912.
doi:10.1093/gji/ggx136
MORVEL - Table 1 of Argus et al. (2011) - 56 plates
Argus, D. F., Gordon, R. G., & DeMets, C. (2011). Geologically current motion of 56
plates relative to the no-net-rotation reference frame. Geochemistry, Geophysics,
Geosystems, 12(11). doi:10.1029/2011GC003751
"""
EXAMPLE = """example:
# Use built-in plate motion model of Table 1 from Altamimi et al. (2017)
plate_motion.py -g inputs/geometryGeo.h5 --plate Arabia
plate_motion.py -g inputs/geometryRadar.h5 --plate Eurasia
# Cartesian form of Euler pole rotation in [wx, wy, wz] in unit of mas/year [milli arc second per year]
# e.g., Arabia plate in ITRF14-PMM (Table 1 in Altamimi et al., 2017)
plate_motion.py -g inputs/geometryRadar.h5 --om-cart 1.154 -0.136 1.444
plate_motion.py -g inputs/geometryGeo.h5 --om-cart 1.154 -0.136 1.444 -v velocity.h5
plate_motion.py -g inputs/geometryRadar.h5 --om-cart 1.154 -0.136 1.444 --comp en2az
# Simple constant local ENU translation (based on one GNSS vector) in [ve, vn, vu] in unit of m/year
# E.g., https://www.unavco.org/software/visualization/GPS-Velocity-Viewer/GPS-Velocity-Viewer.html
# -> select 'GNSS Data source' as 'World, IGS08/NNR, GEM GSRM' (referenced to ITRF2008, NNR PMM)
# -> check box `Station labels and data download` and click `Draw Map`
# -> navigate to the region of interest,
# -> click on a representative station,
# -> get the "Speed components" in mm/yr.
plate_motion.py -g inputs/geometryGeo.h5 --enu 25.0 30.5 0.0 -v velocity.h5
"""
NOTE = """
Removing the effect of rigid plate motion (translation and rotation) using plate motion model (PMM).
For Sentinel-1, its orbit is measured with respect to ITRF2014 (Table 3-2 of Peter et al., 2021,
Copernicus POD Product Handbook), which is an Earth-centered, Earth-fixed (ECEF) reference frame
in which there is no net rotation (NNR) of the Earth surface.
"""
def create_parser(subparsers=None):
synopsis = 'Plate Motion Correction.'
epilog = REFERENCE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis+NOTE, epilog=epilog, subparsers=subparsers)
# input files
parser.add_argument('-g', '--geom', dest='geom_file', type=str, required=True,
help='Input geometry file in geo-coordinates, e.g., geometryGeo.h5')
parser.add_argument('-v', '--velo', dest='vel_file', type=str,
help='Input velocity file to be corrected.')
parser.add_argument('-o', '--output', dest='cor_vel_file', type=str,
help='Output velocity file after the correction, default: add "_ITRF14" suffix.')
# plate motion calculation
parser.add_argument('--comp', dest='pmm_comp', choices={'enu2los', 'en2az'}, default='enu2los',
help='Convert the ENU components into the component of interest for radar (default: %(default)s).')
parser.add_argument('--step','--pmm-step', dest='pmm_step', type=float, default=10.,
help='Ground step/resolution in km for computing PMM to ENU velocity (default: %(default)s).')
# plate motion configurations
pmm = parser.add_argument_group('plate motion model')
pmg = pmm.add_mutually_exclusive_group(required=True)
pmg.add_argument('--plate', dest='plate_name', type=str, choices=ITRF2014_PMM_PLATES, default=None,
help='Tectonic plate in ITRF2014-PMM (Table 1 in Altamimi et al., 2017) (default: %(default)s).')
pmg.add_argument('--om-cart', dest='omega_cart', type=float, nargs=3, metavar=('WX', 'WY', 'WZ'), default=None,
help='Cartesian form of Euler Pole rotation (unit: mas/yr) (default: %(default)s).')
pmg.add_argument('--om-sph', dest='omega_sph', type=float, nargs=3, metavar=('LAT', 'LON', 'W'), default=None,
help='Spherical form of Euler Pole rotation (unit: deg, deg, deg/Ma) (default: %(default)s).')
pmg.add_argument('--enu', dest='const_vel_enu', type=float, nargs=3, metavar=('VE', 'VN', 'VU'), default=None,
help='Constant local ground translation (unit: m/year) (default: %(default)s).')
return parser
def cmd_line_parse(iargs=None):
parser = create_parser()
inps = parser.parse_args(args=iargs)
# default: output PMM filenames
geom_dir = os.path.dirname(inps.geom_file)
inps.pmm_enu_file = os.path.join(geom_dir, 'ITRF14enu.h5')
inps.pmm_file = os.path.join(geom_dir, 'ITRF14.h5')
if inps.pmm_comp.endswith('2az'):
inps.pmm_file = os.path.join(geom_dir, 'ITRF14az.h5')
# default: --output option
if inps.vel_file and not inps.cor_vel_file:
vbase = os.path.splitext(inps.vel_file)[0]
inps.cor_vel_file = os.path.abspath(f'{vbase}_ITRF14.h5')
return inps
####################################### Main Function ########################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.plate_motion import run_plate_motion
# run
run_plate_motion(inps)
################################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/plot_coherence_matrix.py 0000775 0000000 0000000 00000012072 15032632755 0022562 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import os
import sys
from mintpy.utils.arg_utils import create_argument_parser
########################### Sub Function #############################
EXAMPLE = """example:
plot_coherence_matrix.py inputs/ifgramStack.h5
plot_coherence_matrix.py inputs/ifgramStack.h5 --yx 277 1069
plot_coherence_matrix.py inputs/ifgramStack.h5 --lalo -0.8493 -91.1510 -c RdBu
# left: map view
plot_coherence_matrix.py inputs/ifgramStack.h5 --view-cmd "view.py {} --dem inputs/gsi10m.dem.wgs84"
plot_coherence_matrix.py inputs/ifgramStack.h5 --view-cmd 'view.py {} --wrap --wrap-range -3 3"
plot_coherence_matrix.py inputs/ifgramStack.h5 --view-cmd 'view.py {} --sub-x 900 1400 --sub-y 0 500'
# right: matrix view
# show color jump same as the coherence threshold in network inversion with pixel-wised masking
plot_coherence_matrix.py inputs/ifgramStack.h5 --cmap-vlist 0 0.4 1
"""
def create_parser(subparsers=None):
synopsis = 'Plot the coherence matrix of one pixel (interactive)'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('ifgram_file', help='interferogram stack file')
parser.add_argument('--yx', type=int, metavar=('Y', 'X'), nargs=2,
help='Point of interest in y(row)/x(col)')
parser.add_argument('--lalo', type=float, metavar=('LAT','LON'), nargs=2,
help='Point of interest in lat/lon')
parser.add_argument('--lookup','--lut', dest='lookup_file',
help='Lookup file to convert lat/lon into y/x')
parser.add_argument('-c','--cmap', dest='cmap_name', default='RdBu_truncate',
help='Colormap for coherence matrix.\nDefault: RdBu_truncate')
parser.add_argument('--cmap-vlist', dest='cmap_vlist', type=float, nargs=3, default=[0.0, 0.7, 1.0],
help='start/jump/end fraction for truncated colormap. Default: 0.0 0.7 1.0')
parser.add_argument('--figsize','--fs', dest='fig_size', metavar=('WID', 'LEN'), type=float, nargs=2,
help='figure size in inches. Default: [8, 4]')
parser.add_argument('--img-file', dest='img_file',
help='dataset to show in map to facilitate point selection. Default: velocity.h5')
parser.add_argument('--view-cmd', dest='view_cmd', default='view.py {} --wrap --noverbose ',
help='view.py command to plot the input map file\n'+
'Default: view.py img_file --wrap --noverbose')
# aux files
parser.add_argument('--tcoh', dest='tcoh_file', default='temporalCoherence.h5',
help='temporal coherence file.')
parser.add_argument('-t','--template', dest='template_file',
help='temporal file.')
parser.add_argument('--save', dest='save_fig',
action='store_true', help='save the figure')
parser.add_argument('--nodisplay', dest='disp_fig',
action='store_false', help='save and do not display the figure')
parser.add_argument('--noverbose', dest='print_msg', action='store_false',
help='Disable the verbose message printing.')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# save argv (to check the manually specified arguments)
# use iargs for python call
# use sys.argv[1:] for command line call
inps.argv = iargs or sys.argv[1:]
# default: auxiliary file paths (velocity and template)
mintpy_dir = os.path.dirname(os.path.dirname(inps.ifgram_file))
if not inps.img_file:
inps.img_file = os.path.join(mintpy_dir, 'velocity.h5')
if not inps.template_file:
inps.template_file = os.path.join(mintpy_dir, 'smallbaselineApp.cfg')
# check: existence of auxliary files
if not os.path.isfile(inps.img_file):
raise SystemExit(f'ERROR: input image file not found: {inps.img_file}')
if not os.path.isfile(inps.tcoh_file):
inps.tcoh_file = None
if not os.path.isfile(inps.template_file):
inps.template_file = None
# check: --nodisplay option
if not inps.disp_fig:
inps.save_fig = True
return inps
########################## Main Function ##############################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.plot_coherence_matrix import coherenceMatrixViewer
# run
obj = coherenceMatrixViewer(inps)
obj.open()
obj.plot()
obj.fig.canvas.mpl_disconnect(obj.cid)
############################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/plot_network.py 0000775 0000000 0000000 00000016313 15032632755 0020736 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import os
import sys
from mintpy.utils.arg_utils import create_argument_parser
########################### Sub Function ##############################
BL_LIST = """
070106 0.0 0.03 0.0000000 0.00000000000 2155.2 /scratch/SLC/070106/
070709 2631.9 0.07 0.0000000 0.00000000000 2155.2 /scratch/SLC/070709/
070824 2787.3 0.07 0.0000000 0.00000000000 2155.2 /scratch/SLC/070824/
"""
DATE12_LIST = """
20070709_20100901
20070709_20101017
20070824_20071009
"""
TEMPLATE = """
mintpy.network.maskFile = auto #[file name, no], auto for waterMask.h5 or no for all pixels
mintpy.network.aoiYX = auto #[y0:y1,x0:x1 / no], auto for no, area of interest for coherence calculation
mintpy.network.aoiLALO = auto #[lat0:lat1,lon0:lon1 / no], auto for no - use the whole area
"""
EXAMPLE = """example:
plot_network.py inputs/ifgramStack.h5
plot_network.py inputs/ifgramStack.h5 -t smallbaselineApp.cfg --nodisplay #Save figures to files without display
plot_network.py inputs/ifgramStack.h5 -t smallbaselineApp.cfg --show-kept #Do not plot dropped ifgrams
plot_network.py inputs/ifgramStack.h5 -d tbase -v 0 365.25 -c RdYlBu_r #Color-code lines by temporal baseline
plot_network.py inputs/ifgramStack.h5 -d pbase -v 0 180 -c RdYlBu_r #Color-code lines by perpendicular baseline
plot_network.py coherenceSpatialAvg.txt
# offsetSNR
plot_network.py inputs/ifgramStack.h5 -d offsetSNR -v 0 20 --cmap-vlist 0 0.2 1
"""
def create_parser(subparsers=None):
synopsis = 'Display Network of Interferograms'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', help='file with network information, ifgramStack.h5 or coherenceSpatialAvg.txt')
parser.add_argument('--show-kept', dest='disp_drop', action='store_false',
help='display kept interferograms only, without dropped interferograms')
# Color-code coherence/baseline in the network/matrix plot
color = parser.add_argument_group('Color-code network/matrix plot',
'color-code phase/offset pairs with coherence/baseline in network/matrix plot')
color.add_argument('-d', '--dset', type=str, dest='dsetName', default='coherence',
choices={'coherence','offsetSNR','pbase','tbase'},
help='dataset used to calculate the mean. (default: %(default)s)')
color.add_argument('-v', '--vlim', nargs=2, type=float, default=(0.2, 1.0), help='display range')
color.add_argument('-t', '--template', dest='template_file',
help='template file with options below:\n'+TEMPLATE)
color.add_argument('--mask', dest='maskFile', default='waterMask.h5',
help='mask file used to calculate the coherence. Default: waterMask.h5 or None.')
color.add_argument('-c', '--colormap', dest='cmap_name', default='RdBu_truncate',
help='colormap name for the network display. Default: RdBu_truncate')
color.add_argument('--cmap-vlist', dest='cmap_vlist', type=float, nargs=3, default=[0.2, 0.4, 1.0],
help='normalized start/jump/end value for truncated colormap (default: %(default)s).')
# Figure Setting
fig = parser.add_argument_group('Figure', 'Figure settings for display')
fig.add_argument('--fs', '--fontsize', type=int,
default=12, help='font size in points')
fig.add_argument('--lw', '--linewidth', dest='linewidth',
type=int, default=2, help='line width in points')
fig.add_argument('--mc', '--markercolor', dest='markercolor',
default='orange', help='marker color')
fig.add_argument('--ms', '--markersize', dest='markersize',
type=int, default=8, help='marker size in points (default: %(default)s).')
fig.add_argument('--every-year', dest='every_year', type=int,
default=1, help='number of years per major tick on x-axis')
fig.add_argument('--dpi', dest='fig_dpi', type=int, default=1200,
help='DPI - dot per inch - for display/write')
fig.add_argument('--figsize', dest='fig_size', type=float, nargs=2,
help='figure size in inches - width and length.')
fig.add_argument('--notitle', dest='disp_title', action='store_false',
help='Do not display figure title.')
fig.add_argument('--number', dest='number', type=str,
help='number mark to be plot at the corner of figure.')
fig.add_argument('--nosplit-cmap', dest='split_cmap', action='store_false',
help='do not split colormap for coherence color')
fig.add_argument('--save', dest='save_fig',
action='store_true', help='save the figure')
fig.add_argument('--nodisplay', dest='disp_fig',
action='store_false', help='save and do not display the figure')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import readfile
# save argv (to check the manually specified arguments)
# use iargs for python call
# use sys.argv[1:] for command line call
inps.argv = iargs or sys.argv[1:]
# check: input file type
if inps.file.endswith(('.h5','.he5')):
k = readfile.read_attribute(inps.file)['FILE_TYPE']
if k != 'ifgramStack':
raise ValueError('input HDF5 file is NOT ifgramStack.')
# check: --nodisplay option
if not inps.disp_fig:
inps.save_fig = True
# check: -t / --template option
if inps.template_file:
inps = read_template2inps(inps.template_file, inps)
else:
inps.template = {}
# check: --mask option (file existence)
if not os.path.isfile(inps.maskFile):
inps.maskFile = None
return inps
def read_template2inps(template_file, inps):
"""Read input template options into Namespace inps"""
print('read options from template file: '+os.path.basename(template_file))
from mintpy.utils import readfile, utils1 as ut
inps.template = readfile.read_template(inps.template_file)
inps.template = ut.check_template_auto_value(inps.template)
# coherence-based network modification
prefix = 'mintpy.network.'
key = prefix+'maskFile'
if key in inps.template.keys():
if inps.template[key]:
inps.maskFile = inps.template[key]
return inps
########################## Main Function ##############################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.plot_network import plot_network
# run
plot_network(inps)
#########################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/plot_transection.py 0000775 0000000 0000000 00000020061 15032632755 0021571 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import argparse
import sys
from mintpy.utils import arg_utils
#####################################################################
# Only one line is supported right now.
GMT_FILE = """GMT xy file, i.e. transect_lonlat.xy:
>
131.1663 33.1157
131.2621 33.0860
"""
EXAMPLE = """example:
plot_transection.py velocity.h5 --start-yx 5290 5579 --end-yx 12177 482
plot_transection.py velocity.h5 --start-lalo 30.125 129.988 --end-lalo 30.250 130.116
plot_transection.py velocity.h5 --line-file transect_lonlat.xy --dem gsi10m.dem
# multiple files
plot_transection.py AlosA*/velocity.h5 AlosD*/velocity.h5 --off 2
plot_transection.py Kirishima2017*.h5 Kirishima2008*.h5 --off 0 0 10 10
plot_transection.py Kirishima2017*.h5 Kirishima2008*.h5 --off 0 0 10 10 --lalo0 31.947 130.843 --lalo1 31.947 130.860
# interactive plot: click two points to draw a profile
"""
def create_parser(subparsers=None):
synopsis = 'Generate transect/profile along a line'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = arg_utils.create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', nargs='+',
help='input file to show transection')
parser.add_argument('--dset', dest='dset', help='Dataset name to read')
parser.add_argument('-v','--vlim', dest='vlim', nargs=2, metavar=('VMIN', 'VMAX'), type=float,
help='Display limits for matrix plotting.')
parser.add_argument('--offset','--off', dest='offset', type=float, nargs='+', default=[0.05],
help='offset between transects [for multiple files only; default: %(default)s m].\n'
'number of input offsets should be:\n'
' 1 - same (sequential) offset between adjacent transects OR\n'
' num_file - different (cumulative) offset for each file, starting from 0.')
parser.add_argument('--noverbose', dest='print_msg', action='store_false',
help='Disable the verbose message printing.')
lines = parser.add_argument_group('Profile location', 'Start/end points of profile')
lines.add_argument('--start-yx','--yx0', dest='start_yx', metavar=('Y0', 'X0'), type=int, nargs=2,
help='start point of the profile in pixel number [y, x]')
lines.add_argument('--end-yx','--yx1', dest='end_yx', metavar=('Y1', 'X1'), type=int, nargs=2,
help='end point of the profile in pixel number [y, x]')
lines.add_argument('--start-lalo','--lalo0', dest='start_lalo', metavar=('LAT0', 'LON0'), type=float, nargs=2,
help='start point of the profile in [lat, lon]')
lines.add_argument('--end-lalo','--lalo1', dest='end_lalo', metavar=('LAT1', 'LON1'), type=float, nargs=2,
help='end point of the profile in [lat, lon]')
lines.add_argument('--line-file', dest='lola_file',
help='file with start and end point info in lon lat, same as GMT format.\n'+GMT_FILE)
lines.add_argument('--interpolation', default='nearest', choices=['nearest', 'bilinear', 'cubic'],
help='interpolation method while extacting profile along the line. Default: nearest.')
lines.add_argument('--ms', '--markersize', dest='marker_size', type=float, default=2.0,
help='Point marker size. Default: 2.0')
parser = arg_utils.add_figure_argument(parser)
parser = arg_utils.add_save_argument(parser)
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
import numpy as np
from mintpy.utils import readfile, utils as ut
# save argv (to check the manually specified arguments)
# use iargs for python call
# use sys.argv[1:] for command line call
inps.argv = iargs or sys.argv[1:]
# check: coupled options
if inps.outfile or not inps.disp_fig:
inps.save_fig = True
# check: --offset option
inps.file = ut.get_file_list(inps.file)
inps.atr = readfile.read_attribute(inps.file[0])
inps.coord = ut.coordinate(inps.atr)
inps.num_file = len(inps.file)
if inps.num_file > 1:
# a) one input: it's interval between adjacent files
if len(inps.offset) == 1:
inps.offset = np.ones(inps.num_file, dtype=np.float32) * inps.offset
inps.offset[0] = 0.
inps.offset = np.cumsum(inps.offset)
# b) multiple input: it's exact offset of all files
elif len(inps.offset) == inps.num_file:
inps.offset = np.array(inps.offset, dtype=np.float32)
# c) do not support any other numbers of inputs
else:
msg = f'input number of offsets: {len(inps.offset)}.'
msg += f'\nIt should be 1 or number of files: {inps.num_file}'
raise ValueError(msg)
else:
# disable offset for single input file
inps.offset = np.array([0], dtype=np.float32)
# check: --line-file option (lola_file --> start/end_lalo)
if inps.lola_file:
inps.start_lalo, inps.end_lalo = read_lonlat_file(inps.lola_file)
# check: --start/end-lalo (start/end_lalo --> start/end_yx)
if inps.start_lalo and inps.end_lalo:
[y0, y1], [x0, x1] = inps.coord.lalo2yx([inps.start_lalo[0], inps.end_lalo[0]],
[inps.start_lalo[1], inps.end_lalo[1]])
inps.start_yx = [y0, x0]
inps.end_yx = [y1, x1]
# default: --dset option
if not inps.dset:
inps.dset = readfile.get_slice_list(inps.file[0])[0]
return inps
#####################################################################
def read_lonlat_file(lonlat_file):
"""Read Start/End lat/lon from lonlat text file in gmt format.
Parameters: lonlat_file - str, text file in gmt lonlat point file
Returns: start/end_lalo - list of 2 float
"""
fll = open(lonlat_file)
lines = fll.read().splitlines()
[lon0, lat0] = [float(i) for i in lines[1].split()]
[lon1, lat1] = [float(i) for i in lines[2].split()]
fll.close()
start_lalo = [lat0, lon0]
end_lalo = [lat1, lon1]
return start_lalo, end_lalo
def get_view_cmd(iargs):
"""Assemble view.py command line from input arguments"""
# define ALL parsing options from create_parser() that are common to view.py
parser = argparse.ArgumentParser(description='view.py parser')
parser.add_argument('-v','--vlim', dest='vlim', nargs=2, metavar=('VMIN', 'VMAX'), type=float,
help='Display limits for matrix plotting.')
parser.add_argument('--noverbose', dest='print_msg', action='store_false',
help='Disable the verbose message printing.')
parser = arg_utils.add_figure_argument(parser)
parser = arg_utils.add_save_argument(parser)
# get args that are applicable to view.py
unique_args = parser.parse_known_args(iargs)[1]
view_args = [i for i in iargs if i not in unique_args] if iargs else []
# assemble view.py command line
inps = cmd_line_parse(iargs)
view_cmd = f'view.py {inps.file[0]} '
view_cmd += f' {inps.dset} ' if inps.dset else ''
view_cmd += ' '.join(view_args)
return view_cmd
############################ Main ###################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.plot_transection import transectionViewer
# run
view_cmd = get_view_cmd(iargs)
obj = transectionViewer(inps, view_cmd)
obj.open()
obj.plot()
obj.fig.canvas.mpl_disconnect(obj.cid)
#####################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/prep_aria.py 0000775 0000000 0000000 00000025555 15032632755 0020161 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Heresh Fattahi, Aug 2022 #
############################################################
import glob
import os
import sys
from mintpy.utils.arg_utils import create_argument_parser
####################################################################################
TEMPLATE = """template options:
########## 1. load_data
## no - save 0% disk usage, fast [default]
## lzf - save ~57% disk usage, relative slow
## gzip - save ~62% disk usage, very slow [not recommend]
mintpy.load.processor = aria #[isce, aria, snap, gamma, roipac], auto for isce
mintpy.load.updateMode = auto #[yes / no], auto for yes, skip re-loading if HDF5 files are complete
mintpy.load.compression = auto #[gzip / lzf / no], auto for no.
##---------interferogram datasets:
mintpy.load.unwFile = ../stack/unwrapStack.vrt
mintpy.load.corFile = ../stack/cohStack.vrt
mintpy.load.connCompFile = ../stack/connCompStack.vrt
mintpy.load.magFile = ../stack/ampStack.vrt # optional
##---------geometry datasets:
mintpy.load.demFile = ../DEM/SRTM_3arcsec.dem
mintpy.load.incAngleFile = ../incidenceAngle/*.vrt
mintpy.load.azAngleFile = ../azimuthAngle/*.vrt
mintpy.load.waterMaskFile = ../mask/watermask.msk
##---------subset (optional):
## if both yx and lalo are specified, use lalo option
mintpy.subset.yx = auto #[y0:y1,x0:x1 / no], auto for no
mintpy.subset.lalo = auto #[lat0:lat1,lon0:lon1 / no], auto for no
##---------multilook (optional):
## multilook while loading data with the specified method, to reduce dataset size
## nearest, mean and median methods are applicable to interferogram/ionosphere/offset stack(s), except for:
## connected components and all geometry datasets, for which nearest is hardwired.
mintpy.multilook.method = auto #[nearest, mean, median], auto for nearest - lines/rows skipping approach
mintpy.multilook.ystep = auto #[int >= 1], auto for 1 - no multilooking
mintpy.multilook.xstep = auto #[int >= 1], auto for 1 - no multilooking
"""
EXAMPLE = """example:
prep_aria.py -t smallbaselineApp.cfg # recommended
prep_aria.py -t SanFranSenDT42.txt
prep_aria.py -s ../stack/ -d ../DEM/SRTM_3arcsec.dem -i '../incidenceAngle/*.vrt'
prep_aria.py -s ../stack/ -d ../DEM/SRTM_3arcsec.dem -i '../incidenceAngle/*.vrt' -a '../azimuthAngle/*.vrt' -w ../mask/watermask.msk
prep_aria.py -s ../stack/ -d ../DEM/SRTM_3arcsec.dem -i '../incidenceAngle/*.vrt' --set '../stack/setStack.vrt' --tropo '../stack/troposphereTotal/HRRR_stack.vrt' --iono '../stack/ionStack.vrt'
# download / extract / prepare inteferograms stack from ARIA using ARIA-tools:
ariaDownload.py --track 71 --bbox "34.21 34.31 -118.60 -118.43" --start 20240101 --end 20240301
ariaTSsetup.py -f "products/*.nc" --bbox "34.21 34.31 -118.60 -118.43" --mask Download --num_threads 4 --layers "solidEarthTide, troposphereTotal, ionosphere" --tropo_models HRRR
prep_aria.py -s stack -d DEM/glo_90.dem -i incidenceAngle/*.vrt -a azimuthAngle/*.vrt -w mask/esa_world_cover_2021.msk --set stack/setStack.vrt --tropo stack/troposphereTotal/HRRRStack.vrt --iono stack/ionoStack.vrt
"""
def create_parser(subparsers=None):
"""Command line parser."""
synopsis = 'Prepare ARIA processed products for MintPy.'
epilog = TEMPLATE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('-t','--template', dest='template_file', type=str,
help='template file with the options')
parser.add_argument('-o', '--output', type=str, nargs=2, dest='outfile',
default=['./inputs/ifgramStack.h5',
'./inputs/geometryGeo.h5'],
help='output HDF5 file')
parser.add_argument('--update', dest='updateMode', action='store_true',
help='Enable the update mode: checking dataset already loaded.')
parser.add_argument('--compression', choices={'gzip', 'lzf', None, 'default'}, default='default',
help='HDF5 file compression, default: %(default)s'+
' default: None for stack, lzf for geometry.')
# ifgramStack
stack = parser.add_argument_group('interferogram stack')
stack.add_argument('-s','--stack-dir', dest='stackDir', type=str,
help='The directory which contains stack VRT files.')
stack.add_argument('-u','--unwrap-stack-name', dest='unwFile', type=str,
default="unwrapStack.vrt",
help='Name of the stack VRT file of unwrapped data.\n'+
'default: %(default)s')
stack.add_argument('-c','--coherence-stack-name', dest='corFile', type=str,
default="cohStack.vrt",
help='Name of the stack VRT file of coherence data.\n'+
'default: %(default)s')
stack.add_argument('-l','--conn-comp-stack-name', dest='connCompFile', type=str,
default="connCompStack.vrt",
help='Name of the stack VRT file of connected component data.\n' +
'default: %(default)s')
stack.add_argument('--amp-stack-name','--amplitude-stack-name', dest='magFile', type=str,
default="ampStack.vrt",
help='Name of the stack VRT file of interferogram amplitude data (optional).\n' +
'default: %(default)s')
# geometryGeo
geom = parser.add_argument_group('geometry')
geom.add_argument('-d','--dem', dest='demFile', type=str,
help='Name of the DEM file')
geom.add_argument('-i','--incidence-angle', dest='incAngleFile', type=str,
help='Name of the incidence angle file')
geom.add_argument('-a','--az-angle','--azimuth-angle', dest='azAngleFile', type=str,
help='Name of the azimuth angle file.')
geom.add_argument('-w','--water-mask', dest='waterMaskFile', type=str,
help='Name of the water mask file')
# correction layers: troposphereTotal, ionosphere, solidEarthTides
corr = parser.add_argument_group('corrections')
corr.add_argument('-ct', '--tropo', dest='tropoFile', type=str,
help='Name of the Troposhere Delay stack file', default=None)
corr.add_argument('-ci', '--iono', dest='ionoFile', type=str,
help='Name of the Ionosphere Delay stack file', default=None)
corr.add_argument('-cs', '--set', dest='setFile', type=str,
help='Name of the Solid Earth Tides stack file', default=None)
return parser
def cmd_line_parse(iargs = None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# default: multilook options
iDict = vars(inps)
iDict['xstep'] = int(iDict.get('xstep', 1))
iDict['ystep'] = int(iDict.get('ystep', 1))
iDict['method'] = str(iDict.get('method', 'nearest'))
# check: --template option
if inps.template_file:
inps = read_template2inps(inps.template_file, inps)
print('multilook x/ystep: {}/{}'.format(iDict['xstep'], iDict['ystep']))
print('multilook method : {}'.format(iDict['method']))
# check: --stack-dir
if inps.stackDir is not None:
inps.stackDir = os.path.abspath(inps.stackDir)
inps.corFile = os.path.join(inps.stackDir, os.path.basename(inps.corFile))
inps.unwFile = os.path.join(inps.stackDir, os.path.basename(inps.unwFile))
inps.connCompFile = os.path.join(inps.stackDir, os.path.basename(inps.connCompFile))
# check: all options end with "File"
# translate wildcard path input with search result
# if not exist, raise error for required datasets
# set to None for the other datasets
print('search input data file info:')
ds_keys = [key for key in list(iDict.keys()) if key.endswith('File')]
required_ds_keys = ['unwFile', 'corFile', 'demFile', 'incAngleFile']
max_digit = max(len(i) for i in ds_keys)
for key in ds_keys:
# search for wildcard pattern
fnames = glob.glob(iDict[key]) if iDict[key] else []
# return the first element if more than one exist
# except for tropo, for which multiple inputs could be passed
if len(fnames) > 0:
if 'tropo' not in key:
iDict[key] = fnames[0]
else:
iDict[key] = fnames
print('{k:<{w}} : {f}'.format(k=key, w=max_digit, f=iDict[key]))
elif key in required_ds_keys:
# raise exception if any required DS is missing
raise SystemExit(f'ERROR: no file found for {key} in input path: "{iDict[key]}"!')
else:
iDict[key] = None
return inps
def read_template2inps(template_file, inps):
"""Read input template file into inps"""
print(f'read options from template file: {os.path.basename(template_file)}')
from mintpy.utils import readfile, utils1 as ut
iDict = vars(inps)
template = readfile.read_template(template_file)
template = ut.check_template_auto_value(template)
# ignore template options with default auto values
# so that options from input arguments have higher priority
# than template options with auto values
for key in list(template.keys()):
if template[key] == 'auto':
template.pop(key)
# pass options from template to inps
# group - load
key_prefix = 'mintpy.load.'
keys = [i for i in list(iDict.keys()) if key_prefix+i in template.keys()]
for key in keys:
value = template[key_prefix+key]
if key in ['updateMode', 'compression']:
iDict[key] = value
elif key in ['unwFile']:
iDict['stackDir'] = os.path.dirname(value)
elif value:
iDict[key] = str(value)
# group - multilook
prefix = 'mintpy.multilook.'
key_list = [i.split(prefix)[1] for i in template.keys() if i.startswith(prefix)]
for key in key_list:
value = template[prefix+key]
if key in ['xstep', 'ystep']:
iDict[key] = int(template[prefix+key])
elif key in ['method']:
iDict[key] = template[prefix+key]
return inps
####################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.prep_aria import load_aria
# run
load_aria(inps)
####################################################################################
if __name__=="__main__":
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/prep_cosicorr.py 0000775 0000000 0000000 00000003610 15032632755 0021054 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Forrest Williams, Aug 2022 #
############################################################
import sys
from mintpy.utils.arg_utils import create_argument_parser
#########################################################################
EXAMPLE_META_FILE = """
offset1NS.tif 20160206 20161122
offset1EW.tif 20160206 20161122
offset1SNR.tif 20160206 20161122
offset2NS.tif 20160206 20170225
offset2EW.tif 20160206 20170225
offset2SNR.tif 20160206 20170225
... ... ...
"""
EXAMPLE = """example:
prep_cosicorr.py offsets/*offset.tif -m metadata.txt
prep_cosicorr.py snr/*snr.tif -m metadata.txt
"""
def create_parser(subparsers=None):
"""Command line parser."""
synopsis = 'Prepare attributes file for COSI-Corr pixel offset product.'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', nargs='+', help='cosicorr file(s)')
parser.add_argument('-m', '--metadata', type=str, dest='meta_file',
help='metadata file with date info. E.g.:'+EXAMPLE_META_FILE)
return parser
def cmd_line_parse(iargs=None):
parser = create_parser()
inps = parser.parse_args(args=iargs)
return inps
#########################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.prep_cosicorr import prep_cosicorr
# run
prep_cosicorr(inps)
#########################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/prep_fringe.py 0000775 0000000 0000000 00000011700 15032632755 0020502 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import glob
import os
import sys
from mintpy.utils import arg_utils
####################################################################################
EXAMPLE = """example:
prep_fringe.py -u './PS_DS/unwrap/*.unw' -c ./PS_DS/tcorr_ds_ps.bin -g ./geometry -m '../reference/IW*.xml' -b ../baselines -o ./mintpy
cd ~/data/SanAndreasSenDT42/fringe
prep_fringe.py
## example commands after prep_fringe.py
reference_point.py timeseries.h5 -y 500 -x 1150
generate_mask.py temporalCoherence.h5 -m 0.7 -o maskTempCoh.h5
tropo_pyaps3.py -f timeseries.h5 -g inputs/geometryRadar.h5
remove_ramp.py timeseries_ERA5.h5 -m maskTempCoh.h5 -s linear
dem_error.py timeseries_ERA5_ramp.h5 -g inputs/geometryRadar.h5
timeseries2velocity.py timeseries_ERA5_ramp_demErr.h5
geocode.py velocity.h5 -l inputs/geometryRadar.h5
"""
def create_parser(subparsers=None):
"""Command Line Parser"""
synopsis = "Prepare FRInGE products for MintPy"
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = arg_utils.create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('-u', '--unw-file', dest='unwFile', type=str, default='./PS_DS/unwrap/*.unw',
help='path pattern of unwrapped interferograms (default: %(default)s).')
parser.add_argument('-c', '--coh-file', dest='cohFile', type=str, default='./PS_DS/tcorr_ds_ps.bin',
help='temporal coherence file (default: %(default)s).')
parser.add_argument('--ps-mask', dest='psMaskFile', type=str, default='./ampDispersion/ps_pixels',
help='PS pixels file (default: %(default)s).')
parser.add_argument('-g', '--geom-dir', dest='geomDir', type=str, default='./geometry',
help='FRInGE geometry directory (default: %(default)s).\n'
'This is used to grab 1) bounding box\n'
' AND 2) geometry source directory where the binary files are.')
parser.add_argument('-w','--water-mask', dest='water_mask_file', type=str, default='./geometry/waterMask.rdr',
help='path to water mask file (default: %(default)s or None if not exist).')
parser.add_argument('-m', '--meta-file', dest='metaFile', type=str, default='../reference/IW*.xml',
help='metadata file (default: %(default)s).\n'
'e.g.: ./reference/IW1.xml for ISCE/topsStack OR\n'
' ./referenceShelve/data.dat for ISCE/stripmapStack')
parser.add_argument('-b', '--baseline-dir', dest='baselineDir', type=str, default='../baselines',
help='baseline directory (default: %(default)s).')
parser.add_argument('-o', '--out-dir', dest='outDir', type=str, default='./mintpy',
help='output directory (default: %(default)s).')
parser.add_argument('-r','--range', dest='lks_x', type=int, default=1,
help='number of looks in range direction, for multilooking applied after fringe processing.\n'
'Only impacts metadata. (default: %(default)s).')
parser.add_argument('-a','--azimuth', dest='lks_y', type=int, default=1,
help='number of looks in azimuth direction, for multilooking applied after fringe processing.\n'
'Only impacts metadata. (default: %(default)s).')
parser.add_argument('--geom-only', action='store_true',
help='Only create the geometry file (useful for geocoding a watermask).')
parser = arg_utils.add_subset_argument(parser, geo=False)
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# check: --meta-file option (if contains wildcard)
inps.metaFile = sorted(glob.glob(inps.metaFile))[0]
# check: --water-mask option (if default/input file exists)
if not os.path.isfile(inps.water_mask_file):
msg = f'WARNING: default/input water mask file ({inps.water_mask_file}) NOT found, '
msg += 'continue without it (by setting water_mask_file to None).'
print(msg)
inps.water_mask_file = None
return inps
####################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.prep_fringe import load_fringe
# run
load_fringe(inps)
####################################################################################
if __name__=="__main__":
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/prep_gamma.py 0000775 0000000 0000000 00000014416 15032632755 0020321 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import os
import sys
from mintpy.utils.arg_utils import create_argument_parser
# from mintpy.objects.sensor import SENSOR_NAMES
# copy as below to avoid importing the non-empty mintpy.objects.__init__.py
SENSOR_NAMES = [
'alos',
'alos2',
'csk',
'env',
'ers',
'gf3',
'jers',
'ksat5',
'ni',
'rs1',
'rs2',
'rcm',
'sen',
'tsx',
'uav',
]
##################################################################################################
NOTE = """
For each interferogram, including unwrapped/wrapped interferograms and coherence, 3 metadata files are required:
1) reference .par file, e.g. 130118_4rlks.amp.par
2) secondary .par file, e.g. 130129_4rlks.amp.par
3) interferogram .off file, e.g. 130118-130129_4rlks.off
Other metadata files are recommended and can be generated from the above 3 if not existing, more specifically:
4) baseline files, e.g. 130118-130129_4rlks.baseline and 130118-130129_4rlks.base_perp,
which can be generated from file 1-3 with Gamma command base_orbit and base_perp.
5) corner files, e.g. 130118_4rlks.amp.corner_full and 130118_4rlks.amp.corner,
which can be generated from file 1 with Gamma command SLC_corners.
This script will read all these files (generate 4 and 5 if not existing), merge them into one, convert their name from
Gamma style to ROI_PAC style, and write to an metadata file, same name as input binary data file with suffix .rsc,
e.g. diff_filt_HDR_130118-130129_4rlks.unw.rsc
For DEM file in radar/geo coordinates (.hgt_sim or .rdc.dem / .utm.dem) and
lookup table file for geocoding (.UTM_TO_RDC), 2 metadata files are required:
1) .par file, for DEM in geo coordinates and lookup table, e.g.: sim_150911_4rlks.utm.dem.par
2) .diff_par file, for DEM in radar coordinates, e.g. sim_150911_4rlks.diff_par
Here is an example of how your Gamma files should look like:
Before loading:
For each interferogram, 5 files are needed:
130118-130129_4rlks.off
130118_4rlks.amp.par
130129_4rlks.amp.par
filt_130118-130129_4rlks.cor
diff_130118-130129_4rlks.unw
diff_130118-130129_4rlks.unw.conncomp [optional, can be generated by snaphu]
For each dataset, only one sim* folder with 5 files are needed,
sim_150911_4rlks.UTM_TO_RDC
sim_150911_4rlks.diff_par
sim_150911_4rlks.hgt_sim or sim_150911.rdc.dem
sim_150911_4rlks.utm.dem
sim_150911_4rlks.utm.dem.par
After running prep_gamma.py:
For each interferogram:
130118-130129_4rlks.base_perp
130118-130129_4rlks.baseline
130118-130129_4rlks.off
130118_4rlks.ramp.corner
130118_4rlks.ramp.corner_full
130118_4rlks.ramp.par
130129_4rlks.ramp.par
filt_130118-130129_4rlks.cor
filt_130118-130129_4rlks.cor.rsc
diff_130118-130129_4rlks.unw
diff_130118-130129_4rlks.unw.rsc
diff_130118-130129_4rlks.unw.conncomp
diff_130118-130129_4rlks.unw.conncomp.rsc
For the geometry files in each dataset:
sim_150911_4rlks.UTM_TO_RDC
sim_150911_4rlks.UTM_TO_RDC.rsc
sim_150911_4rlks.diff_par
sim_150911_4rlks.rdc.dem or sim_150911_4rlks.hgt_sim
sim_150911_4rlks.rdc.dem.rsc or sim_150911_4rlks.hgt_sim.rsc
sim_150911_4rlks.utm.dem
sim_150911_4rlks.utm.dem.par
sim_150911_4rlks.utm.dem.rsc
Notes: both - and _ are supported;
both YYMMDD and YYYYMMDD naming are also supported;
if no multilooking applied, do not add "_4rlks" in your file names.
"""
EXAMPLE = """example:
prep_gamma.py diff_filt_HDR_20130118_20130129_4rlks.unw
prep_gamma.py "interferograms/*/diff_*rlks.unw" --sensor sen --dem "../geometry/sim*rlks.utm.dem"
prep_gamma.py "interferograms/*/diff_*rlks.unw" --sensor sen
prep_gamma.py "interferograms/*/filt_*rlks.cor"
prep_gamma.py "interferograms/*/diff_*rlks.int"
prep_gamma.py sim_20150911_20150922.hgt_sim
prep_gamma.py sim_20150911_20150922.utm.dem
prep_gamma.py sim_20150911_20150922.UTM_TO_RDC
"""
def create_parser(subparsers=None):
synopsis = 'Prepare attributes file for Gamma product.'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis+NOTE, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', nargs='+', help='Gamma file(s)')
parser.add_argument('--sensor', dest='sensor', type=str, choices=SENSOR_NAMES,
help='SAR sensor')
parser.add_argument('--dem', dest='dem_file', type=str,
help='DEM data file')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import utils1 as ut
# check
inps.file = ut.get_file_list(inps.file, abspath=True)
inps.file_ext = os.path.splitext(inps.file[0])[1].lower()
# check: input file extension
ext_list = ['.unw', '.cor', '.int', '.conncomp', '.dem', '.hgt_sim']
ext_ends = ['to_rdc', '2_rdc', '2rdc']
if inps.file_ext not in ext_list and not inps.file_ext.endswith(tuple(ext_ends)):
msg = f'unsupported input file extension: {inps.file_ext}'
msg += f'\nsupported file extensions: {ext_list + ["*"+x for x in ext_ends]}'
raise ValueError(msg)
# check: --dem
if inps.dem_file:
inps.dem_file = ut.get_file_list(inps.dem_file, abspath=True)[0]
return inps
##################################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.prep_gamma import prep_gamma
# run
prep_gamma(inps)
###################################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/prep_gmtsar.py 0000775 0000000 0000000 00000003732 15032632755 0020533 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import os
import sys
from mintpy.utils.arg_utils import create_argument_parser
#########################################################################
EXAMPLE = """example:
prep_gmtsar.py StHelensEnvDT156.txt
"""
def create_parser(subparsers=None):
"""Command line parser."""
synopsis = 'Prepare GMTSAR metadata files.'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('template_file', type=str, help='MintPy template file for GMTSAR products.')
parser.add_argument('--mintpy-dir', dest='mintpy_dir', default='./',
help='MintPy directory (default: %(default)s).')
parser.add_argument('--force', dest='update_mode', action='store_false',
help='Force to overwrite all .rsc metadata files.')
return parser
def cmd_line_parse(iargs = None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# check: input paths (use full path and translate user symbol)
inps.template_file = os.path.abspath(inps.template_file)
inps.mintpy_dir = os.path.expanduser(inps.mintpy_dir)
inps.mintpy_dir = os.path.abspath(inps.mintpy_dir)
return inps
#########################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.prep_gmtsar import prep_gmtsar
# run
prep_gmtsar(inps)
#########################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/prep_hyp3.py 0000775 0000000 0000000 00000010321 15032632755 0020111 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Forrest Williams, Aug 2022 #
############################################################
import sys
from mintpy.utils.arg_utils import create_argument_parser
#########################################################################
NOTE = """
For each interferogram, the unwrapped interferogram, coherence, and metadata the file name is required e.g.:
1) S1AA_20161223T070700_20170116T070658_VVP024_INT80_G_ueF_74C2_unw_phase.tif
2) S1AA_20161223T070700_20170116T070658_VVP024_INT80_G_ueF_74C2_corr.tif
3) S1AA_20161223T070700_20170116T070658_VVP024_INT80_G_ueF_74C2.txt
A DEM filename is needed and a incidence angle filename is recommended e.g.:
1) S1AA_20161223T070700_20170116T070658_VVP024_INT80_G_ueF_74C2_dem.tif
2) S1AA_20161223T070700_20170116T070658_VVP024_INT80_G_ueF_74C2_lv_theta.tif
This script will read these files, read the geospatial metadata from GDAL,
find the corresponding HyP3 metadata file (for interferograms and coherence),
and write to a ROI_PAC .rsc metadata file with the same name as the input file with suffix .rsc,
e.g. S1AA_20161223T070700_20170116T070658_VVP024_INT80_G_ueF_74C2_unw_phase.tif.rsc
Here is an example of how your HyP3 files should look:
Before loading:
For each interferogram, 3 files are needed:
S1AA_20161223T070700_20170116T070658_VVP024_INT80_G_ueF_74C2_unw_phase_clip.tif
S1AA_20161223T070700_20170116T070658_VVP024_INT80_G_ueF_74C2_corr_clip.tif
S1AA_20161223T070700_20170116T070658_VVP024_INT80_G_ueF_74C2.txt
For the geometry file 2 file are recommended:
S1AA_20161223T070700_20170116T070658_VVP024_INT80_G_ueF_74C2_dem_clip.tif (required)
S1AA_20161223T070700_20170116T070658_VVP024_INT80_G_ueF_74C2_lv_theta_clip.tif (optional but recommended)
After running prep_hyp3.py:
For each interferogram:
S1AA_20161223T070700_20170116T070658_VVP024_INT80_G_ueF_74C2_unw_phase_clip.tif
S1AA_20161223T070700_20170116T070658_VVP024_INT80_G_ueF_74C2_unw_phase_clip.tif.rsc
S1AA_20161223T070700_20170116T070658_VVP024_INT80_G_ueF_74C2_corr_clip.tif
S1AA_20161223T070700_20170116T070658_VVP024_INT80_G_ueF_74C2_corr_clip.tif.rsc
S1AA_20161223T070700_20170116T070658_VVP024_INT80_G_ueF_74C2.txt
For the input geometry files:
S1AA_20161223T070700_20170116T070658_VVP024_INT80_G_ueF_74C2_dem_clip.tif
S1AA_20161223T070700_20170116T070658_VVP024_INT80_G_ueF_74C2_dem_clip.tif.rsc
S1AA_20161223T070700_20170116T070658_VVP024_INT80_G_ueF_74C2_lv_theta_clip.tif
S1AA_20161223T070700_20170116T070658_VVP024_INT80_G_ueF_74C2_lv_theta_clip.tif.rsc
Notes:
HyP3 currently only supports generation of Sentinel-1 interferograms, so
some Sentinel-1 metadata is hard-coded. If HyP3 adds processing of interferograms
from other satellites, changes will be needed.
"""
EXAMPLE = """example:
prep_hyp3.py interferograms/*/*unw_phase_clip.tif
prep_hyp3.py interferograms/*/*corr_clip.tif
prep_hyp3.py interferograms/*/*dem_clip.tif
prep_hyp3.py interferograms/*/*lv_theta_clip.tif
prep_hyp3.py interferograms/*/*clip.tif
"""
def create_parser(subparsers=None):
synopsis = 'Prepare attributes file for HyP3 InSAR product.'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis+NOTE, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', nargs='+', help='HyP3 file(s)')
return parser
def cmd_line_parse(iargs=None):
parser = create_parser()
inps = parser.parse_args(args=iargs)
return inps
#########################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.prep_hyp3 import prep_hyp3
# run
prep_hyp3(inps)
###################################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/prep_isce.py 0000775 0000000 0000000 00000011607 15032632755 0020161 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import glob
import sys
from mintpy.utils.arg_utils import create_argument_parser
#########################################################################
GEOMETRY_PREFIXS = ['hgt', 'lat', 'lon', 'los', 'shadowMask', 'waterMask', 'incLocal']
EXAMPLE = """example:
## topsStack
prep_isce.py -f "./merged/interferograms/*/filt_*.unw" -m ./reference/IW1.xml -b ./baselines/ -g ./merged/geom_reference/
# topsStack with ionosphere
prep_isce.py -f "./merged/interferograms/*/filt_*.unw" "./ion/*/ion_cal/filt.ion" -m ./reference/IW1.xml -b ./baselines/ -g ./merged/geom_reference/
# topsStack for offset
prep_isce.py -f "./merged/offsets/*/*Off*.bip" -m ./reference/IW1.xml -b ./baselines/ -g ./merged/offsets/geom_reference/
## stripmapStack
prep_isce.py -f "./Igrams/*/filt_*.unw" -m ./referenceShelve/data.dat -b ./baselines/ -g ./geom_reference/
# stripmapApp
prep_isce.py -m 20120507_slc_crop.xml -g ./geometry
## alosStack
# where 150408 is the reference date
prep_isce.py -f "./pairs/*/insar/filt_*.unw" -m "pairs/150408-*/150408.track.xml" -b ./baseline/ -g ./dates_resampled/150408/insar/
## UAVSAR
prep_isce.py -f "./Igrams/*/filt_*.unw" -m ./referenceShelve/data.dat -b ./baselines/ -g ./geometry/
# UAVSAR for offset
prep_isce.py -f "./offsets/*/*Off*.bip" -m "SLC/*/data.dat" -b random -g ./geometry/
"""
def create_parser(subparsers=None):
"""Command line parser."""
synopsis = 'Prepare ISCE-2 metadata files.'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
# observations
parser.add_argument('-f', dest='obs_files', type=str, nargs='+', default=['./merged/interferograms/*/filt_*.unw'],
help='Wildcard path pattern for the primary observation files.\n'
'E.g.: topsStack : {dset_dir}/merged/interferograms/*/filt_*.unw\n'
' topsStack / iono : {dset_dir}/ion/*/ion_cal/filt.ion\n'
' topsStack / offset : {dset_dir}/merged/offsets/*/*Off*.bip\n'
' stripmapStack : {dset_dir}/Igrams/*_*/filt_*.unw\n'
' alosStack : {dset_dir}/pairs/*/insar/filt_*.unw\n'
' UAVSAR / offset : {dset_dir}/offsets/*/*Off*.bip')
# metadata
parser.add_argument('-m', '--meta-file', dest='meta_file', type=str, default=None, required=True,
help='Metadata file to extract common metada for the stack.\n'
'E.g.: topsStack : reference/IW3.xml\n'
' stripmapStack : referenceShelve/data.dat\n'
' alosStack : pairs/{ref_date}-*/{ref_date}.track.xml\n'
' UAVSAR : SLC/*/data.dat')
# geometry
parser.add_argument('-b', '--baseline-dir', dest='baseline_dir', type=str, default=None,
help='Directory with baselines. '
'Set "random" to generate baseline with random value from [-10,10].')
parser.add_argument('-g', '--geometry-dir', dest='geom_dir', type=str, default=None, required=True,
help='Directory with geometry files.')
parser.add_argument('--geom-files', dest='geom_files', type=str, nargs='*',
default=[f'{i}.rdr' for i in GEOMETRY_PREFIXS],
help='List of geometry file basenames. Default: %(default)s.\n'
'All geometry files need to be in the same directory.')
parser.add_argument('--force', dest='update_mode', action='store_false',
help='Force to overwrite all .rsc metadata files.')
return parser
def cmd_line_parse(iargs = None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# check: --meta-file option (translate wildcard)
if "*" in inps.meta_file:
fnames = glob.glob(inps.meta_file)
if len(fnames) > 0:
inps.meta_file = fnames[0]
else:
raise FileNotFoundError(inps.meta_file)
return inps
#########################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.prep_isce import prep_isce
# run
prep_isce(inps)
#########################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/prep_nisar.py 0000775 0000000 0000000 00000005463 15032632755 0020355 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Sara Mirzaee, Jul 2023 #
############################################################
import sys
from mintpy.utils.arg_utils import create_argument_parser
############################################################
EXAMPLE = """example:
prep_nisar.py -i 'interferograms/stitched/*.h5' -d dem.tiff
"""
def create_parser(subparsers=None):
"""Command line parser."""
synopsis = 'Prepare NISAR GUNW products for MintPy.'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument(
"-i",
"--input-file-glob",
dest='input_glob',
type=str,
default="./interferograms/NISAR*.h5",
help="path pattern of NISAR interferograms (default: %(default)s).",
)
parser.add_argument(
"-d",
"--dem-file",
dest="dem_file",
type=str,
default="./dem.tif",
help="path to the DEM (default: %(default)s).",
)
parser.add_argument(
"-m",
"--mask",
dest="mask_file",
type=str,
default=None,
help="path to the mask (default: %(default)s).",
)
parser.add_argument(
"-o",
"--out-dir",
dest="out_dir",
type=str,
default=".",
help="output directory (default: %(default)s).",
)
parser.add_argument(
'--force',
dest='update_mode',
action='store_false',
help='Force to overwrite all .rsc metadata files.'
)
parser.add_argument(
'--sub-lat',
'--sublat',
'--subset-lat',
dest='subset_lat',
type=float,
nargs=2,
metavar=('LATMIN', 'LATMAX'),
help='subset in latitude'
)
parser.add_argument(
'--sub-lon',
'--sublon',
'--subset-lon',
dest='subset_lon',
type=float,
nargs=2,
metavar=('LONMIN', 'LONMAX'),
help='subset in longitude'
)
return parser
def cmd_line_parse(iargs=None):
"""Create the command line parser."""
parser = create_parser()
inps = parser.parse_args(args=iargs)
return inps
####################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.prep_nisar import load_nisar
# run
load_nisar(inps)
####################################################################################
if __name__=="__main__":
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/prep_roipac.py 0000775 0000000 0000000 00000004342 15032632755 0020511 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import sys
from mintpy.utils.arg_utils import create_argument_parser
##################################################################################################
NOTE = """
For each binary file (unwrapped/wrapped interferogram, spatial coherence file), there are 2 .rsc files:
1) basic metadata file and 2) baseline parameter file. This script find those two rsc files based on
input binary file name, and merge those two metadata files into one.
For example, if input binary file is filt_100901-110117-sim_HDR_4rlks_c10.unw, this script will find
1) filt_100901-110117-sim_HDR_4rlks_c10.unw.rsc and 2) 100901-110117_baseline.rsc and merge 1) and 2) into
one file: filt_100901-110117-sim_HDR_4rlks_c10.unw.rsc
"""
EXAMPLE = """example:
prep_roipac.py filt_100901-110117-sim_HDR_4rlks_c10.unw
prep_roipac.py ./interferograms/*/filt_*.unw
prep_roipac.py ./interferograms/*/filt_*rlks.cor
prep_roipac.py ./interferograms/*/filt_*rlks.int
prep_roipac.py ./interferograms/*/filt_*_snap_connect.byt
"""
def create_parser(subparsers=None):
synopsis = 'Prepare attributes file for ROI_PAC products.'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis+NOTE, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', nargs='+', help='Gamma file(s)')
return parser
def cmd_line_parse(iargs=None):
parser = create_parser()
inps = parser.parse_args(args=iargs)
return inps
##################################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.prep_roipac import prep_roipac
# run
prep_roipac(inps)
###################################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/prep_snap.py 0000775 0000000 0000000 00000007463 15032632755 0020204 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Andre Theron, Antonio Valentino, Jun 2019 #
# Email: andretheronsa@gmail.com #
############################################################
import os
import sys
from mintpy.utils.arg_utils import create_argument_parser
##################################################################################################
NOTE = """
For each interferogram, coherence or unwrapped .dim product this script will prepare.rsc
metadata files for for mintpy based on .dim metadata file.
The SNAP .dim file should contain all the required sensor / baseline metadata needed.
The baseline metadata gets written during snap back-geocoding (co-registration).
prep_snap is run separately for unw/ifg/cor files so needs separate .dim/.data products
with only the relevant band in each product. Use Band Subset > save BEAM-DIMAP file.
The file name should be yyyymmdd_yyyymmdd_type_tc.dim where type can be filt/unw/coh.
The DEM should be prepared by adding an elevation file to a coregestered product -
then extract the elevation band only. Use Band Subset > save BEAM-DIMAP file
Currently only works for geocoded (terrain correction step in SNAP) interferograms.
"""
EXAMPLE = """example:
prep_snap.py ../interferograms/*/*/Unw_*.img
prep_snap.py ../dem_tc.data/dem*.img
"""
def create_parser(subparsers=None):
synopsis = 'Prepare attributes file for SNAP products.'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis+NOTE, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', nargs='+', help='SNAP data file(s) in *.img format.')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import utils1 as ut
# check: input file wildcard (search & grab all input files)
inps.file = ut.get_file_list(inps.file, abspath=True)
# check: input file extensions
for fname in inps.file:
if not fname.endswith('.img'):
raise ValueError(f'Input data file does NOT end with .img: {fname}')
return inps
##################################################################################################
def prep_snap_metadata(snap_file):
"""Prepare SNAP metadata files.
Parameters: snap_file - str, SNAP data file with .img file extension.
Returns: rsc_file - str, metadata file
"""
from mintpy.utils import readfile, writefile
# read metadata from *.dim file
# the map info from *.img.hdr file is NOT right, thus, not used.
dim_file = os.path.dirname(snap_file)[:-4] + 'dim'
atr = readfile.read_snap_dim(dim_file)
rsc_file = snap_file + '.rsc'
# grab atr from existing rsc file
if os.path.isfile(rsc_file):
atr_orig = readfile.read_roipac_rsc(rsc_file)
else:
atr_orig = dict()
# (over)write to rsc file if input atr has more items
if not set(atr.items()).issubset(set(atr_orig.items())):
atr_out = {**atr_orig, **atr}
print(f'write metadata to {os.path.basename(rsc_file)} ')
writefile.write_roipac_rsc(atr_out, out_file=rsc_file)
return rsc_file
##################################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# run
for img_file in inps.file:
prep_snap_metadata(img_file)
##################################################################################################
if __name__ == "__main__":
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/reference_date.py 0000775 0000000 0000000 00000006613 15032632755 0021144 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import sys
from mintpy.defaults.template import get_template_content
from mintpy.utils import arg_utils
##################################################################
TEMPLATE = get_template_content('reference_date')
EXAMPLE = """example:
reference_date.py timeseries.h5 timeseries_ERA5.h5 timeseries_ERA5_demErr.h5 --template smallbaselineApp.cfg
reference_date.py timeseries_ERA5_demErr.h5 --ref-date 20050107
"""
def create_parser(subparsers=None):
synopsis = 'Change reference date of time-series HDF5 file.'
epilog = TEMPLATE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = arg_utils.create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('timeseries_file', nargs='+', help='timeseries file(s)')
parser.add_argument('-r', '--ref-date', dest='refDate', default='minRMS',
help='reference date or method, default: auto. e.g.\n' +
'20101120\n' +
'time-series HDF5 file with REF_DATE in its attributes\n' +
'reference_date.txt - text file with date in YYYYMMDD format in it\n' +
'minRMS - choose date with min residual standard deviation')
parser.add_argument('-t', '--template', dest='template_file',
help='template file with options')
parser.add_argument('-o', '--outfile', help='Output file name.')
parser.add_argument('--force', action='store_true',
help='Force updating the data matrix.')
# computing
parser = arg_utils.add_memory_argument(parser)
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import readfile
# check: input file type
ftype = readfile.read_attribute(inps.timeseries_file[0])['FILE_TYPE']
if ftype != 'timeseries':
raise ValueError(f'input file type ({ftype}) is NOT timeseries.')
# check: -t / --template option
if inps.template_file:
inps = read_template2inps(inps.template_file, inps)
return inps
def read_template2inps(template_file, inps):
"""Update inps with options from template_file"""
from mintpy.utils import readfile, utils1 as ut
template = readfile.read_template(template_file)
template = ut.check_template_auto_value(template)
key = 'mintpy.reference.date'
if key in template.keys() and template[key]:
inps.refDate = template[key]
key = 'mintpy.compute.maxMemory'
if key in template.keys() and template[key]:
inps.maxMemory = float(template[key])
return inps
##################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.reference_date import run_reference_date
# run
run_reference_date(inps)
##################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/reference_point.py 0000775 0000000 0000000 00000015017 15032632755 0021356 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import sys
from mintpy.defaults.template import get_template_content
from mintpy.utils.arg_utils import create_argument_parser
######################################### Usage ##############################################
TEMPLATE = get_template_content('reference_point')
NOTE = """note: Reference value cannot be nan, thus, all selected reference point must be:
a. non zero in mask, if mask is given
b. non nan in data (stack)
Priority:
input reference_lat/lon
input reference_y/x
input selection_method
existing REF_Y/X attributes (can be ignored by --force option)
default selection methods:
maxCoherence
random
The recommended reference pixel should meets the following criteria:
1) not in deforming areas
2) not in areas affected by strong atmospheric turbulence, such as ionospheric streaks
3) close but outside of deforming area of interest with similar elevation, to minimize
the spatial correlation effect of atmosspheric delay, especially for shot-wavelength
deformation (Chaussard et al., 2013; Morales-Rivera et al., 2016)
4) in high coherent area to minimize the decorrelation effect
"""
EXAMPLE = """example:
# for ifgramStack file, update metadata only
# add --write-data to update data matrix value
reference_point.py inputs/ifgramStack.h5 -t smallbaselineApp.cfg -c avgSpatialCoh.h5
reference_point.py inputs/ifgramStack.h5 --method manual
reference_point.py inputs/ifgramStack.h5 --method random
# for all the other files, update both metadata and data matrix value
reference_point.py 091120_100407.unw -y 257 -x 151 -m Mask.h5
reference_point.py geo_velocity.h5 -l 34.45 -L -116.23 -m Mask.h5
"""
def create_parser(subparsers=None):
synopsis = 'Reference to the same pixel in space.'
epilog = NOTE + '\n' + TEMPLATE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', type=str, help='file to be referenced.')
parser.add_argument('-t', '--template', dest='template_file',
help='template with reference info')
parser.add_argument('-m', '--mask', dest='maskFile', help='mask file')
parser.add_argument('-o', '--outfile', type=str, default=None,
help='output file name (default: %(default)s). This option is disabled for ifgramStack file.\n'
'None (default) for update data value directly without writing to a new file.\n')
parser.add_argument('--write-data', dest='write_data', action='store_true',
help='(option for ifgramStack file only) update data value, in addition to update metadata.')
parser.add_argument('--reset', action='store_true',
help='remove reference pixel information from attributes in the file')
parser.add_argument('--force', action='store_true',
help='Enforce the re-selection of reference point.')
# coordinates
coord = parser.add_argument_group('input coordinates')
coord.add_argument('-y', '--row', dest='ref_y', type=int,
help='row/azimuth number of reference pixel')
coord.add_argument('-x', '--col', dest='ref_x', type=int,
help='column/range number of reference pixel')
coord.add_argument('-l', '--lat', dest='ref_lat',
type=float, help='latitude of reference pixel')
coord.add_argument('-L', '--lon', dest='ref_lon',
type=float, help='longitude of reference pixel')
coord.add_argument('-r', '--reference', dest='reference_file',
help='use reference/seed info of this file')
coord.add_argument('--lookup', '--lookup-file', dest='lookup_file',
help='Lookup table file from SAR to DEM, i.e. geomap_4rlks.trans\n' +
'Needed for radar coord input file with --lat/lon seeding option.')
# selection method
parser.add_argument('-c', '--coherence', dest='coherenceFile', default='averageSpatialCoherence.h5',
help='use input coherence file to find the pixel with max coherence for reference pixel.')
parser.add_argument('--min-coherence', dest='minCoherence', type=float, default=0.85,
help='minimum coherence of reference pixel for max-coherence method.')
parser.add_argument('--method', type=str, choices=['maxCoherence', 'manual', 'random'],
help='methods to select reference pixel if not given in specific y/x or lat/lon:\n' +
'maxCoherence : select pixel with highest coherence value as reference point\n' +
' enabled when there is --coherence option input\n' +
'manual : display stack of input file and manually select reference point\n' +
'random : random select pixel as reference point\n')
return parser
def cmd_line_parse(iargs=None):
"""Command line parser."""
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import readfile
# check
ftype = readfile.read_attribute(inps.file)['FILE_TYPE']
# check: turn OFF --output option for ifgramStack file
if ftype == 'ifgramStack' and inps.outfile:
inps.outfile = None
print('WARNING: --outfile is NOT supported for "ifgramStack" file! Ignore it and continue.')
# check: turn ON --write-data option for non-ifgramStack file
if ftype != 'ifgramStack' and not inps.write_data:
inps.write_data = True
print(f'WARNING: auto turn ON --write-data for file tpye {ftype}')
return inps
####################################### Main Function ########################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.reference_point import run_reference_point
# run
run_reference_point(inps)
################################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/remove_hdf5_dset.py 0000775 0000000 0000000 00000005174 15032632755 0021434 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Zhang Yunjun, Antonio Valentino, Aug 2018 #
############################################################
import os
import sys
from mintpy.utils.arg_utils import create_argument_parser
###########################################################################################
EXAMPLE = """Example:
remove_hdf5_dset.py ifgramStack.h5 unwrapPhase_phaseClosure
remove_hdf5_dset.py ifgramStack.h5 unwrapPhase_phaseClosure unwrapPhase_bridging
remove_hdf5_dset.py velocity.h5 velocityStd
"""
def create_parser(subparsers=None):
synopsis = 'Remove an existing dataset from HDF5 file'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', type=str, help='HDF5 file of interest')
parser.add_argument('dset', type=str, nargs='+', help='dataset to be removed.')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# check: input file extension
if os.path.splitext(inps.file)[1] not in ['.h5', '.he5']:
raise ValueError(f'input file is NOT HDF5: {inps.file}')
return inps
###########################################################################################
def run_remove_hdf5_dset(fname, ds_names):
"""Remove a dataset from the given HDF5 file.
Parameters: fname - str, path to the HDF5 data file
ds_names - list(str), name of the HDF5 dataset to be removed.
"""
import h5py
from mintpy.utils import writefile
# grab exiting dataset list
with h5py.File(fname, 'r') as f:
dset_list = list(f.keys())
# check if given dataset exists
if any(i not in dset_list for i in ds_names):
msg = f'input dataset ({ds_names}) do not exist!'
msg += f'\nAvailable datasets: {dset_list}'
raise ValueError(msg)
# update file
writefile.remove_hdf5_dataset(fname, ds_names, print_msg=True)
print('Done.')
return
###########################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# run
run_remove_hdf5_dset(inps.file, inps.dset)
###########################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/remove_ramp.py 0000775 0000000 0000000 00000012266 15032632755 0020526 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Z. Yunjun, H. Fattahi, Antonio Valentino, 2013 #
############################################################
import os
import sys
import warnings
from mintpy.utils.arg_utils import create_argument_parser
# from mintpy.objects import RAMP_LIST
# copy as below to avoid importing the non-empty mintpy.objects.__init__.py
RAMP_LIST = [
'linear',
'linear_range',
'linear_azimuth',
'quadratic',
'quadratic_range',
'quadratic_azimuth',
]
# key configuration parameter name
config_keys = [
'mintpy.deramp',
'mintpy.deramp.maskFile',
]
###########################################################################################
EXAMPLE = """example:
remove_ramp.py timeseries.h5 -m maskTempCoh.h5
remove_ramp.py ifgramStack.h5 -m maskTempCoh.h5 -d unwrapPhase_bridging
remove_ramp.py 090214_101120.unw -m maskTempCoh.h5 -s quadratic
"""
def create_parser(subparsers=None):
synopsis = 'Remove 2D ramp(s) from the input file.'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', help='File for ramp removal')
parser.add_argument('-m', '--mask', dest='mask_file', default='maskTempCoh.h5',
help='mask for pixels used in ramp estimation\n'
'default - maskTempCoh.h5\n'
'no - use the whole area')
parser.add_argument('-s', dest='surface_type', default='linear', choices=RAMP_LIST,
help='type of surface/ramp to remove, linear by default')
parser.add_argument('-d','--dset', dest='dset',
help='dataset name to be derampped in ifgramStack file\n'
'e.g.: unwrapPhase\n'
' unwrapPhase_bridging')
parser.add_argument('-o', '--outfile', help='Output file name.')
parser.add_argument('--save-ramp-coeff', dest='save_ramp_coeff', action='store_true',
help='Save the estimated ramp coefficients into text file.')
parser.add_argument('--update', dest='update_mode', action='store_true',
help='Enable update mode, and skip inversion if:\n'
'1) output file already exists, readable '
'and newer than input file\n'
'2) all configuration parameters are the same.')
return parser
def cmd_line_parse(iargs=None):
parser = create_parser()
inps = parser.parse_args(args=iargs)
# check: coupled options (--update requires --outfile)
if inps.update_mode and not inps.outfile:
inps.update_mode = False
warnings.warn('--update is given but the required --outfile is NOT, ignore --update and continue.')
return inps
###########################################################################################
def run_or_skip(inps, extra_meta):
from mintpy.utils import readfile
print('-'*50)
print('update mode: ON')
flag = 'skip'
# check output file
if not os.path.isfile(inps.outfile):
flag = 'run'
print(f'1) output file {inps.outfile} NOT found.')
else:
print(f'1) output file {inps.outfile} already exists.')
infiles = [inps.file]
if inps.mask_file:
infiles.append(inps.mask_file)
ti = max(os.path.getmtime(i) for i in infiles)
to = os.path.getmtime(inps.outfile)
if ti > to:
flag = 'run'
print(f'2) output file is NOT newer than input file: {infiles}.')
else:
print(f'2) output file is newer than input file: {infiles}.')
# check configuration
if flag == 'skip':
atr = readfile.read_attribute(inps.outfile)
if any(str(extra_meta[key]) != atr.get(key, 'None') for key in config_keys):
flag = 'run'
print(f'3) NOT all key configuration parameters are the same:{config_keys}')
else:
print(f'3) all key configuration parameters are the same:{config_keys}')
# result
print(f'run or skip: {flag}.')
return flag
###########################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.utils import utils1 as ut
# run or skip
extra_meta = {'mintpy.deramp' : inps.surface_type,
'mintpy.deramp.maskFile' : inps.mask_file}
if inps.update_mode and run_or_skip(inps, extra_meta) == 'skip':
return
# run
ut.run_deramp(
inps.file,
ramp_type=inps.surface_type,
mask_file=inps.mask_file,
out_file=inps.outfile,
datasetName=inps.dset,
save_ramp_coeff=inps.save_ramp_coeff,
extra_meta=extra_meta,
)
###########################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/s1ab_range_bias.py 0000775 0000000 0000000 00000011625 15032632755 0021210 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import os
import sys
from mintpy.utils.arg_utils import create_argument_parser
####################################################################################
REFERENCE = """reference:
Yunjun, Z., Fattahi, H., Pi, X., Rosen, P., Simons, M., Agram, P., & Aoki, Y. (2022). Range
Geolocation Accuracy of C-/L-band SAR and its Implications for Operational Stack Coregistration.
IEEE Trans. Geosci. Remote Sens., 60, doi:10.1109/TGRS.2022.3168509.
"""
EXAMPLE = """example:
# Requires a text file named "SAFE_files.txt" containing all Sentinel-1 SAFE filenames.
# It is generated in ISCE-2/topsStack by default, and could be generated as below if missing:
# ls ./SLC > SAFE_files.txt
# 1. compute the S1A/B range bias
# based on partially corrected TS file, for a more accurate estimation
s1ab_range_bias.py timeseriesRg_SET_ERA5.h5 -a compute
s1ab_range_bias.py timeseriesRg_SET_ERA5.h5 -a compute -b data
s1ab_range_bias.py timeseriesRg_SET_ERA5.h5 -a compute -b data --force
s1ab_range_bias.py timeseriesRg_SET_ERA5.h5 -a compute -b data --nodisplay
# 2. correct for the S1A/B range bias [from the 1st/raw TS file]
s1ab_range_bias.py timeseriesRg.h5 -a correct
"""
def create_parser(subparsers=None):
synopsis = 'Sentinel-1 A/B range bias correction'
epilog = REFERENCE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
# input/output files
parser.add_argument('ts_file', help='Range offset timeseries file to be corrected, e.g. timeseriesRg_SET_ERA5.h5.')
parser.add_argument('-g', '--geom', '--geometry', dest='geom_file', help='geometry file including datasets:\nheight')
parser.add_argument('-m', '--mask', dest='mask_file', help='mask file')
parser.add_argument('-s', '--safe-list', dest='safe_list_file',
help='path to the SAFE_files.txt file, default: in the parent dir of mintpy work dir.')
parser.add_argument('-o', '--outfile', dest='ts_cor_file',
help='Output file name for corrected time-series. Default: add "_S1Bias" suffix.')
# config
parser.add_argument('-a', '--action', dest='action', choices={'compute', 'correct'}, default='compute',
help='Action to be executed:\n'
'compute - estimate the S1A/B range bias and write to HDF5 file.\n'
'correct - correct the input TS file using the bias file.')
parser.add_argument('-b','--method','--bias-method', dest='bias_method', choices={'hardwired', 'data'}, default='hardwired',
help='Bias estimation method (default: %(default)s):\n'
'hardwired - use hardwired values from section VII-A in Yunjun et al. (2022)\n'
'data - estimate from the input TS file, using the same method as in Yunjun et al. (2022)')
parser.add_argument('--force', dest='force', action='store_true', help='Force to re-generate the S1Bias.h5 file.')
# figure
fig = parser.add_argument_group('Plot the bias estimation result', 'For "--bias-method data" ONLY')
fig.add_argument('--save', dest='save_fig', action='store_true', help='save the figure')
fig.add_argument('--nodisplay', dest='disp_fig', action='store_false', help='save and do not display the figure')
return parser
def cmd_line_parse(iargs=None):
"""Command line parser."""
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# check
inps.mintpy_dir = os.path.dirname(inps.ts_file)
# check: --save/nodisplay options
if not inps.disp_fig:
inps.save_fig = True
# default + check: --geom option
if not inps.geom_file:
inps.geom_file = os.path.join(inps.mintpy_dir, 'inputs', 'geometryRadar.h5')
if not os.path.isfile(inps.geom_file):
raise FileNotFoundError(f'No geometry file found in: {inps.geom_file}!')
# default + check: --mask option
if not inps.mask_file:
inps.mask_file = os.path.join(inps.mintpy_dir, 'maskResInv.h5')
if not os.path.isfile(inps.mask_file):
inps.mask_file = None
return inps
####################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.s1ab_range_bias import run_s1ab_range_bias
# run
run_s1ab_range_bias(inps)
####################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/save_explorer.py 0000775 0000000 0000000 00000005135 15032632755 0021065 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Mahmud Haghighi, Mar 2025 #
############################################################
import sys
from mintpy.utils import readfile
from mintpy.utils.arg_utils import create_argument_parser
####################################################################################
EXAMPLE = """example:
save_explorer.py geo_timeseries_demErr.h5
save_explorer.py geo_timeseries_demErr.h5 -v geo_velocity.h5 -m geo_maskTempCoh.h5
save_explorer.py timeseries_demErr.h5 -v velocity.h5 -m maskTempCoh.h5 -o timeseries
# check more info on InSAR Explorer documentation: https://luhipi.github.io/insar-explorer
"""
def create_parser(subparsers=None):
synopsis = 'Convert time series to GRD files for QGIS InSAR Explorer plugin.'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('ts_file',
help='Time series file to be converted, in geo coordinate.')
parser.add_argument('-v', '--vel', dest='vel_file',
help='velocity file to be converted, in geo coordinate.')
parser.add_argument('-m', '--mask', dest='msk_file',
help='mask file, in geo coordinates.')
parser.add_argument('-o', '--output', dest='outdir', default='InSAR-Explorer',
help='Output directory for GRD files (default: %(default)s).')
return parser
def cmd_line_parse(iargs=None):
'''Command line parser.'''
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# check: input time series file is geocoded time series
atr = readfile.read_attribute(inps.ts_file)
ftype = atr['FILE_TYPE']
if 'Y_FIRST' not in atr.keys():
raise Exception('Input file is NOT geocoded! Only geocoded files are supported.')
if ftype not in ['timeseries']:
raise Exception(f'Input file ({ftype}) is NOT time series!')
return inps
####################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.save_explorer import save_explorer
# run
save_explorer(inps)
####################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/save_gbis.py 0000775 0000000 0000000 00000007067 15032632755 0020157 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import os
import sys
from mintpy.utils.arg_utils import create_argument_parser
##############################################################################
REFERENCE = """references:
Bagnardi, M., and A. Hooper (2018), Inversion of Surface Deformation Data for Rapid Estimates of
Source Parameters and Uncertainties: A Bayesian Approach, Geochemistry, Geophysics, Geosystems,
19, doi:10.1029/2018GC007585.
Yunjun, Z., Amelung, F., & Aoki, Y. (2021), Imaging the hydrothermal system of Kirishima volcanic
complex with L-band InSAR time series, Geophysical Research Letters, 48(11), e2021GL092879.
doi:10.1029/2021GL092879
"""
EXAMPLE = """example:
save_gbis.py velocity.h5 -g inputs/geometryGeo.h5 -o AlosDT73_20081012_20100302.mat
save_gbis.py 20150223_20161031_msk.unw -g inputs/geometryGeo.h5 -o Alos2DT23_20150223_20161031.mat
save_gbis.py 20150223_20161031_msk.unw -g inputs/geometryGeo.h5 --out-dir ../Model/data --ellipsoid2geoid
#for non-velocity dataset, e.g. step or annualAmplitude
save_gbis.py velocity.h5 step20080221 -o AlosDT73_step20080221.mat
save_gbis.py velocity.h5 annualAmplitude -o AlosDT73_annualAmplitude.mat
"""
def create_parser(subparsers=None):
synopsis = 'Convert MintPy product to GBIS .mat format.'
epilog = REFERENCE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', help='deformation file.')
parser.add_argument('dset', nargs='?',
help='date/date12 of timeseries, or date12 of interferograms to be converted')
parser.add_argument('-g','--geometry', dest='geom_file', required=True, help='geometry file')
parser.add_argument('-m', '--mask', dest='mask_file', help='mask file.')
parser.add_argument('--ref-lalo', dest='ref_lalo', type=float, nargs=2,
help='custom reference pixel in lat/lon')
parser.add_argument('--nodisplay', dest='disp_fig', action='store_false',
help='do not display the figure')
parser.add_argument('-o', '--output', dest='outfile', help='output file name.')
parser.add_argument('--out-dir', dest='outdir',
help='custom output directory, ONLY IF --output is not specified.')
parser.add_argument('--ellipsoid2geoid', action='store_true',
help='Convert the height of ellipsoid to geoid using "geoidheight" module\n'+
'Download & install geoidheight as below:\n'+
'https://github.com/geodesymiami/2021_Kirishima')
return parser
def cmd_line_parse(iargs=None):
parser = create_parser()
inps = parser.parse_args(args=iargs)
inps.argv = iargs or sys.argv[1:]
print('{} {}'.format(os.path.basename(__file__), ' '.join(inps.argv)))
return inps
##############################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.save_gbis import save_gbis
# run
save_gbis(inps)
##############################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/save_gdal.py 0000775 0000000 0000000 00000005576 15032632755 0020145 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Forrest Williams, Aug 2022 #
############################################################
import sys
from mintpy.utils.arg_utils import create_argument_parser
EXAMPLE = """example:
save_gdal.py geo/geo_velocity.h5
save_gdal.py geo/geo_timeseries_ERA5_demErr.h5 -d 20200505_20200517 --of ENVI
save_gdal.py geo/geo_ifgramStack.h5 -d unwrapPhase-20101120_20110220 --of ISCE
save_gdal.py geo/geo_ifgramStack.h5 -d coherence-20101120_20110220 --of ISCE
save_gdal.py geo_20230225.slc
save_gdal.py geo/timeseries.h5 -d 20230217 -m maskTempCoh.h5
save_gdal.py geo/timeseries.h5 -d 20230217 --zero-mask
"""
def create_parser(subparsers=None):
synopsis = 'Generate GDAL raster from MintPy h5 file.'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', help='file to be converted, in geo coordinate.')
parser.add_argument('-d', '--dset', '--dataset', dest='dset',
help='date of timeseries, or date12 of interferograms to be converted')
parser.add_argument('-o', '--output', dest='outfile',
help='output file base name. Extension is fixed by GDAL driver')
parser.add_argument('-m','--mask', dest='mask_file', metavar='FILE',
help='mask file (default: %(default)s).')
parser.add_argument('--zm','--zero-mask', dest='zero_mask', action='store_true',
help='Mask pixels with zero value (default: %(default)s)..')
parser.add_argument('--of', '--out-format', '--output-format', dest='out_format', default='GTiff',
help='file format as defined by GDAL driver name, e.g. GTiff, ENVI (default: %(default)s).\n'
'GDAL driver names can be found at https://gdal.org/drivers/raster/index.html')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import readfile
# check: input file coordinate system
atr = readfile.read_attribute(inps.file)
if 'X_FIRST' not in atr.keys():
raise ValueError(f'ERROR: Input file ({inps.file}) is not geocoded!')
return inps
##############################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.save_gdal import save_gdal
# run
save_gdal(inps)
##############################################################################
if __name__ == "__main__":
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/save_gmt.py 0000775 0000000 0000000 00000004400 15032632755 0020006 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Heresh Fattahi, Aug 2022 #
############################################################
import sys
from mintpy.utils.arg_utils import create_argument_parser
####################################################################################
EXAMPLE = """example:
save_gmt.py geo_velocity.h5
save_gmt.py geo_timeseries.h5 20071031
save_gmt.py geo_filt_fine.unw
save_gmt.py gsi10m.dem
"""
def create_parser(subparsers=None):
synopsis = 'Export geocoded file to GMT grd file'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', help='file to be converted, in geo coordinate.')
parser.add_argument('dset', nargs='?',
help='date of timeseries, or date12 of interferograms to be converted')
parser.add_argument('-o', '--output', dest='outfile',
help='output file base name. Extension is fixed with .kmz')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import readfile
# check
atr = readfile.read_attribute(inps.file)
# check: input file coordinate system
if 'Y_FIRST' not in atr.keys():
raise Exception('ERROR: input file is not geocoded.')
# check: dset for certain file types (timeseries and ifgramStack)
ftype = atr['FILE_TYPE']
if not inps.dset and ftype in ['timeseries', 'ifgramStack']:
raise Exception(f"NO required dataset is given for {ftype} file!")
return inps
####################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.save_gmt import save_gmt
# run
save_gmt(inps)
####################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/save_hdfeos5.py 0000775 0000000 0000000 00000011222 15032632755 0020554 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import os
import sys
from mintpy.defaults.template import get_template_content
from mintpy.utils.arg_utils import create_argument_parser
################################################################
TEMPLATE = get_template_content('hdfeos5')
EXAMPLE = """example:
save_hdfeos5.py geo/geo_timeseries_ERA5_ramp_demErr.h5
save_hdfeos5.py timeseries_ERA5_ramp_demErr.h5 --tc temporalCoherence.h5 --asc avgSpatialCoh.h5 -m maskTempCoh.h5 -g inputs/geometryGeo.h5
save_hdfeos5.py timeseries_ERA5_ramp_demErr.h5 --tc temporalCoherence.h5 --asc avgSpatialCoh.h5 -m maskTempCoh.h5 -g inputs/geometryRadar.h5
"""
NOTE = """
https://earthdata.nasa.gov/esdis/eso/standards-and-references/hdf-eos5
https://mintpy.readthedocs.io/en/latest/hdfeos5/
"""
def create_parser(subparsers=None):
synopsis = 'Convert MintPy timeseries product into HDF-EOS5 format'
epilog = TEMPLATE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis+NOTE, epilog=epilog, subparsers=subparsers)
parser.add_argument('ts_file', default='timeseries.h5', help='Time-series file')
parser.add_argument('-t', '--template', dest='template_file',
help='Template file for 1) arguments/options and 2) missing metadata')
parser.add_argument('--tc','--temp-coh', dest='tcoh_file',
help='Coherence/correlation file, i.e. temporalCoherence.h5')
parser.add_argument('--asc','--avg-spatial-coh', dest='scoh_file',
help='Average spatial coherence file, i.e. avgSpatialCoh.h5')
parser.add_argument('-m', '--mask', dest='mask_file', help='Mask file')
parser.add_argument('-g', '--geometry', dest='geom_file', help='geometry file')
parser.add_argument('--suffix', dest='suffix', help='suffix to be appended to file name (e.g. PS).')
parser.add_argument('--update', action='store_true',
help='Enable update mode, a.k.a. put XXXXXXXX as endDate in filename if endDate < 1 year')
parser.add_argument('--subset', action='store_true',
help='Enable subset mode, a.k.a. put suffix _N31700_N32100_E130500_E131100')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import readfile
# check
meta = readfile.read_attribute(inps.ts_file)
# default: input file paths
ts_dir = os.path.dirname(inps.ts_file)
if os.path.basename(inps.ts_file).startswith('geo_'):
tcoh_file = os.path.join(ts_dir, 'geo_temporalCoherence.h5')
scoh_file = os.path.join(ts_dir, 'geo_avgSpatialCoh.h5')
mask_file = os.path.join(ts_dir, 'geo_maskTempCoh.h5')
geom_file = os.path.join(ts_dir, 'geo_geometryRadar.h5')
else:
tcoh_file = os.path.join(ts_dir, 'temporalCoherence.h5')
scoh_file = os.path.join(ts_dir, 'avgSpatialCoh.h5')
mask_file = os.path.join(ts_dir, 'maskTempCoh.h5')
geom_file = os.path.join(ts_dir, 'inputs/geometry')
geom_file += 'Geo.h5' if 'Y_FIRST' in meta.keys() else 'Radar.h5'
inps.tcoh_file = inps.tcoh_file if inps.tcoh_file else tcoh_file
inps.scoh_file = inps.scoh_file if inps.scoh_file else scoh_file
inps.mask_file = inps.mask_file if inps.mask_file else mask_file
inps.geom_file = inps.geom_file if inps.geom_file else geom_file
# check: existence of input files
for fname in [inps.ts_file, inps.tcoh_file, inps.scoh_file, inps.mask_file, inps.geom_file]:
if not os.path.isfile(fname):
raise FileNotFoundError(fname)
# check: --subset mode in conflict with input file in radar-coordinates
if inps.subset and 'Y_FIRST' not in meta.keys():
raise SystemExit('ERROR: --subset mode is NOT supported for time-series in radar-coordinates!')
# check: coordinate
if not 'Y_FIRST' in meta.keys():
raise ValueError(f'Input file {inps.ts_file} is NOT geocoded!')
return inps
################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.save_hdfeos5 import save_hdfeos5
# run
save_hdfeos5(inps)
################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/save_kite.py 0000775 0000000 0000000 00000006572 15032632755 0020167 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Marin Govorcin, Aug 2022 #
############################################################
import sys
from mintpy.utils import arg_utils
#########################################################################################################
EXAMPLE = """example:
## displacement [event-type inversion]
# option 1: use velocity file with step estimation from timeseries2velocity.py for co-seismic displacement
save_kite.py geo/geo_velocity.h5 -d step20210104 -g geo/geo_geometry.h5 -m geo/geo_maskTempCoh.h5 -o dsc
# option 2: use time-series / ifgramStack file with date1_date2 for the transient displacement:
save_kite.py geo/geo_timeseries_ERA5_ramp_demErr.h5 -d 20101120_20110220 -g geo/geo_geometry.h5 -m geo/geo_maskTempCoh.h5 -o dsc
save_kite.py geo/geo_ifgramStack.h5 -d unwrapPhase-20101120_20110220 -g geo/geo_geometry.h5 -m geo/geo_maskTempCoh.h5 -o dsc
## velocity [interseismic or tensile dislocation inversion]
# https://pyrocko.org/beat/docs/current/examples/Rectangular_tensile.html
save_kite.py geo/geo_velocity.h5 -d velocity -g geo/geo_geometry.h5 -m geo/geo_maskTempCoh.h5 -o dsc
## import to kite
spool outfile_name % /do quadtree,covariance/aps and then File>Save Scene and it is ready for GROND or BEAT
"""
KITE_URL = 'https://github.com/pyrocko/kite'
def create_parser(subparsers=None):
synopsis = f'Generate KITE ({KITE_URL}) npz and yaml from MintPy HDF5 file.'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = arg_utils.create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', type=str, help='file to be converted, in geo coordinate.')
parser.add_argument('-d', '--dset', '--dataset', dest='dset', type=str, required=True,
help='dataset of interest to be converted.\n'+
'e.g.: velocity / stepYYYYMMDD for velocity HDF5 file,\n'+
' date12 in YYYYMMDD_YYYYMMDD for time-series HDF5 file,\n'+
' date12 in unwrapPhase-YYYYMMDD_YYYYMMDD for ifgramStack HDF5 file.')
parser.add_argument('-g', '--geom', dest='geom_file', type=str,
help='geometry file for incidence /azimuth angle and height.')
parser.add_argument('-m', '--mask', dest='mask_file', type=str,
help='mask file, or run mask.py to mask the input file beforehand.')
parser.add_argument('-o', '--output', dest='outfile', type=str,
help='output filename')
parser = arg_utils.add_subset_argument(parser)
return parser
def cmd_line_parse(iargs=None):
parser = create_parser()
inps = parser.parse_args(args=iargs)
return inps
#########################################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.save_kite import save_kite
# run
save_kite(inps)
#########################################################################################################
if __name__ == "__main__":
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/save_kmz.py 0000775 0000000 0000000 00000016114 15032632755 0020025 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import math
import os
import sys
from mintpy.utils import arg_utils
############################################################
EXAMPLE = """example:
save_kmz.py geo/geo_velocity.h5
save_kmz.py geo/geo_velocity.h5 -u cm --wrap --wrap-range -3 7
save_kmz.py geo/geo_timeseries_ERA5_ramp_demErr.h5 20101120
save_kmz.py geo/geo_timeseries_ERA5_demErr.h5 20200505_20200517
save_kmz.py geo/geo_ifgramStack.h5 20101120_20110220
save_kmz.py geo/geo_geometryRadar.h5 height --cbar-label Elevation
# to generate placemarks for the file in radar coordinates, the corresponding
# geometry file with latitude & longitude in radar coordinates are required,
# such as provided by ISCE + MintPy workflow
save_kmz.py velocity.h5 --sub-x 300 800 --sub-y 1000 1500 --step 1
"""
def create_parser(subparsers=None):
synopsis = 'Generate Google Earth KMZ file (overlay / placemarks for files in geo / radar coordinates).'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = arg_utils.create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', help='file to be converted, in geo or radar coordinate.\n'
'Note: for files in radar-coordinate, the corresponding lookup table\n'
'in radar-coordinate (as provided by ISCE) is required.')
parser.add_argument('dset', nargs='?',
help='date of timeseries, or date12 of interferograms to be converted')
parser.add_argument('-m','--mask', dest='mask_file', metavar='FILE',
help='mask file for display')
parser.add_argument('--zero-mask', dest='zero_mask', action='store_true',
help='Mask pixels with zero value.')
parser.add_argument('-o', '--output', dest='outfile',
help='output file base name. Extension is fixed with .kmz')
parser.add_argument('--kk','--keep-kml','--keep-kml-file', dest='keep_kml_file', action='store_true',
help='Do not remove KML and data/resource files after compressing into KMZ file.')
# unique for point - file in radar coordinates
parser.add_argument('-g','--geom', dest='geom_file', metavar='FILE',
help='geometry file with lat/lon. [required for file in radar coordinates]')
parser.add_argument('--step', dest='step', type=int, default=5,
help='output one point per {step} pixels, to reduce file size (default: %(default)s).\n'
'For file in radar-coordinate ONLY.')
# data
parser.add_argument('-v','--vlim', dest='vlim', nargs=2, metavar=('MIN', 'MAX'), type=float,
help='Y/value limits in the unit of {-u/--unit} for plotting.')
parser.add_argument('-u','--unit', dest='disp_unit', metavar='UNIT', default='cm/year',
help='unit for display (default: %(default)s).')
parser.add_argument('-c', '--cm', '--colormap', dest='cmap_name', default='jet',
help='Colormap for plotting (default: %(default)s), such as jet, RdBu, etc.\n'
'More details at https://mintpy.readthedocs.io/en/latest/api/colormaps/')
parser.add_argument('--wrap', action='store_true',
help='re-wrap data to display data in fringes.')
parser.add_argument('--wrap-range', dest='wrap_range', type=float, nargs=2,
default=[-1.*math.pi, math.pi], metavar=('MIN', 'MAX'),
help='range of one cycle after wrapping, default: [-pi, pi]')
# figure
fig = parser.add_argument_group('Figure')
fig.add_argument('--dpi', dest='fig_dpi', metavar='NUM', type=int, default=600,
help='Figure DPI (dots per inch). Default: 600')
fig.add_argument('--figsize', dest='fig_size', metavar=('WID', 'LEN'), type=float, nargs=2,
help='Figure size in inches - width and length')
fig.add_argument('--cbar-loc', dest='cbar_loc', default='lower left',
choices=['lower left','lower right','upper left', 'upper right'],
help='Location of colorbar in the screen. Default: lower left.')
fig.add_argument('--cbar-label', dest='cbar_label', metavar='LABEL', default='Mean LOS velocity',
help='Colorbar label. Default: Mean LOS velocity')
fig.add_argument('--cbar-bin-num', dest='cbar_bin_num', metavar='NUM', type=int,
help='Colorbar bin number (default: %(default)s).')
# reference pixel
ref = parser.add_argument_group('Reference Pixel')
ref.add_argument('--noreference', dest='disp_ref_pixel', action='store_false',
help='do not show reference point')
ref.add_argument('--ref-color', dest='ref_marker_color', metavar='COLOR', default='k',
help='marker color of reference point')
ref.add_argument('--ref-size', dest='ref_marker_size', metavar='NUM', type=int, default=5,
help='marker size of reference point (default: %(default)s).')
ref.add_argument('--ref-marker', dest='ref_marker', metavar='SYMBOL', default='s',
help='marker symbol of reference point')
# subset
parser = arg_utils.add_subset_argument(parser)
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.objects import TIMESERIES_KEY_NAMES
from mintpy.utils import readfile, utils as ut
# check
inps.work_dir = os.path.abspath(os.path.dirname(inps.file))
atr = readfile.read_attribute(inps.file)
# default + check: geom_file for file in radar coord
if 'Y_FIRST' not in atr.keys():
geom_ds_list = ['latitude', 'longitude']
# default geom_file
if not inps.geom_file:
inps.geom_file = ut.get_geometry_file(
geom_ds_list,
work_dir=inps.work_dir,
coord='radar')
# check existence
if not inps.geom_file or not os.path.isfile(inps.geom_file):
msg = f'No geometry file with {geom_ds_list} in radar coord found!'
raise FileNotFoundError(msg)
# check: dset option (required for timeseries and ifgramStack files)
ftype = atr['FILE_TYPE']
if not inps.dset and ftype in TIMESERIES_KEY_NAMES + ['ifgramStack']:
raise Exception(f'No date/date12 specified for {ftype} file!')
return inps
############################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.save_kmz import save_kmz
# run
save_kmz(inps)
#######################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/save_kmz_timeseries.py 0000775 0000000 0000000 00000012403 15032632755 0022253 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Joshua Zahner, Aug 2022 #
############################################################
import os
import sys
from mintpy.utils.arg_utils import create_argument_parser
############################################################
EXAMPLE = """example:
cd $PROJECT_NAME/mintpy/geo
save_kmz_timeseries.py geo_timeseries_ERA5_ramp_demErr.h5
save_kmz_timeseries.py geo_timeseries_ERA5_ramp_demErr.h5 -v -5 5 --wrap
save_kmz_timeseries.py timeseries_ERA5_demErr.h5 --vel velocity.h5 --tcoh temporalCoherence.h5 --mask maskTempCoh.h5
"""
def create_parser(subparsers=None):
synopsis = 'Generare Google Earth KMZ file for time-series file.'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
args = parser.add_argument_group('Input files', 'File/Dataset to display')
args.add_argument('ts_file', metavar='timeseries_file', help='Timeseries file to generate KML for')
args.add_argument('--vel', dest='vel_file', metavar='FILE',
help='Velocity file, used for the color of dot')
args.add_argument('--tcoh', dest='tcoh_file', metavar='FILE',
help='temporal coherence file, used for stat info')
args.add_argument('--mask', dest='mask_file', metavar='FILE',
help='Mask file')
args.add_argument('-o','--output', dest='outfile', help='Output KMZ file name.')
opts = parser.add_argument_group('Display options', 'configurations for the display')
opts.add_argument('--steps', type=int, nargs=3, default=[20, 5, 2],
help='list of steps for output pixel (default: %(default)s).\n'
'Set to [20, 5, 0] to skip the 3rd high-resolution level to reduce file size.')
opts.add_argument('--level-of-details','--lods', dest='lods', type=int, nargs=4, default=[0, 1500, 4000, -1],
help='list of level of details to determine the visible range while browering. '
'Default: 0, 1500, 4000, -1.\n'
'Ref: https://developers.google.com/kml/documentation/kml_21tutorial')
opts.add_argument('--vlim','-v', dest='vlim', nargs=2, metavar=('VMIN', 'VMAX'), type=float,
help='min/max range in cm/yr for color coding.')
opts.add_argument('--wrap', dest='wrap', action='store_true',
help='re-wrap data to [VMIN, VMAX) for color coding.')
opts.add_argument('--colormap','-c', dest='cmap_name', default='jet',
help='colormap used for display, i.e. jet, RdBu, hsv, jet_r, temperature, viridis, etc.\n'
'More details at https://mintpy.readthedocs.io/en/latest/api/colormaps/')
defo = parser.add_argument_group('HD for deforming areas', 'High resolution output for deforming areas')
defo.add_argument('--cutoff', dest='cutoff', type=int, default=3,
help='choose points with velocity >= cutoff * MAD. Default: 3.')
defo.add_argument('--min-percentage','--min-perc', dest='min_percentage', type=float, default=0.2,
help='choose boxes with >= min percentage of pixels are deforming. Default: 0.2.')
parser.add_argument('--kk','--keep-kml','--keep-kml-file', dest='keep_kml_file', action='store_true',
help='Do not remove KML and data/resource files after compressing into KMZ file.')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import readfile
# check: input file coordinates system (required in geo)
atr = readfile.read_attribute(inps.ts_file)
if "Y_FIRST" not in atr.keys():
raise ValueError(f"input file {inps.ts_file} is NOT geocoded")
# default: auxliary files
inps = get_aux_filename(inps)
# check: existence of auxliary files
for fname in [inps.vel_file, inps.tcoh_file, inps.mask_file]:
if not os.path.isfile(fname):
raise FileNotFoundError(f'required auxliary file {fname} NOT found!')
return inps
def get_aux_filename(inps):
"""Get auxliary files' default filename."""
ts_dir = os.path.dirname(inps.ts_file)
ts_prefix = os.path.basename(inps.ts_file).split('timeseries')[0]
fbase = os.path.join(ts_dir, ts_prefix)
inps.vel_file = inps.vel_file if inps.vel_file else f'{fbase}velocity.h5'
inps.tcoh_file = inps.tcoh_file if inps.tcoh_file else f'{fbase}temporalCoherence.h5'
inps.mask_file = inps.mask_file if inps.mask_file else f'{fbase}maskTempCoh.h5'
return inps
######################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.save_kmz_timeseries import save_kmz_timeseries
# run
save_kmz_timeseries(inps)
######################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/save_qgis.py 0000775 0000000 0000000 00000005304 15032632755 0020166 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Piyush Agram, Aug 2022 #
############################################################
import os
import sys
from mintpy.utils.arg_utils import create_argument_parser
#########################################################################################
EXAMPLE = """example:
save_qgis.py timeseries_ERA5_ramp_demErr.h5 -g inputs/geometrygeo.h5
save_qgis.py timeseries_ERA5_ramp_demErr.h5 -g inputs/geometryRadar.h5
save_qgis.py timeseries_ERA5_ramp_demErr.h5 -g inputs/geometryRadar.h5 -b 200 150 400 350
save_qgis.py geo/geo_timeseries_ERA5_ramp_demErr.h5 -g geo/geo_geometryRadar.h5
"""
def create_parser(subparsers=None):
synopsis = 'Convert to QGIS compatible ps time-series'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('ts_file', type=str, help='time-series HDF5 file')
parser.add_argument('-g', '--geom', dest='geom_file', type=str, required=True,
help='geometry HDF5 file')
parser.add_argument('-o', '--outshp', dest='shp_file', type=str, help='Output shape file.')
# bounding box
parser.add_argument('-b', '--bbox', dest='pix_bbox', type=int, nargs=4, default=None,
metavar=('Y0','Y1','X0','X1'), help='bounding box : minLine maxLine minPixel maxPixel')
parser.add_argument('-B', '--geo-bbox', dest='geo_bbox', type=float, nargs=4, default=None,
metavar=('S','N','W','E'), help='bounding box in lat lon: South North West East')
# other options
parser.add_argument('--zf', '--zero-first', dest='zero_first', action='store_true',
help='Set displacement at the first acquisition to zero.')
return parser
def cmd_line_parse(iargs=None):
'''Command line parser.'''
parser = create_parser()
inps = parser.parse_args(args=iargs)
# default: --outshp option
if not inps.shp_file:
fbase = os.path.splitext(inps.ts_file)[0]
inps.shp_file = fbase + '.shp'
return inps
#########################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.save_qgis import save_qgis
# run
save_qgis(inps)
#########################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/save_roipac.py 0000775 0000000 0000000 00000010004 15032632755 0020471 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import sys
from mintpy.utils.arg_utils import create_argument_parser
##############################################################################
EXAMPLE = """example:
#----- unwrapped phase
#for velocity: output an interferogram with temporal baseline in DATE12 metadata
save_roipac.py velocity.h5
save_roipac.py velocity.h5 -m maskTempCoh.h5 maskAoiShinmoe.h5
#for non-velocity dataset, e.g. step or annualAmplitude
save_roipac.py velocity.h5 step20080221
save_roipac.py velocity.h5 annualAmplitude
#for time-series: specify (date1_)date2
save_roipac.py timeseries_ERA5_ramp_demErr.h5 #use the last date
save_roipac.py timeseries_ERA5_ramp_demErr.h5 20050601
save_roipac.py timeseries_ERA5_ramp_demErr.h5 20040728_20050601
#for HDF-EOS5: specify displacement-date1_date2
save_roipac.py S1_IW12_128_0593_0597_20141213_20180619.he5 displacement-20170904_20170916
save_roipac.py S1_IW12_128_0593_0597_20141213_20180619.he5 displacement-20170916
#for ifgramStack: specify date1_date2
save_roipac.py inputs/ifgramStack.h5 unwrapPhase-20091225_20100723
save_roipac.py inputs/ifgramStack.h5 unwrapPhase-20091225_20100723 --ref-yx 640 810
#----- coherence
save_roipac.py inputs/ifgramStack.h5 coherence-20091225_20100723
save_roipac.py temporalCoherence.h5
save_roipac.py S1_IW12_128_0593_0597_20141213_20180619.he5 temporalCoherence -o 20170904_20170916.cor
#----- DEM
save_roipac.py geo_geometryRadar.h5 height -o srtm1.dem
save_roipac.py geo_geometryRadar.h5 height -o srtm1.hgt
save_roipac.py S1_IW12_128_0593_0597_20141213_20180619.he5 height -o srtm1.dem
"""
def create_parser(subparsers=None):
synopsis = 'Convert MintPy HDF5 file to ROI_PAC format.'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', help='HDF5 file to be converted.')
parser.add_argument('dset', nargs='?',
help='date/date12 of timeseries, or date12 of interferograms to be converted')
parser.add_argument('-o', '--output', dest='outfile', help='output file name.')
parser.add_argument('-m','--mask', dest='mask_file', nargs='+', help='mask file')
parser.add_argument('--ref-yx', dest='ref_yx', type=int, nargs=2, help='custom reference pixel in y/x')
parser.add_argument('--ref-lalo', dest='ref_lalo', type=float, nargs=2,
help='custom reference pixel in lat/lon')
parser.add_argument('--keep-all-metadata', dest='keepAllMetadata', action='store_true',
help='Do not clean the metadata as ROIPAC format')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.objects import timeseries
from mintpy.utils import readfile
# default: dset
if not inps.dset:
ftype = readfile.read_attribute(inps.file)['FILE_TYPE']
if ftype == 'timeseries':
inps.dset = timeseries(inps.file).get_date_list()[-1]
print(f'NO date specified >>> continue with the last date: {inps.dset}')
elif ftype in ['ifgramStack', 'HDFEOS']:
raise Exception(f"NO input dataset! It's required for {ftype} file")
return inps
##############################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.save_roipac import save_roipac
# run
save_roipac(inps)
##########################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/smallbaselineApp.py 0000775 0000000 0000000 00000020244 15032632755 0021461 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import datetime
import os
import sys
import mintpy
from mintpy.defaults.template import STEP_LIST
from mintpy.utils.arg_utils import create_argument_parser
##########################################################################
STEP_HELP = """Command line options for steps processing with names chosen from the following list:
{}
{}
{}
{}
In order to use either --start or --dostep, it is necessary that a
previous run was done using one of the steps options to process at least
through the step immediately preceding the starting step of the current run.
""".format(STEP_LIST[0:5], STEP_LIST[5:10], STEP_LIST[10:16], STEP_LIST[16:])
REFERENCE = """reference:
Yunjun, Z., Fattahi, H., and Amelung, F. (2019), Small baseline InSAR time series analysis:
Unwrapping error correction and noise reduction, Computers & Geosciences, 133, 104331,
doi:10.1016/j.cageo.2019.104331.
"""
EXAMPLE = """example:
smallbaselineApp.py # run with default template 'smallbaselineApp.cfg'
smallbaselineApp.py # run with default and custom templates
smallbaselineApp.py -h / --help # help
smallbaselineApp.py -H # print default template options
smallbaselineApp.py -g # generate default template if it does not exist
smallbaselineApp.py -g # generate/update default template based on custom template
smallbaselineApp.py --plot # plot results w/o run [to populate the 'pic' folder after failed runs]
# step processing with --start/stop/dostep options
smallbaselineApp.py GalapagosSenDT128.txt --dostep velocity # run step 'velocity' only
smallbaselineApp.py GalapagosSenDT128.txt --end load_data # end run after step 'load_data'
"""
def create_parser(subparsers=None):
synopsis = 'Routine Time Series Analysis for Small Baseline InSAR Stack'
epilog = REFERENCE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('customTemplateFile', nargs='?',
help='custom template with option settings.\n' +
"ignored if the default smallbaselineApp.cfg is input.")
parser.add_argument('--dir', '--work-dir', dest='workDir', default='./',
help='work directory, (default: %(default)s).')
parser.add_argument('-g', dest='generate_template', action='store_true',
help='generate default template (if it does not exist) and exit.')
parser.add_argument('-H', dest='print_template', action='store_true',
help='print the default template file and exit.')
parser.add_argument('-v','--version', action='store_true', help='print software version and exit')
parser.add_argument('--plot', dest='plot', action='store_true',
help='plot results [only] without running smallbaselineApp.')
step = parser.add_argument_group('steps processing (start/end/dostep)', STEP_HELP)
step.add_argument('--start', dest='startStep', metavar='STEP', default=STEP_LIST[0],
help='start processing at the named step (default: %(default)s).')
step.add_argument('--end','--stop', dest='endStep', metavar='STEP', default=STEP_LIST[-1],
help='end processing at the named step (default: %(default)s)')
step.add_argument('--dostep', dest='doStep', metavar='STEP',
help='run processing at the named step only')
return parser
def cmd_line_parse(iargs=None):
"""Command line parser."""
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# save argv (to check the manually specified arguments)
# use iargs for python call
# use sys.argv[1:] for command line call
inps.argv = iargs or sys.argv[1:]
# check
template_file = os.path.join(os.path.dirname(mintpy.__file__), 'defaults/smallbaselineApp.cfg')
# check: -H option (print default template)
if inps.print_template:
with open(template_file) as f:
lines = f.read()
try:
# syntax highlight via rich
from rich.console import Console
from rich.syntax import Syntax
console = Console()
console.print(Syntax(lines, "cfg", background_color='default'))
except ImportError:
print(lines)
sys.exit(0)
# check: -v option (print software version)
if inps.version:
print(mintpy.version.version_description)
sys.exit(0)
# check: existence of input template files
if (not inps.customTemplateFile
and not os.path.isfile(os.path.basename(template_file))
and not inps.generate_template):
parser.print_usage()
print(EXAMPLE)
msg = "no template file found! It requires:"
msg += "\n 1) input a custom template file, OR"
msg += "\n 2) there is a default template 'smallbaselineApp.cfg' in current directory."
raise SystemExit(f'ERROR: {msg}')
# check: custom input template file
if inps.customTemplateFile:
# check the existence
if not os.path.isfile(inps.customTemplateFile):
raise FileNotFoundError(inps.customTemplateFile)
inps.customTemplateFile = os.path.abspath(inps.customTemplateFile)
# ignore if it is the default template file (smallbaselineApp.cfg)
if os.path.basename(inps.customTemplateFile) == os.path.basename(template_file):
inps.customTemplateFile = None
# check: --plot option
if inps.argv == ['--plot']:
plot_only = True
print('plot smallbaselineApp results without run.')
else:
plot_only = False
# check: --start/end/dostep options
inps.runSteps = read_inps2run_steps(inps, step_list=STEP_LIST, plot_only=plot_only)
return inps
def read_inps2run_steps(inps, step_list, plot_only=False):
"""read/get run_steps from input arguments."""
# check: if start/end/do step input is valid
for key in ['startStep', 'endStep', 'doStep']:
value = vars(inps)[key]
if value and value not in step_list:
msg = f'Input step not found: {value}'
msg += f'\nAvailable steps: {step_list}'
raise ValueError(msg)
# check: ignore --start/end input if --dostep is specified
if inps.doStep:
inps.startStep = inps.doStep
inps.endStep = inps.doStep
# get list of steps to run
idx0 = step_list.index(inps.startStep)
idx1 = step_list.index(inps.endStep)
if idx0 > idx1:
msg = f'start step "{inps.startStep}" is CAN NOT be after the end step "{inps.endStep}"'
raise ValueError(msg)
run_steps = step_list[idx0:idx1+1]
# empty the step list if:
# a) -g OR
# b) iargs == ['--plot']
if inps.generate_template or plot_only:
run_steps = []
# print mssage - processing steps
if len(run_steps) > 0:
# for single step - compact version info
if len(run_steps) == 1:
print(mintpy.version.version_description)
else:
print(mintpy.version.logo)
print(f'--RUN-at-{datetime.datetime.now()}--')
print(f'Current directory: {os.getcwd()}')
print(f'Run routine processing with {os.path.basename(__file__)} on steps: {run_steps}')
print(f'Remaining steps: {step_list[idx0+1:]}')
print('-'*50)
return run_steps
##########################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.smallbaselineApp import run_smallbaselineApp
# run
run_smallbaselineApp(inps)
###########################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/solid_earth_tides.py 0000775 0000000 0000000 00000012632 15032632755 0021674 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import os
import sys
from mintpy.defaults.template import get_template_content
from mintpy.utils.arg_utils import create_argument_parser
###############################################################
TEMPLATE = get_template_content('correct_SET')
REFERENCE = """reference:
Milbert, D. (2018), "solid: Solid Earth Tide", [Online]. Available: http://geodesyworld.github.io/
SOFTS/solid.htm. Accessd on: 2020-09-06.
Yunjun, Z., Fattahi, H., Pi, X., Rosen, P., Simons, M., Agram, P., & Aoki, Y. (2022). Range
Geolocation Accuracy of C-/L-band SAR and its Implications for Operational Stack Coregistration.
IEEE Trans. Geosci. Remote Sens., 60, doi:10.1109/TGRS.2022.3168509.
"""
EXAMPLE = """example:
solid_earth_tides.py timeseries.h5 -g inputs/geometryGeo.h5
solid_earth_tides.py timeseries.h5 -g inputs/geometryRadar.h5
solid_earth_tides.py timeseries.h5 -g inputs/geometryRadar.h5 --comp en2az
solid_earth_tides.py date_list.txt -g inputs/geometryRadar.h5 --comp en2az
"""
def create_parser(subparsers=None):
synopsis = 'Solid Earth tides (SET) correction via PySolid'
epilog = REFERENCE + '\n' + TEMPLATE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('dis_file', type=str,
help='timeseries HDF5 file, e.g., timeseries.h5.\n'
'Or date list text file, e.g., info.py inputs/ERA5.py --date > date_list.txt')
parser.add_argument('-g','--geomtry', dest='geom_file', type=str, required=True,
help='geometry file including incidence/azimuthAngle.')
parser.add_argument('--date-wise-acq-time', dest='date_wise_acq_time', action='store_true',
help='Use the exact date-wise acquisition time instead of the common one for tides calculation.\n' +
'For ISCE-2/topsStack products only, and requires ../reference and ../secondarys folder.\n' +
'There is <1 min difference btw. S1A/B -> Negligible impact for InSAR.')
parser.add_argument('--comp', dest='set_comp', choices={'enu2los', 'en2az'}, default='enu2los',
help='Convert the ENU components into the component of interest for radar (default: %(default)s).')
parser.add_argument('--verbose', dest='verbose', action='store_true', help='Verbose message.')
parser.add_argument('--update', dest='update_mode', action='store_true', help='Enable update mode.')
# output
parser.add_argument('--set-file', dest='set_file', help='line-of-sight solid earth tide file name')
parser.add_argument('-o', dest='cor_dis_file', help='Output file name for the corrected timeseries.')
return parser
def cmd_line_parse(iargs=None):
"""Command line parser."""
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import readfile
# check
if inps.dis_file.endswith('.h5'):
atr1 = readfile.read_attribute(inps.dis_file)
atr2 = readfile.read_attribute(inps.geom_file)
coord1 = 'geo' if 'Y_FIRST' in atr1.keys() else 'radar'
coord2 = 'geo' if 'Y_FIRST' in atr2.keys() else 'radar'
proc = atr1.get('PROCESSOR', 'isce')
# check: metadata (coordinates + processors) - radar coord is NOT supported for gamma / roipac
if coord1 == 'radar' and proc in ['gamma', 'roipac']:
msg = f'Radar-coded file from {proc} is NOT supported!'
msg += '\n Try to geocode the time-series & geometry files and re-run with them instead.'
raise ValueError(msg)
# check: coordinates between time-series and geometry (consistency is required)
if coord1 != coord2:
n = max(len(os.path.basename(i)) for i in [inps.dis_file, inps.geom_file])
msg = 'Input time-series and geometry file are NOT in the same coordinate!'
msg += f'\n file {os.path.basename(inps.dis_file):<{n}} coordinate: {coord1}'
msg += f'\n file {os.path.basename(inps.geom_file):<{n}} coordinate: {coord2}'
raise ValueError(msg)
# default: output SET file name
if not inps.set_file:
geom_dir = os.path.dirname(inps.geom_file)
inps.set_file = os.path.join(geom_dir, 'SET.h5')
if inps.set_comp.endswith('2az'):
inps.set_file = os.path.join(geom_dir, 'SETaz.h5')
# default: output corrected time-series file name
if not inps.cor_dis_file:
dis_dir = os.path.dirname(inps.dis_file)
fbase, fext = os.path.splitext(os.path.basename(inps.dis_file))
inps.cor_dis_file = os.path.join(dis_dir, f'{fbase}_SET{fext}')
return inps
###############################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.solid_earth_tides import run_solid_earth_tides
# run
run_solid_earth_tides(inps)
###############################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/spatial_average.py 0000775 0000000 0000000 00000005475 15032632755 0021345 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Zhang Yunjun, Antonio Valentino, Aug 2016 #
############################################################
import sys
from mintpy.utils.arg_utils import create_argument_parser
################################# Usage ####################################
EXAMPLE = """example:
spatial_average.py inputs/ifgramStack.h5 -d coherence -m maskConnComp.h5
spatial_average.py timeseries_ERA5_demErr.h5 -m maskTempCoh.h5
"""
def create_parser(subparsers=None):
synopsis = 'Calculate the spatial average.'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', help='File to calculate spatial average')
parser.add_argument('-d', '--dset', '--dataset', dest='datasetName',
help='dataset used to calculate, for ifgramStack file only.')
parser.add_argument('-m', '--mask', dest='mask_file',
help='Mask file for the calculation')
parser.add_argument('--nodisplay', dest='disp_fig',
action='store_false', help='save and do not display the figure')
return parser
def cmd_line_parse(iargs=None):
parser = create_parser()
inps = parser.parse_args(args=iargs)
return inps
############################## Sub Function ################################
def plot_spatial_average_ts(date_list:list, avg_list:list):
"""Plot the spatial average time-series."""
import matplotlib.pyplot as plt
from mintpy.utils import plot as pp, ptime
dates = ptime.date_list2vector(date_list)[0]
# plot
_, ax = plt.subplots()
ax.plot(dates, avg_list, '-o')
# axis format
ax = pp.auto_adjust_xaxis_date(ax, dates)[0]
ax.set_title('Spatial Average', fontsize=12)
ax.set_xlabel('Time [years]', fontsize=12)
ax.set_ylabel('Mean', fontsize=12)
plt.show()
return
############################# Main Function ################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.utils import readfile, utils1 as ut
# run
avg_list, date_list = ut.spatial_average(
inps.file,
datasetName=inps.datasetName,
maskFile=inps.mask_file,
saveList=True,
)
ftype = readfile.read_attribute(inps.file)['FILE_TYPE']
if inps.disp_fig and ftype == 'timeseries':
plot_spatial_average_ts(date_list, avg_list)
return
##############################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/spatial_filter.py 0000775 0000000 0000000 00000007376 15032632755 0021222 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Heresh Fattahi, Aug 2022 #
############################################################
import sys
from mintpy.utils.arg_utils import create_argument_parser
################################################################################################
REFERENCE = """references:
Bekaert, D. P. S., Handwerger, A. L., Agram, P., & Kirschbaum, D. B. (2020). InSAR-based detection
method for mapping and monitoring slow-moving landslides in remote regions with steep and
mountainous terrain: An application to Nepal. Remote Sensing of Environment, 249, 111983.
doi:10.1016/j.rse.2020.111983
"""
EXAMPLE = """example:
spatial_filter.py velocity.h5
spatial_filter.py timeseries.h5 -f lowpass_avg -p 5
spatial_filter.py velocity.h5 -f lowpass_avg -p 5
spatial_filter.py velocity.h5 -f highpass_gaussian -p 3
spatial_filter.py velocity.h5 -f sobel
spatial_filter.py ifgramStack.h5 unwrapPhase
spatial_filter.py ifgramStack.h5 unwrapPhase -f lowpass_avg -p 5
spatial_filter.py ifgramStack.h5 unwrapPhase -f double_difference -p 1 10
"""
def create_parser(subparsers=None):
synopsis = 'Spatial filtering of 2D image.'
epilog = REFERENCE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', help='File to be filtered')
parser.add_argument('dset', type=str, nargs='*', default=[],
help='optional - dataset(s) to filter (default: %(default)s).')
parser.add_argument('-f', dest='filter_type', default='lowpass_gaussian',
choices=['lowpass_gaussian', 'highpass_gaussian',
'lowpass_avg', 'highpass_avg',
'sobel', 'roberts', 'canny', 'double_difference', 'median'],
help='Filter type (default: %(default)s).\n' +
'Check Bekaert et al. (2020) for double_difference;\n' +
'Check scikit-image as below for the other filters:\n' +
' http://scikit-image.org/docs/dev/api/skimage.filters.html')
parser.add_argument('-p', '--filter_par', dest='filter_par', nargs='*', type=float,
help='Filter parameters for filters. Default:\n' +
' Sigma for low/high pass gaussian filter, default: 3.0\n' +
' Kernel Size for low/high pass average filter, default: 5\n' +
' Kernel Radius for double difference local and regional filters, default: 1 10\n'+
' Kernel Radius for median filters, default: 5\n')
parser.add_argument('-o', '--outfile',default=None, help='Output file name.')
return parser
def cmd_line_parse(iargs=None):
parser = create_parser()
inps = parser.parse_args(args=iargs)
return inps
################################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.spatial_filter import filter_file
# run
filter_file(
fname=inps.file,
ds_names=inps.dset,
filter_type=inps.filter_type,
filter_par=inps.filter_par,
fname_out=inps.outfile,
)
################################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/subset.py 0000775 0000000 0000000 00000013521 15032632755 0017512 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import sys
from mintpy.utils.arg_utils import create_argument_parser
###########################################################################
TEMPLATE = """template
## if both yx and lalo are specified, use lalo option unless a) no lookup file AND b) dataset is in radar coord
mintpy.subset.yx = auto #[1800:2000,700:800 / no], auto for no
mintpy.subset.lalo = auto #[31.5:32.5,130.5:131.0 / no], auto for no
"""
EXAMPLE = """example:
subset.py inputs/ifgramStack.h5 -y 400 1500 -x 200 600
subset.py geo_velocity.h5 -l 30.5 30.8 -L 130.3 130.9
subset.py 030405_090801.unw -t SinabungT495F50AlosA.template
subset.py demLat*.dem.wgs84 --lat 32.5 33.0 --lon 130.2 130.6 -o srtm1.h5
# subset to the same coverage as the reference file
subset.py geo_incidence.h5 -r subset_geo_velocity.h5
# multiple files input
subset.py *velocity*.h5 timeseries*.h5 -y 400 1500 -x 200 600
# crop to larger area with custom fill value
subset.py geo_velocity.h5 -l 32.2 33.5 --outfill-nan
subset.py Mask.h5 -x 500 3500 --outfill 0
# crop radar-coded file using lat/lon
# Recommend subsetting all files in one command to ensure consistent output file size
# as the geo2radar coordinate conversion may not be strictly accurate
subset.py velocity.h5 geometryRadar.h5 --lookup geometryRadar.h5 --lat 25.894 25.896 --lon -80.124 -80.122
subset.py slcStack.h5 geometryRadar.h5 --lookup geometryRadar.h5 --lat 25.894 25.896 --lon -80.124 -80.122
"""
def create_parser(subparsers=None):
synopsis = 'Generate a subset from file/dataset'
epilog = TEMPLATE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', nargs='+', help='File(s) to subset/crop')
# subset range
parser.add_argument('-x','--sub-x','--subset-x', dest='subset_x', type=int, nargs=2,
help='subset range in x/cross-track/column direction')
parser.add_argument('-y','--sub-y','--subset-y', dest='subset_y', type=int, nargs=2,
help='subset range in y/along-track/row direction')
parser.add_argument('-l', '--lat', '--sub-lat', '--subset-lat', dest='subset_lat',
type=float, nargs=2, help='subset range in latitude')
parser.add_argument('-L', '--lon', '--sub-lon', '--subset-lon', dest='subset_lon',
type=float, nargs=2, help='subset range in column\n\n')
parser.add_argument('-t', '--template', dest='template_file',
help='template file with subset setting. i.e. \n'
'mintpy.subset.yx = 300:800,1000:3500\n'
'mintpy.subset.lalo = 30.2:30.5,130.1:131.3')
parser.add_argument('-r', '--reference',
help='reference file, subset to the same lalo as reference file')
parser.add_argument('--tight', action='store_true',
help='subset geomap_*.trans file based on non-zero values.\n' +
'For geocoded file(s) only'
'A convenient way to get rid of extra wide space due to "too large" DEM.\n\n')
# extra options
parser.add_argument('--outfill', dest='fill_value', type=float,
help="fill subset area out of data coverage with input value. i.e. \n"
"np.nan, 0, 1000, ... \n"
"By default, it's None for no-outfill.")
parser.add_argument('-o', '--output', dest='outfile',
help='output file name\n' +
'add prefix "sub_" if input/output files are in the same directory;\n' +
'same filename otherwise.')
dset_group = parser.add_argument_group('Datasets',
'Create a subset of entire dataset in radar using y/x or lat/lon option\n' +
'Including *.trans and *.dem in geo coord.')
dset_group.add_argument('--lookup', dest='lookup_file',
help='calculate bounding box in geo/radar coord from input radar/geo subset range\n' +
'using transformation file, i.e. geomap_4rlks.trans\n' +
'All input radar coord file should be same size/coverage; same for all geo coord files.')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import utils1 as ut
# check: existence of input file
flist = ut.get_file_list(inps.file)
if len(flist) == 0:
raise FileNotFoundError(f'NO file found in: {inps.file}!')
inps.file = flist
# default: disable --output option for multiple input files
if len(inps.file) > 1 and inps.outfile:
inps.outfile = None
print('WARNING: disable --output option for multiple input files.')
return inps
###########################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.subset import read_aux_subset2inps, subset_file
# run
inps = read_aux_subset2inps(inps)
for fname in inps.file:
print('-'*30)
subset_file(fname, vars(inps), out_file=inps.outfile)
###########################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/temporal_average.py 0000775 0000000 0000000 00000010427 15032632755 0021524 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Zhang Yunjun, Antonio Valentino, Aug 2016 #
############################################################
import os
import sys
import time
from mintpy.utils.arg_utils import create_argument_parser
################################# Usage ####################################
EXAMPLE = """example:
temporal_average.py ./inputs/ifgramStack.h5 -d unwrapPhase -o avgPhaseVelocity.h5
temporal_average.py ./inputs/ifgramStack.h5 -d coherence -o avgSpatialCoh.h5
"""
def create_parser(subparsers=None):
synopsis = 'Calculate temporal average (stacking) of multi-temporal datasets'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', type=str, help='input file with multi-temporal datasets')
parser.add_argument('-d', '--ds', '--dataset', dest='datasetName', default='coherence',
help='dataset name to be averaged, for file with multiple dataset family,\n'+
'e.g. ifgramStack.h5\n' +
'default: coherence')
parser.add_argument('-o', '--outfile', help='output file name')
parser.add_argument('--update', dest='update_mode', action='store_true',
help='Enable update checking for --nonzero option.')
return parser
def cmd_line_parse(iargs=None):
"""Command line parser."""
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# default:
if not inps.outfile:
inps.outfile = auto_output_filename(inps)
return inps
############################## Sub Function ################################
def auto_output_filename(inps):
"""Default output file name"""
from mintpy.utils import readfile
ftype = readfile.read_attribute(inps.file)['FILE_TYPE']
fdir = os.path.dirname(inps.file)
fbase = os.path.basename(inps.file)
if ftype == 'ifgramStack':
if inps.datasetName == 'coherence':
inps.outfile = 'avgSpatialCoh.h5'
elif 'unwrapPhase' in inps.datasetName:
inps.outfile = 'avgPhaseVelocity.h5'
else:
inps.outfile = f'avg{inps.datasetName}.h5'
elif ftype == 'timeseries':
suffix = os.path.splitext(fbase)[0].split('timeseries')[1]
inps.outfile = f'avgDisp{suffix}.h5'
else:
inps.outfile = f'avg{fbase}'
inps.outfile = os.path.join(fdir, inps.outfile)
print(f'output file: {inps.outfile}')
return inps.outfile
def run_or_skip(inps):
import h5py
print('-'*50)
print('update mode: ON')
flag = 'skip'
# check output file vs input dataset
if not os.path.isfile(inps.outfile):
flag = 'run'
print(f'1) output file {inps.outfile} NOT exist.')
else:
print(f'1) output file {inps.outfile} already exists.')
with h5py.File(inps.file, 'r') as f:
atr = f[inps.datasetName].attrs
ti = float(atr.get('MODIFICATION_TIME', os.path.getmtime(inps.file)))
to = os.path.getmtime(inps.outfile)
if ti > to:
flag = 'run'
print(f'2) output file is NOT newer than input dataset: {inps.datasetName}.')
else:
print(f'2) output file is newer than input dataset: {inps.datasetName}.')
# result
print(f'run or skip: {flag}.')
return flag
############################# Main Function ################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.utils import utils1 as ut
# run or skip
if inps.update_mode and run_or_skip(inps) == 'skip':
return
# run
start_time = time.time()
ut.temporal_average(
inps.file,
datasetName=inps.datasetName,
outFile=inps.outfile,
)
# used time
m, s = divmod(time.time()-start_time, 60)
print(f'time used: {m:02.0f} mins {s:02.1f} secs\n')
return
##############################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/temporal_derivative.py 0000775 0000000 0000000 00000003077 15032632755 0022257 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Heresh Fattahi, Antonio Valentino, 2013 #
############################################################
import sys
from mintpy.utils.arg_utils import create_argument_parser
############################################################################
EXAMPLE = """example:
temporal_derivative.py timeseries.h5
"""
def create_parser(subparsers=None):
synopsis = 'Calculate the temporal derivative of time-series.'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', type=str, help='time-series displacement file.')
parser.add_argument('-o','--output', dest='outfile', type=str, help='output derivative time-series file.')
return parser
def cmd_line_parse(iargs=None):
parser = create_parser()
inps = parser.parse_args(args=iargs)
return inps
############################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.objects import timeseries
# run
ts_obj = timeseries(inps.file)
ts_obj.temporal_derivative(inps.outfile)
return
############################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/temporal_filter.py 0000775 0000000 0000000 00000004543 15032632755 0021401 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Heresh Fattahi, Antonio Valentino, 2013 #
############################################################
import sys
from mintpy.utils.arg_utils import create_argument_parser
############################################################
REFERENCE="""reference:
Wikipedia: https://en.wikipedia.org/wiki/Gaussian_blur
Scipy: https://docs.scipy.org/doc/scipy/reference/ndimage.html
"""
EXAMPLE = """example:
temporal_filter.py timeseries_ERA5_demErr.h5 -f gaussian -t 1
temporal_filter.py timeseries_ERA5_demErr.h5 -f median -t 5
"""
def create_parser(subparsers=None):
synopsis = 'Smoothing timeseries in time domain with a moving filter'
epilog = REFERENCE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('timeseries_file', help='timeseries file to be smoothed.')
parser.add_argument('-f', '--filter', dest='filter_type', type=str, default='median',
choices={'median', 'gaussian'},
help='temporal filter type (default: %(default)s).')
parser.add_argument('-t', '--time-win', dest='time_win', type=float, default=5,
help='time window size (default: %(default)s).\n'
'number of months for gaussian filter\n'
'number of acquisitions for median filter')
parser.add_argument('-o', '--outfile', help='Output file name.')
return parser
def cmd_line_parse(iargs=None):
parser = create_parser()
inps = parser.parse_args(args=iargs)
return inps
############################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.objects import timeseries
# run
ts_obj = timeseries(inps.timeseries_file)
ts_obj.temporal_filter(
time_win=inps.time_win,
filter_type=inps.filter_type,
out_file=inps.outfile)
return
############################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/timeseries2velocity.py 0000775 0000000 0000000 00000030470 15032632755 0022221 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import os
import sys
from mintpy.defaults.template import get_template_content
from mintpy.utils import arg_utils
############################################################################
TEMPLATE = get_template_content('velocity')
REFERENCE = """references:
Efron, B., and R. Tibshirani (1986), Bootstrap methods for standard errors, confidence intervals,
and other measures of statistical accuracy, Statistical Science, 54-75, doi:10.1214/ss/1177013815.
Fattahi, H., and F. Amelung (2015), InSAR bias and uncertainty due to the systematic and stochastic
tropospheric delay, J. Geophy. Res. Solid Earth, 120(12), 8758-8773, doi:10.1002/2015JB012419.
Hetland, E., Musé, P., Simons, M., Lin, Y., Agram, P., & DiCaprio, C. (2012). Multiscale InSAR time
series (MInTS) analysis of surface deformation. Journal of Geophysical Research: Solid Earth,
117(B2), doi:10.1029/2011JB008731
"""
EXAMPLE = """example:
timeseries2velocity.py timeseries_ERA5_demErr.h5
timeseries2velocity.py timeseries_ERA5_demErr_ramp.h5 -t KyushuAlosDT73.txt
timeseries2velocity.py timeseries.h5 --start-date 20080201 --end-date 20100508
timeseries2velocity.py timeseries.h5 --ex exclude_date.txt
# complex time functions
timeseries2velocity.py timeseries_ERA5_demErr.h5 --poly 3 --period 1 0.5 --step 20170910
timeseries2velocity.py timeseries_ERA5_demErr.h5 --poly 1 --exp 20170910 90
timeseries2velocity.py timeseries_ERA5_demErr.h5 --poly 1 --log 20170910 60.4
timeseries2velocity.py timeseries_ERA5_demErr.h5 --poly 1 --log 20170910 60.4 200 --log 20171026 200.7
timeseries2velocity.py timeseries_ERA5_demErr.h5 --poly 1 --polyline 20190101 20200501
# uncertainty quantification of the estimated time functions
timeseries2velocity.py timeseries_ERA5_demErr.h5 --uq residue
timeseries2velocity.py timeseries_ERA5_demErr.h5 --uq covariance --ts-cov timeseriesCov.h5
timeseries2velocity.py timeseries_ERA5_demErr.h5 --uq bootstrap
# remove specific time function components
timeseries2velocity.py timeseries_ERA5_demErr.h5 --periodic 1 --step 20170910 --save-res --res-file timeseriesResidual.h5
timeseries2velocity.py timeseries_ERA5_demErr.h5 --periodic 1 --step 20170910 --save-res --rm-timefun periodic --res-file timeseries_ERA5_demErr_periodic.h5
"""
DROP_DATE_TXT = """exclude_date.txt:
20040502
20060708
20090103
"""
def create_parser(subparsers=None):
synopsis = 'Estimate velocity / time functions from time-series.'
epilog = REFERENCE + '\n' + TEMPLATE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = arg_utils.create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
# inputs
parser.add_argument('timeseries_file', help='Time series file for time function estimation.')
parser.add_argument('--template', '-t', dest='template_file', help='template file with options')
# outputs
parser.add_argument('-o', '--output', dest='outfile', help='output file name')
parser.add_argument('--update', dest='update_mode', action='store_true',
help='Enable update mode, and skip estimation if:\n'+
'1) output file already exists, readable '+
'and newer than input file\n' +
'2) all configuration parameters are the same.')
# reference in time and space
# useful for input file without reference info, e.g. ERA5.h5
parser = arg_utils.add_reference_argument(parser, plot=False)
# dates of interest
date = parser.add_argument_group('Dates of interest')
date.add_argument('-s','--start-date', dest='startDate',
help='start date for time function estimation')
date.add_argument('-e','--end-date', dest='endDate',
help='end date for time function estimation')
date.add_argument('--ex','--ex-date', dest='excludeDate', nargs='+', default=[],
help='date(s) not included in time function estimation, i.e.:\n' +
'--exclude 20040502 20060708 20090103\n' +
'--exclude exclude_date.txt\n'+DROP_DATE_TXT)
# Uncertainty quantification
uq = parser.add_argument_group('Uncertainty quantification (UQ)', 'Estimating the time function parameters STD')
uq.add_argument('--uq', '--uncertainty', dest='uncertaintyQuantification', metavar='VAL',
default='residue', choices={'residue', 'covariance', 'bootstrap'},
help='Uncertainty quantification method (default: %(default)s).\n'
'residue - STD from time series fitting residue (Fattahi & Amelung, 2015)\n'
'covariance - STD from time series covariance\n'
'bootstrap - STD from bootstrap resampling (Efron & Tibshirani, 1986)')
uq.add_argument('--ts-cov','--ts-cov-file', dest='timeSeriesCovFile',
help='4D time-series (co)variance file for time function STD calculation')
uq.add_argument('--bc', '--bootstrap-count', dest='bootstrapCount', type=int, default=400,
help='number of iterations for bootstrapping (default: %(default)s).')
# time functions
parser = arg_utils.add_timefunc_argument(parser)
# residual file
resid = parser.add_argument_group('Residual file', 'Save residual displacement time-series to HDF5 file.')
resid.add_argument('--save-res', dest='save_res', action='store_true',
help='Save the residual displacement time-series to HDF5 file.')
resid.add_argument('--res-file', dest='res_file', default='timeseriesResidual.h5',
help='Output file name for the residual time-series file (default: %(default)s).')
resid.add_argument('--rm-timefun', dest='rm_timefuns', nargs='*', default=['all'],
choices=['all', 'polynomial', 'periodic', 'step', 'polyline', 'exp', 'log'],
help='Specify the time functions to be removed from the input (default: %(default)s).')
# computing
parser = arg_utils.add_memory_argument(parser)
return parser
def cmd_line_parse(iargs=None):
"""Command line parser."""
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import readfile, utils as ut
# save argv (to check the manually specified arguments)
# use iargs for python call
# use sys.argv[1:] for command line call
inps.argv = iargs or sys.argv[1:]
# check
atr = readfile.read_attribute(inps.timeseries_file)
# check: input file type (time series is required)
ftype = atr['FILE_TYPE']
if ftype not in ['timeseries', 'giantTimeseries', 'HDFEOS']:
raise Exception(f'input file is {ftype}, NOT timeseries!')
# check: -t / --template option
if inps.template_file:
inps = read_template2inps(inps.template_file, inps)
# check: --uq / --uncertainty option
if inps.uncertaintyQuantification == 'bootstrap':
# 1: bootstrap count number must be larger than 1
if inps.bootstrapCount <= 1:
inps.uncertaintyQuantification = 'residue'
print('WARNING: bootstrapCount should be larger than 1!')
print('Change the uncertainty quantification method from bootstrap to residue, and continue.')
# 2: advanced time func is not supported for bootstrap
if (inps.polynomial != 1 or inps.periodic or inps.stepDate or inps.exp or inps.log):
raise ValueError('bootstrapping support polynomial with the order of 1 ONLY!')
elif inps.uncertaintyQuantification == 'covariance':
# 3: --ts-cov option is required for "--uq covariance"
if not inps.timeSeriesCovFile or not os.path.isfile(inps.timeSeriesCovFile):
inps.uncertaintyQuantification = 'residue'
print('WARNING: NO time series covariance file found!')
print('Change the uncertainty quantification method from covariance to residue, and continue.')
# check: --ref-lalo option (translate to --ref-yx)
if inps.ref_lalo:
coord = ut.coordinate(atr)
ref_y, ref_x = coord.geo2radar(inps.ref_lalo[0], inps.ref_lalo[1])[:2]
if ref_y is not None and ref_x is not None:
inps.ref_yx = [ref_y, ref_x]
print(f'input reference point in (lat, lon): ({inps.ref_lalo[0]}, {inps.ref_lalo[1]})')
print(f'corresponding point in (y, x): ({inps.ref_yx[0]}, {inps.ref_yx[1]})')
# check: --poly-order / --polyline option
if inps.polynomial < 0:
raise ValueError(f'--polynomial ({inps.polynomial}) can NOT be smaller than zero!')
if inps.polyline and inps.polynomial == 0:
raise ValueError('--polyline is NOT supported when --polynomial is zero!')
# default: sort --step / --polyline option
inps.stepDate = sorted(inps.stepDate)
inps.polyline = sorted(inps.polyline)
# default: --output option
if not inps.outfile:
# get suffix
fbase = os.path.splitext(os.path.basename(inps.timeseries_file))[0]
if fbase in ['timeseriesRg', 'timeseriesAz']:
# for range/azimuth offset time series
suffix = fbase.split('timeseries')[-1]
elif 'all' not in inps.rm_timefuns:
# for residual time series file with specified time function components
suffix = '_' + '_'.join(inps.rm_timefuns)
else:
# for regular phase time series
suffix = ''
# compose default output filename
inps.outfile = f'velocity{suffix}.h5'
if suffix:
print(f'output velocity file: {inps.outfile}')
# default: --res-file option (for specified time function components)
if inps.save_res and '--res-file' not in inps.argv and 'all' not in inps.rm_timefuns:
suffix = '_'.join(inps.rm_timefuns)
inps.res_file = f'{os.path.splitext(inps.timeseries_file)[0]}_{suffix}.h5'
print(f'output residual time series file: {inps.res_file}')
return inps
def read_template2inps(template_file, inps):
"""Read input template file into inps.excludeDate"""
print('read options from template file: '+os.path.basename(template_file))
from mintpy.utils import ptime, readfile, utils as ut
iDict = vars(inps)
template = readfile.read_template(inps.template_file, skip_chars=['[', ']'])
template = ut.check_template_auto_value(template)
# read template option
key_prefix = 'mintpy.timeFunc.'
key_list = [i for i in list(iDict.keys()) if key_prefix+i in template.keys()]
for key in key_list:
value = template[key_prefix+key]
if value:
if key in ['startDate', 'endDate']:
iDict[key] = ptime.yyyymmdd(value)
elif key in ['excludeDate']:
iDict[key] = ptime.yyyymmdd(value.split(','))
elif key in ['periodic']:
iDict[key] = [float(x) for x in value.replace(';',',').split(',')]
elif key in ['stepDate']:
iDict[key] = value.replace(';',',').split(',')
elif key in ['exp', 'log']:
value = value.replace('/',';').replace('|',';')
iDict[key] = [x.split(',') for x in value.split(';')]
elif key in ['uncertaintyQuantification', 'timeSeriesCovFile']:
iDict[key] = value
elif key in ['polynomial', 'bootstrapCount']:
iDict[key] = int(value)
key = 'mintpy.compute.maxMemory'
if key in template.keys() and template[key]:
inps.maxMemory = float(template[key])
return inps
############################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.timeseries2velocity import (
run_or_skip,
run_timeseries2time_func,
)
# run or skip
if inps.update_mode and run_or_skip(inps) == 'skip':
return
# run
run_timeseries2time_func(inps)
############################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/timeseries_rms.py 0000775 0000000 0000000 00000006777 15032632755 0021256 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import sys
from mintpy.defaults.template import get_template_content
from mintpy.utils.arg_utils import create_argument_parser
######################################################################################################
TEMPLATE = get_template_content('residual_RMS')
REFERENCE="""reference:
Yunjun, Z., Fattahi, H. and Amelung, F. (2019), Small baseline InSAR time series analysis:
Unwrapping error correction and noise reduction, Computers & Geosciences, 133, 104331,
doi:10.1016/j.cageo.2019.104331.
Rousseeuw, P. J., and M. Hubert (2011), Robust statistics for outlier detection,
Wiley Interdisciplinary Reviews: Data Mining and Knowledge Discovery, 1(1),
73-79, doi:doi:10.1002/widm.2.
"""
EXAMPLE = """example:
timeseries_rms.py timeseriesResidual.h5
timeseries_rms.py timeseriesResidual.h5 --template smallbaselineApp.cfg
timeseries_rms.py timeseriesResidual.h5 -m maskTempCoh.h5 --cutoff 3
"""
def create_parser(subparsers=None):
synopsis = 'Calculate Root Mean Square (RMS) of deramped residual phase time-series.'
epilog = TEMPLATE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('timeseries_file', help='Timeseries file')
parser.add_argument('-t', '--template', dest='template_file',
help='template file with options')
parser.add_argument('-m', '--mask', dest='maskFile', default='maskTempCoh.h5',
help='mask file for estimation')
parser.add_argument('-r','--ramp','--deramp', dest='deramp', default='quadratic',
help='ramp type to be remove for RMS calculation.\n' +
'Default - quadratic; no - do not remove ramp')
parser.add_argument('--cutoff', dest='cutoff', default='3', type=float,
help='M-score used for outlier detection based on standardised residuals\n'+
'Recommend range: [3, 4], default is 3.')
parser.add_argument('--figsize', dest='fig_size', metavar=('WID', 'LEN'),
type=float, nargs=2, default=[5., 3.],
help='figure size in inches - width and length')
parser.add_argument('--tick-year-num', dest='tick_year_num',
type=int, default=1, help='Year number per major tick')
return parser
def cmd_line_parse(iargs=None):
"""Command line parser."""
parser = create_parser()
inps = parser.parse_args(args=iargs)
# save argv (to check the manually specified arguments)
# use iargs for python call
# use sys.argv[1:] for command line call
inps.argv = iargs or sys.argv[1:]
return inps
######################################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.timeseries_rms import run_timeseries_rms
# run
run_timeseries_rms(inps)
######################################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/tropo_gacos.py 0000775 0000000 0000000 00000010467 15032632755 0020532 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Sara Mirzaee, Aug 2022 #
############################################################
import os
import sys
from mintpy.utils.arg_utils import create_argument_parser
############################################################################
REFERENCE = """references:
Yu, C., Li, Z., Penna, N. T., & Crippa, P. (2018). Generic atmospheric correction
model for Interferometric Synthetic Aperture Radar observations. Journal of
Geophysical Research: Solid Earth, 123(10), 9202-9222, doi:10.1029/2017JB015305
"""
DIR_DEMO = """--dir ./GACOS
20060624.ztd
20060624.ztd.rsc
20061225.ztd
20061225.ztd.rsc
...
OR
20060624.ztd.tif
20061225.ztd.tif
...
"""
EXAMPLE = """example:
tropo_gacos.py -f timeseries.h5 -g inputs/geometryRadar.h5 --dir ./GACOS
tropo_gacos.py -f geo/geo_timeseries.h5 -g geo/geo_geometryRadar.h5 --dir ./GACOS
"""
def create_parser(subparsers=None):
synopsis = 'Tropospheric correction using GACOS (http://www.gacos.net) delays'
epilog = REFERENCE + '\n' + DIR_DEMO + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('-f', '--file', dest='dis_file', required=True,
help='timeseries HDF5 file, i.e. timeseries.h5')
parser.add_argument('-g', '--geom', dest='geom_file', required=True,
help='geometry file.')
parser.add_argument('--dir','--gacos-dir', dest='gacos_dir', default='./GACOS',
help='directory to downloaded GACOS delays data (default: %(default)s).')
parser.add_argument('-o', dest='cor_dis_file',
help='Output file name for trospheric corrected timeseries.')
return parser
def cmd_line_parse(iargs=None):
"""Command line parser."""
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import readfile
# check: --gacos-dir (use absolute path)
inps.gacos_dir = os.path.abspath(inps.gacos_dir)
print('Use GACOS products at directory:', inps.gacos_dir)
# check: exsitence of input files
for fname in [inps.dis_file, inps.geom_file]:
if fname and not os.path.isfile(fname):
raise FileNotFoundError(f'input file not exist: {fname}')
# check: processors & coordinates of input files
atr1 = readfile.read_attribute(inps.dis_file)
atr2 = readfile.read_attribute(inps.geom_file)
coord1 = 'geo' if 'Y_FIRST' in atr1.keys() else 'radar'
coord2 = 'geo' if 'Y_FIRST' in atr2.keys() else 'radar'
proc = atr1.get('PROCESSOR', 'isce')
# check: radar-coord product from gamma and roipac is not supported
if coord1 == 'radar' and proc in ['gamma', 'roipac']:
msg = f'Radar-coded file from {proc} is NOT supported!'
msg += '\n Try to geocode the time-series and geometry files and re-run with them instead.'
raise ValueError(msg)
# check: coordinate system must be consistent btw. displacement and geometry files
if coord1 != coord2:
n = max(len(os.path.basename(i)) for i in [inps.dis_file, inps.geom_file])
msg = 'Input time-series and geometry file are NOT in the same coordinate!'
msg += f'\n file {os.path.basename(inps.dis_file):<{n}} coordinate: {coord1}'
msg += f'\n file {os.path.basename(inps.geom_file):<{n}} coordinate: {coord2}'
raise ValueError(msg)
# default: output tropo and corrected displacement file names
inps.tropo_file = os.path.join(os.path.dirname(inps.geom_file), 'GACOS.h5')
if not inps.cor_dis_file:
inps.cor_dis_file = inps.dis_file.split('.')[0] + '_GACOS.h5'
return inps
############################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.tropo_gacos import run_tropo_gacos
# run
run_tropo_gacos(inps)
############################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/tropo_phase_elevation.py 0000775 0000000 0000000 00000006260 15032632755 0022600 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import argparse
import sys
from mintpy.utils.arg_utils import create_argument_parser
############################################################################
REFERENCE = """reference:
Doin, M. P., C. Lasserre, G. Peltzer, O. Cavalie, and C. Doubre (2009), Corrections of
stratified tropospheric delays in SAR interferometry: Validation with global atmospheric
models, J App. Geophy., 69(1), 35-50, doi:10.1016/j.jappgeo.2009.03.010.
"""
EXAMPLE = """example:
tropo_phase_elevation.py timeseries_demErr.h5 -g inputs/geometryRadar.h5 -m maskTempCoh.h5
tropo_phase_elevation.py geo_timeseries_demErr.h5 -g geo_geometryRadar.h5 -m geo_maskTempCoh.h5
"""
def create_parser(subparsers=None):
synopsis = 'Correct Topo-correlated Stratified tropospheric delay'
epilog = REFERENCE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('timeseries_file', help='time-series file to be corrected')
parser.add_argument('-g', '--geometry', dest='geom_file', required=True,
help='DEM file used for correlation calculation.')
parser.add_argument('-m', '--mask', dest='mask_file', required=True,
help='mask file for pixels used for correlation calculation')
parser.add_argument('-t', '--threshold', type=float, default=0.,
help='correlation threshold to apply phase correction.\n'
'if not set, all dates will be corrected.')
parser.add_argument('-l', '--looks', dest='num_multilook', type=int, default=8,
help='number of looks applied to data for empirical estimation (default: %(default)s).')
parser.add_argument('--poly-order', '-p', dest='poly_order', type=int, default=1, choices=[1, 2, 3],
help='polynomial order of phase-height correlation (default: %(default)s).')
parser.add_argument('-o', '--outfile', help='output corrected timeseries file name')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# check: -t / --threshold option (must be within [0,1])
if inps.threshold and (not 0.0 <= inps.threshold <= 1.0):
msg = f'correction threshold {inps.threshold} is NOT within [0.0, 1.0]'
raise argparse.ArgumentTypeError(msg)
return inps
############################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.tropo_phase_elevation import run_tropo_phase_elevation
# run
run_tropo_phase_elevation(inps)
############################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/tropo_pyaps3.py 0000775 0000000 0000000 00000020032 15032632755 0020642 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import os
import sys
from mintpy.utils.arg_utils import create_argument_parser
###############################################################
REFERENCE = """reference:
Jolivet, R., R. Grandin, C. Lasserre, M.-P. Doin and G. Peltzer (2011), Systematic InSAR tropospheric
phase delay corrections from global meteorological reanalysis data, Geophys. Res. Lett., 38, L17311,
doi:10.1029/2011GL048757
Jolivet, R., P. S. Agram, N. Y. Lin, M. Simons, M. P. Doin, G. Peltzer, and Z. Li (2014), Improving
InSAR geodesy using global atmospheric models, Journal of Geophysical Research: Solid Earth, 119(3),
2324-2341, doi:10.1002/2013JB010588.
Hersbach, H., Bell, B., Berrisford, P., Hirahara, S., Horányi, A., Muñoz-Sabater, J., et al. (2020).
The ERA5 global reanalysis. Quarterly Journal of the Royal Meteorological Society, 146(730),
1999–2049, doi:10.1002/qj.3803
"""
EXAMPLE = """example:
# download datasets, calculate tropospheric delays and correct time-series file.
tropo_pyaps3.py -f timeseries.h5 -g inputs/geometryRadar.h5
tropo_pyaps3.py -f filt_fine.unw -g ../../../mintpy/inputs/geometryRadar.h5
# download datasets, calculate tropospheric delays
tropo_pyaps3.py -d date.list --hour 12 -m ERA5 -g inputs/geometryGeo.h5
tropo_pyaps3.py -d 20151002 20151003 --hour 12 -m MERRA -g inputs/geometryRadar.h5
# download datasets (covering the whole world)
tropo_pyaps3.py -d date.list --hour 12
tropo_pyaps3.py -d SAFE_files.txt
# download datasets (covering the area of interest)
tropo_pyaps3.py -d SAFE_files.txt -g inputs/geometryRadar.h5
# debug mode (to facilitate potential pyaps3 debugging)
tropo_pyaps3.py -f timeseries.h5 -g inputs/geometryRadar.h5 --debug
"""
SAFE_FILE = """SAFE_files.txt:
/data/SanAndreasSenDT42/SLC/S1B_IW_SLC__1SDV_20191117T140737_20191117T140804_018968_023C8C_82DC.zip
/data/SanAndreasSenDT42/SLC/S1A_IW_SLC__1SDV_20191111T140819_20191111T140846_029864_036803_69CA.zip
...
"""
DATA_INFO = """Global Atmospheric Models:
re-analysis_dataset coverage temp_resolution spatial_resolution latency assimilation
--------------------------------------------------------------------------------------------------------
ERA5(T) (ECMWF) global hourly 0.25 deg (~31 km) 3 months (5 days) 4D-Var
ERA-Int (ECMWF) global 6-hourly 0.75 deg (~79 km) 2 months 4D-Var
MERRA(2) (NASA Goddard) global 6-hourly 0.5*0.625 (~50 km) 2-3 weeks 3D-Var
NARR (NOAA, working from Jan 1979 to Oct 2014)
Notes for data access:
For MERRA2, you need an Earthdata account, and pre-authorize the "NASA GESDISC DATA ARCHIVE" application
following https://disc.gsfc.nasa.gov/earthdata-login.
For ERA5 from CDS, you need to agree to the Terms of Use of every datasets that you intend to download.
"""
WEATHER_DIR_DEMO = """--weather-dir ~/data/aux
atmosphere/
/ERA5
ERA5_N20_N40_E120_E140_20060624_14.grb
ERA5_N20_N40_E120_E140_20060924_14.grb
...
/MERRA
merra-20110126-06.nc4
merra-20110313-06.nc4
...
"""
def create_parser(subparsers=None):
synopsis = 'Tropospheric correction using weather models via PyAPS'
epilog = REFERENCE + '\n' + DATA_INFO + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('-f', '--file', dest='dis_file',
help='timeseries HDF5 file, i.e. timeseries.h5')
parser.add_argument('-d', '--date-list', dest='date_list', type=str, nargs='*',
help='List of dates in YYYYMMDD or YYMMDD format. It can be:\n'
'a) list of strings in YYYYMMDD or YYMMDD format OR\n'
'b) a text file with the first column as list of date in YYYYMMDD or YYMMDD format OR\n'
'c) a text file with Sentinel-1 SAFE filenames\ne.g.: '+SAFE_FILE)
parser.add_argument('--hour', type=str, help='time of data in HH, e.g. 12, 06')
parser.add_argument('-o','--output', dest='cor_dis_file',
help='Output file name for trospheric corrected timeseries.')
parser.add_argument('--debug', '--debug-mode', dest='debug_mode', action='store_true',
help='Enable debug mode, i.e. run pyaps3 without try/except to show the full message '
'and potential stopping points.')
# delay calculation
delay = parser.add_argument_group('delay calculation')
delay.add_argument('-m', '--model', '-s', dest='tropo_model', default='ERA5',
choices={'ERA5'}, # {'ERA5', 'MERRA', 'NARR'},
help='source of the atmospheric model (default: %(default)s).')
delay.add_argument('--delay', dest='delay_type', default='comb', choices={'comb', 'dry', 'wet'},
help='Delay type to calculate, comb contains both wet and dry delays (default: %(default)s).')
delay.add_argument('-w', '--dir', '--weather-dir', dest='weather_dir', default='${WEATHER_DIR}',
help='parent directory of downloaded weather data file (default: %(default)s).\n' +
'e.g.: '+WEATHER_DIR_DEMO)
delay.add_argument('-g','--geomtry', dest='geom_file', type=str,
help='geometry file including height, incidenceAngle and/or latitude and longitude')
delay.add_argument('--custom-height', dest='custom_height', type=float,
help='[for testing] specify a custom height value for delay calculation.')
delay.add_argument('--tropo-file', dest='tropo_file', type=str,
help='tropospheric delay file name')
delay.add_argument('--verbose', dest='verbose', action='store_true', help='Verbose message.')
return parser
def cmd_line_parse(iargs=None):
"""Command line parser."""
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# check + default: -w / --weather-dir option (expand special symbols)
inps.weather_dir = os.path.expanduser(inps.weather_dir)
inps.weather_dir = os.path.expandvars(inps.weather_dir)
if inps.weather_dir == '${WEATHER_DIR}':
# fallback to current dir if env var WEATHER_DIR is not defined
inps.weather_dir = './'
inps.weather_dir = os.path.abspath(inps.weather_dir)
# check: existence of input files
for fname in [inps.dis_file, inps.geom_file]:
if fname and not os.path.isfile(fname):
raise FileNotFoundError(f'input file not exist: {fname}')
# check: required options (for date/time): --file OR --date-list
if (not inps.dis_file and not inps.date_list):
raise SystemExit('ERROR: --file OR --date-list is required.\n\n'+EXAMPLE)
# check: --hour option (ensure 2 chars)
if inps.hour:
hour = int(float(inps.hour))
inps.hour = f'{hour:02d}'
# default: --tropo-file option
if inps.geom_file and not inps.tropo_file:
geom_dir = os.path.dirname(inps.geom_file)
inps.tropo_file = os.path.join(geom_dir, f'{inps.tropo_model}.h5')
# default: -o / --output option
if inps.dis_file and not inps.cor_dis_file:
fbase, fext = os.path.splitext(inps.dis_file)
inps.cor_dis_file = f'{fbase}_{inps.tropo_model}{fext}'
return inps
###############################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.tropo_pyaps3 import run_tropo_pyaps3
# run
run_tropo_pyaps3(inps)
###############################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/tsview.py 0000775 0000000 0000000 00000017412 15032632755 0017531 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import os
import sys
from mintpy.utils import arg_utils
###########################################################################################
EXAMPLE = """example:
tsview.py timeseries.h5
tsview.py timeseries.h5 --wrap
tsview.py timeseries.h5 --yx 300 400 --zero-first --nodisplay
tsview.py geo_timeseries.h5 --lalo 33.250 131.665 --nodisplay
tsview.py slcStack.h5 -u dB -v 20 60 -c gray
# press left / right key to slide images
# multiple time-series files
tsview.py timeseries_ERA5_ramp_demErr.h5 timeseries_ERA5_ramp.h5 timeseries_ERA5.h5 timeseries.h5 --off 5
tsview.py timeseries_ERA5_ramp_demErr.h5 ../GIANT/Stack/LS-PARAMS.h5 --off 5 --label mintpy giant
"""
def create_parser(subparsers=None):
synopsis = 'Interactive time-series viewer'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = arg_utils.create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
parser.add_argument('file', nargs='+',
help='time-series file to display, e.g.:\n'
'timeseries_ERA5_ramp_demErr.h5 (MintPy)\n'
'S1_IW12_128_0593_0597_20141213_20180619.he5 (HDF-EOS5)')
parser.add_argument('--label', dest='file_label', nargs='*',
help='labels to display for multiple input files')
parser.add_argument('--ylim', dest='ylim', nargs=2, metavar=('YMIN', 'YMAX'), type=float,
help='Y limits for point plotting.')
parser.add_argument('--tick-right', dest='tick_right', action='store_true',
help='set tick and tick label to the right')
parser.add_argument('-l','--lookup', dest='lookup_file', type=str,
help='lookup table file')
parser.add_argument('--no-show-img','--not-show-image', dest='disp_fig_img', action='store_false',
help='do NOT show the map figure.\n'
'Useful for plotting a point time series only.\n'
'This option requires --yx/lalo input.')
parser.add_argument('-n', dest='idx', metavar='NUM', type=int,
help='Epoch/slice number for initial display.')
parser.add_argument('--error', dest='error_file',
help='txt file with error for each date.')
# time info
parser.add_argument('--start-date', dest='start_date', type=str,
help='start date of displacement to display')
parser.add_argument('--end-date', dest='end_date', type=str,
help='end date of displacement to display')
parser.add_argument('--exclude', '--ex', dest='ex_date_list', nargs='*', default=['exclude_date.txt'],
help='Exclude date shown as gray.')
parser.add_argument('--zf', '--zero-first', dest='zero_first', action='store_true',
help='Set displacement at first acquisition to zero.')
parser.add_argument('--off','--offset', dest='offset', type=float,
help='Offset for each timeseries file.')
parser.add_argument('--noverbose', dest='print_msg', action='store_false',
help='Disable the verbose message printing.')
# temporal model fitting
parser.add_argument('--nomodel', '--nofit', dest='plot_model', action='store_false',
help='Do not plot the prediction of the time function (deformation model) fitting.')
parser.add_argument('--plot-model-conf-int', '--plot-fit-conf-int',
dest='plot_model_conf_int', action='store_true',
help='Plot the time function prediction confidence intervals.\n'
'[!-- Preliminary feature alert! --!]\n'
'[!-- This feature is NOT thoroughly checked. '
'Read the code before use. Interpret at your own risk! --!]')
parser = arg_utils.add_timefunc_argument(parser)
# pixel of interest
pixel = parser.add_argument_group('Pixel Input')
pixel.add_argument('--yx', type=int, metavar=('Y', 'X'), nargs=2,
help='initial pixel to plot in Y/X coord')
pixel.add_argument('--lalo', type=float, metavar=('LAT', 'LON'), nargs=2,
help='initial pixel to plot in lat/lon coord')
pixel.add_argument('--marker', type=str, default='o',
help='marker style (default: %(default)s).')
pixel.add_argument('--ms', '--markersize', dest='marker_size', type=float, default=6.0,
help='marker size (default: %(default)s).')
pixel.add_argument('--lw', '--linewidth', dest='linewidth', type=float, default=0,
help='line width (default: %(default)s).')
pixel.add_argument('--ew', '--edgewidth', dest='edge_width', type=float, default=1.0,
help='Edge width for the error bar (default: %(default)s)')
# other groups
parser = arg_utils.add_data_disp_argument(parser)
parser = arg_utils.add_dem_argument(parser)
parser = arg_utils.add_figure_argument(parser, figsize_img=True)
parser = arg_utils.add_gnss_argument(parser)
parser = arg_utils.add_mask_argument(parser)
parser = arg_utils.add_map_argument(parser)
parser = arg_utils.add_memory_argument(parser)
parser = arg_utils.add_reference_argument(parser)
parser = arg_utils.add_save_argument(parser)
parser = arg_utils.add_subset_argument(parser)
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# save argv (to check the manually specified arguments)
# use iargs for python call
# use sys.argv[1:] for command line call
inps.argv = iargs or sys.argv[1:]
# check: --gnss-comp option (not implemented for tsview yet)
if inps.gnss_component:
msg = f'--gnss-comp is not supported for {os.path.basename(__file__)}'
raise NotImplementedError(msg)
# check: --label option (same number as input files)
if inps.file_label:
if len(inps.file_label) != len(inps.file):
raise Exception('input number of labels != number of files.')
# check: coupled options
if not inps.save_fig and (inps.outfile or not inps.disp_fig):
inps.save_fig = True
if inps.flip_lr or inps.flip_ud:
inps.auto_flip = False
if inps.ylim:
inps.ylim = sorted(inps.ylim)
if inps.zero_mask:
inps.mask_file = 'no'
if not inps.disp_fig_img:
if not inps.yx and not inps.lalo:
inps.disp_fig_img = True
msg = 'WARNING: --yx/lalo is required for --no-show-img but NOT found! '
msg += 'Ignore it and continue'
print(msg)
# default: -u / -c / --fig-size options
inps.disp_unit = inps.disp_unit if inps.disp_unit else 'cm'
inps.colormap = inps.colormap if inps.colormap else 'jet'
inps.fig_size = inps.fig_size if inps.fig_size else [8.0, 4.5]
return inps
###########################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.tsview import timeseriesViewer
# run
obj = timeseriesViewer(inps)
obj.open()
obj.plot()
#obj.fig_img.canvas.mpl_disconnect(obj.cid)
#########################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/unwrap_error_bridging.py 0000775 0000000 0000000 00000013434 15032632755 0022602 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import os
import sys
from mintpy.defaults.template import get_template_content
from mintpy.utils.arg_utils import create_argument_parser
####################################################################################################
TEMPLATE = get_template_content('correct_unwrap_error')
REFERENCE = """reference:
Yunjun, Z., Fattahi, H., and Amelung, F. (2019), Small baseline InSAR time series analysis:
Unwrapping error correction and noise reduction, Computers & Geosciences, 133, 104331,
doi:10.1016/j.cageo.2019.104331.
"""
EXAMPLE = """Example:
unwrap_error_bridging.py ./inputs/ifgramStack.h5 -t GalapagosSenDT128.template --update
unwrap_error_bridging.py ./inputs/ifgramStack.h5 --water-mask waterMask.h5
unwrap_error_bridging.py 20180502_20180619.unw --water-mask waterMask.h5
"""
NOTE = """
by connecting reliable regions with MST bridges. This method assumes the phase differences
between neighboring regions are less than pi rad in magnitude.
"""
def create_parser(subparsers=None):
synopsis = 'Unwrapping Error Correction with Bridging'
epilog = REFERENCE + '\n' + TEMPLATE + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis+NOTE, epilog=epilog, subparsers=subparsers)
parser.add_argument('ifgram_file', type=str, help='interferograms file to be corrected')
parser.add_argument('-r','--radius', dest='bridgePtsRadius', type=int, default=50,
help='radius of the end point of bridge to search area to get median representative value\n'+
'default: 50.')
parser.add_argument('--ramp', dest='ramp', choices=['linear', 'quadratic'],
help='type of phase ramp to be removed before correction.')
parser.add_argument('--water-mask','--wm', dest='waterMaskFile', type=str, help='path of water mask file.')
parser.add_argument('-m', '--min-area', dest='connCompMinArea', type=float, default=2.5e3,
help='minimum region/area size of a single connComponent.')
parser.add_argument('-t', '--template', dest='template_file', type=str,
help='template file with bonding point info, e.g.\n' +
'mintpy.unwrapError.yx = 283,1177,305,1247;350,2100,390,2200')
parser.add_argument('-i','--in-dataset', dest='datasetNameIn', default='unwrapPhase',
help='name of dataset to be corrected, default: unwrapPhase')
parser.add_argument('-o','--out-dataset', dest='datasetNameOut',
help='name of dataset to be written after correction, default: {}_bridging')
parser.add_argument('--update', dest='update_mode', action='store_true',
help='Enable update mode: if unwrapPhase_unwCor dataset exists, skip the correction.')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import readfile
# check: input file type
ftype = readfile.read_attribute(inps.ifgram_file)['FILE_TYPE']
if ftype not in ['ifgramStack', '.unw']:
raise ValueError(f'input file is not ifgramStack: {ftype}')
# check: -t / --template option (read template content)
if inps.template_file:
inps = read_template2inps(inps.template_file, inps)
# check: --water-mask option (file existence)
if inps.waterMaskFile and not os.path.isfile(inps.waterMaskFile):
inps.waterMaskFile = None
# default: -o / --out-dataset option
if not inps.datasetNameOut:
inps.datasetNameOut = f'{inps.datasetNameIn}_bridging'
return inps
def read_template2inps(template_file, inps):
"""Read input template options into Namespace inps"""
print('read options from template file: '+os.path.basename(template_file))
from mintpy.unwrap_error_bridging import key_prefix
from mintpy.utils import readfile, utils1 as ut
inpsDict = vars(inps)
template = readfile.read_template(inps.template_file)
template = ut.check_template_auto_value(template)
key_list = [i for i in list(inpsDict.keys()) if key_prefix+i in template.keys()]
for key in key_list:
value = template[key_prefix+key]
if key in ['update']:
inpsDict[key] = value
elif value:
if key in ['waterMaskFile', 'ramp']:
inpsDict[key] = value
elif key in ['bridgePtsRadius']:
inpsDict[key] = int(value)
elif key in ['connCompMinArea']:
inpsDict[key] = float(value)
return inps
####################################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.unwrap_error_bridging import (
run_or_skip,
run_unwrap_error_bridging,
)
# run or skip
if inps.update_mode and run_or_skip(inps) == 'skip':
return
# run
run_unwrap_error_bridging(
ifgram_file=inps.ifgram_file,
water_mask_file=inps.waterMaskFile,
ramp_type=inps.ramp,
radius=inps.bridgePtsRadius,
cc_min_area=inps.connCompMinArea,
dsNameIn=inps.datasetNameIn,
dsNameOut=inps.datasetNameOut,
inps=inps,
)
####################################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/unwrap_error_phase_closure.py 0000775 0000000 0000000 00000015540 15032632755 0023651 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
import os
import sys
from mintpy.defaults.template import get_template_content
from mintpy.utils.arg_utils import create_argument_parser
##########################################################################################
TEMPLATE1 = get_template_content('quick_overview')
TEMPLATE2 = get_template_content('correct_unwrap_error')
REFERENCE = """reference:
Yunjun, Z., Fattahi, H., and Amelung, F. (2019), Small baseline InSAR time series analysis:
Unwrapping error correction and noise reduction, Computers & Geosciences, 133, 104331,
doi:10.1016/j.cageo.2019.104331.
"""
EXAMPLE = """example:
# correct phase unwrapping error with phase closure
unwrap_error_phase_closure.py ./inputs/ifgramStack.h5 --cc-mask maskConnComp.h5 -t smallbaselineApp.cfg --update
unwrap_error_phase_closure.py ./inputs/ifgramStack.h5 --cc-mask maskConnComp.h5 --water-mask waterMask.h5 --update
# calculate the number of non-zero closure phase
unwrap_error_phase_closure.py ./inputs/ifgramStack.h5 --action calculate
unwrap_error_phase_closure.py ./inputs/ifgramStack.h5 --action calculate --water-mask waterMask.h5
"""
NOTE = """
by exploiting the conservertiveness of the integer ambiguity of interferograms triplets.
This method assumes:
a. abundance of network: for interferogram with unwrapping error, there is
at least of one triangular connection to form a closed circle; with more
closed circles comes better constrain.
b. majority rightness: most of interferograms have to be right (no unwrapping
error) to correct the wrong minority. And if most of interferograms have
unwrapping errors, then the minor right interferograms will turn into wrong.
"""
def create_parser(subparsers=None):
synopsis = 'Unwrapping Error Correction based on Phase Closure'
epilog = REFERENCE + '\n' + TEMPLATE1 + '\n' + TEMPLATE2 + '\n' + EXAMPLE
name = __name__.split('.')[-1]
parser = create_argument_parser(
name, synopsis=synopsis, description=synopsis+NOTE, epilog=epilog, subparsers=subparsers)
parser.add_argument('ifgram_file', help='interferograms file to be corrected')
parser.add_argument('-c','--cc-mask', dest='cc_mask_file', default='maskConnComp.h5',
help='common connected components file, required for --action correct')
parser.add_argument('-n','--num-sample', dest='numSample', type=int, default=100,
help='Number of randomly samples/pixels for each common connected component.')
parser.add_argument('-m', '--min-area', dest='connCompMinArea', type=float, default=2.5e3,
help='minimum region/area size of a single connComponent.')
parser.add_argument('-a','--action', dest='action', type=str, default='correct',
choices={'correct', 'calculate'},
help='action to take (default: %(default)s):\n'+
'correct - correct phase unwrapping error\n'+
'calculate - calculate the number of non-zero closure phase')
# IO
parser.add_argument('-i','--in-dataset', dest='datasetNameIn', default='unwrapPhase',
help="name of dataset to be corrected, default: unwrapPhase")
parser.add_argument('-o','--out-dataset', dest='datasetNameOut',
help='name of dataset to be written after correction, default: {}_phaseClosure')
# mask
mask = parser.add_argument_group('mask')
mask.add_argument('--water-mask','--wm', dest='waterMaskFile', type=str,
help='path of water mask file.')
mask.add_argument('-t', '--template', dest='template_file',
help='template file with options for setting.')
parser.add_argument('--update', dest='update_mode', action='store_true',
help='Enable update mode: if unwrapPhase_phaseClosure dataset exists, skip the correction.')
return parser
def cmd_line_parse(iargs=None):
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import readfile
# check: -t / --template option (read template content)
if inps.template_file:
inps = read_template2inps(inps.template_file, inps)
# check: input file type (ifgramStack is required)
ftype = readfile.read_attribute(inps.ifgram_file)['FILE_TYPE']
if ftype not in ['ifgramStack']:
raise ValueError(f'input file is not ifgramStack: {ftype}')
# check: --num-sample and --min-area options (positive)
if inps.numSample <=0:
raise ValueError(f'--num-sample option must be > 0 ({inps.numSample})!')
if inps.connCompMinArea <=0:
raise ValueError(f'--min-area option must be > 0 ({inps.connCompMinArea})!')
# check: --cc-mask option (required for "--action correct")
if inps.action == 'correct' and not os.path.isfile(inps.cc_mask_file):
raise FileNotFoundError(inps.cc_mask_file)
# check: --water-mask option (file existence)
if inps.waterMaskFile and not os.path.isfile(inps.waterMaskFile):
inps.waterMaskFile = None
# default: --out-dataset option
if not inps.datasetNameOut:
inps.datasetNameOut = f'{inps.datasetNameIn}_phaseClosure'
return inps
def read_template2inps(template_file, inps):
"""Read input template options into Namespace inps"""
print('read options from template file: '+os.path.basename(inps.template_file))
from mintpy.unwrap_error_phase_closure import key_prefix
from mintpy.utils import readfile, utils1 as ut
inpsDict = vars(inps)
template = readfile.read_template(template_file)
template = ut.check_template_auto_value(template)
key_list = [i for i in list(inpsDict.keys()) if key_prefix+i in template.keys()]
for key in key_list:
value = template[key_prefix+key]
if value:
if key in ['waterMaskFile']:
inpsDict[key] = value
elif key in ['numSample']:
inpsDict[key] = int(value)
elif key in ['connCompMinArea']:
inpsDict[key] = float(value)
return inps
####################################################################################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.unwrap_error_phase_closure import (
run_unwrap_error_phase_closure,
)
# run
run_unwrap_error_phase_closure(inps)
####################################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/cli/view.py 0000775 0000000 0000000 00000017613 15032632755 0017165 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Antonio Valentino, Zhang Yunjun, Aug 2022 #
############################################################
# Recommend import:
# from mintpy.cli import view
import os
import sys
from mintpy.utils import arg_utils
##################################################################################################
EXAMPLE = """example:
view.py velocity.h5
view.py velocity.h5 velocity --wrap --wrap-range -2 2 -c cmy --lalo-label
view.py velocity.h5 --ref-yx 210 566 #change reference pixel for display
view.py velocity.h5 --sub-lat 31.05 31.10 --sub-lon 130.05 130.10 #subset in lalo / yx
view.py velocity.h5 velocity --mask waterBody.h5 --mask-vmax 1
view.py velocity.h5 velocity --style scatter --scatter-size 12
view.py timeseries.h5
view.py timeseries.h5 --ref-date 20101120 #change reference date
view.py timeseries.h5 --ex drop_date.txt #exclude dates to plot
view.py timeseries.h5 '*2017*' '*2018*' #all acquisitions in 2017 and 2018
view.py timeseries.h5 20200616_20200908 #reconstruct interferogram on the fly
view.py ifgramStack.h5 coherence
view.py ifgramStack.h5 unwrapPhase- #unwrapPhase only in the presence of unwrapPhase_bridging
view.py ifgramStack.h5 -n 6 #the 6th slice
view.py ifgramStack.h5 20171010_20171115 #all data related with 20171010_20171115
view.py ifgramStack.h5 'coherence*20171010*' #all coherence related with 20171010
# GNSS (for one subplot in geo-coordinates only)
view.py geo_velocity_msk.h5 velocity --show-gnss --gnss-label #show locations of available GPS
view.py geo_velocity_msk.h5 velocity --show-gnss --gnss-comp enu2los --ref-gnss GV01
view.py geo_velocity_msk.h5 velocity --show-gnss --gnss-comp enu2los --ref-gnss GV01 --gnss-source ESESES
view.py geo_timeseries_ERA5_ramp_demErr.h5 20180619 --ref-date 20141213 --show-gnss --gnss-comp enu2los --ref-gnss GV01
# Faults
view.py filt_dense_offsets.bil range --faultline simple_fault_confident.lonlat
# Save and Output
view.py velocity.h5 --save
view.py velocity.h5 --nodisplay
view.py geo_velocity.h5 velocity --nowhitespace
"""
def create_parser(subparsers=None):
synopsis = 'Plot InSAR Product in 2D'
epilog = EXAMPLE
name = __name__.split('.')[-1]
parser = arg_utils.create_argument_parser(
name, synopsis=synopsis, description=synopsis, epilog=epilog, subparsers=subparsers)
infile = parser.add_argument_group('Input File', 'File/Dataset to display')
infile.add_argument('file', type=str, help='file for display')
infile.add_argument('dset', type=str, nargs='*', default=[],
help='optional - dataset(s) to display (default: %(default)s).')
infile.add_argument('-n', '--dset-num', dest='dsetNumList', metavar='NUM', type=int, nargs='*', default=[],
help='optional - order number of date/dataset(s) to display (default: %(default)s).')
infile.add_argument('--nosearch', dest='search_dset', action='store_false',
help='Disable glob search for input dset.')
infile.add_argument('--ex', '--exclude', dest='exDsetList', metavar='Dset', nargs='*', default=[],
help='dates will not be displayed (default: %(default)s).')
parser.add_argument('--show-kept','--show-kept-ifgram', dest='plot_drop_ifgram', action='store_false',
help='display kept interferograms only, without dropped interferograms')
parser.add_argument('--noverbose', dest='print_msg', action='store_false',
help='Disable the verbose message printing (default: %(default)s).')
parser.add_argument('--math', dest='math_operation', choices={'square','sqrt','reverse','inverse','rad2deg','deg2rad'},
help='Apply the math operation before displaying [for single subplot ONLY].\n'
'E.g. plot the std. dev. of the variance file.\n'
' square = x^2\n'
' sqrt = x^1/2\n'
' reverse = x * -1\n'
' inverse = 1 / x')
parser = arg_utils.add_data_disp_argument(parser)
parser = arg_utils.add_dem_argument(parser)
parser = arg_utils.add_figure_argument(parser)
parser = arg_utils.add_gnss_argument(parser)
parser = arg_utils.add_mask_argument(parser)
parser = arg_utils.add_map_argument(parser)
parser = arg_utils.add_memory_argument(parser)
parser = arg_utils.add_point_argument(parser)
parser = arg_utils.add_reference_argument(parser)
parser = arg_utils.add_save_argument(parser)
parser = arg_utils.add_subset_argument(parser)
return parser
def cmd_line_parse(iargs=None):
"""Command line parser."""
# parse
parser = create_parser()
inps = parser.parse_args(args=iargs)
# import
from mintpy.utils import ptime, readfile
# save argv (to check the manually specified arguments)
# use iargs for python call
# use sys.argv[1:] for command line call
inps.argv = iargs or sys.argv[1:]
# check: invalid file inputs
for key in ['file','dem_file','mask_file','pts_file']:
fname = vars(inps)[key]
if fname not in [None, 'no'] and not os.path.isfile(fname):
raise FileNotFoundError(f'input {key} file {fname} NOT exist!')
# check: --exclude option
if inps.exDsetList:
inps.exDsetList = ptime.read_date_list(inps.exDsetList)
# check: coupled option behaviors
if not inps.save_fig and (inps.outfile or not inps.disp_fig):
# turn ON save_fig if a) --output OR b) figure not shown
inps.save_fig = True
if inps.lalo_step:
inps.lalo_label = True
if inps.zero_mask:
# turn OFF default mask file detection for --zero-mask
# extra manual mask file is still supported
if not inps.mask_file:
inps.mask_file = 'no'
if not inps.disp_whitespace:
inps.disp_axis = False
inps.disp_title = False
inps.disp_cbar = False
if not inps.disp_axis:
inps.disp_tick = False
if inps.flip_lr or inps.flip_ud:
inps.auto_flip = False
if inps.disp_dem_blend:
inps.disp_dem_shade = False
# --dem-blend option requires --dem option
if inps.dem_file is None:
parser.error("--dem-blend requires -d/-dem.")
# --cbar-ext option is ignored
if '--cbar-ext' in inps.argv:
print('WARNING: --cbar-ext is NOT compatible with --dem-blend, ignore --cbar-ext and continue.')
# check: conflicted options (geo-only options if inpput file is in radar-coordinates)
geo_opt_names = ['--coord', '--show-gnss', '--coastline', '--lalo-label', '--lalo-step', '--scalebar', '--faultline']
geo_opt_names = list(set(geo_opt_names) & set(inps.argv))
if geo_opt_names and 'Y_FIRST' not in readfile.read_attribute(inps.file).keys():
for opt_name in geo_opt_names:
print(f'WARNING: {opt_name} is NOT supported for files in radar-coordinate, ignore it and continue.')
# check: --noverbose option
# print view.py command line if --noverbose (used in smallbaselineApp.py)
if not inps.print_msg:
print('view.py', ' '.join(inps.argv))
return inps
######################################### Main Function ########################################
def main(iargs=None):
# parse
inps = cmd_line_parse(iargs)
# import
from mintpy.view import viewer
# run
obj = viewer(iargs=iargs)
obj.configure(inps)
if obj.flag == 'run':
obj.plot()
##################################################################################################
if __name__ == '__main__':
main(sys.argv[1:])
MintPy-1.6.2/src/mintpy/closure_phase_bias.py 0000664 0000000 0000000 00000132336 15032632755 0021273 0 ustar 00root root 0000000 0000000 ############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Yujie Zheng, Zhang Yunjun, Feb 2022 #
############################################################
# Recommend import:
# from mintpy import closure_phase_bias as cpbias
import glob
import os
import time
from datetime import datetime as dt
import numpy as np
from mintpy.ifgram_inversion import estimate_timeseries
from mintpy.objects import cluster, ifgramStack
from mintpy.utils import isce_utils, ptime, readfile, utils as ut, writefile
################################# Mask #######################################
def calc_closure_phase_mask(stack_file, bias_free_conn, num_sigma=3, threshold_amp=0.3,
outdir='./', max_memory=4.0):
"""Calculate a mask for areas susceptible to biases, based on the average closure phase tau.
Equation: tau = 1 / K * Sigma_{k=1}^K (np.exp(j * Phi_k^{nl}))
where K is the number of closure phase for connection nl, Phi_k^{nl} is the k-th sequential
closure phase for connection nl, as defined in equation (21).
Reference: Section VI in Zheng et al. (2022, TGRS).
Parameters: stack_file - str, path for ifgramStack.h5 file
bias_free_conn - int, connection level at which we assume is bias-free
num_sigma - float, number of sigmas for computing phase threshold
threshold_amp - float, threshold of ampliutde of the cumulative sequential closure phase
outdir - str, directory of output files
max_mermory - float, maximum memory in GB for each patch processed
Returns: mask - 2D np.ndarray of size (length, width) in boolean, 0 for areas susceptible to biases.
Saved to file: maskClosurePhase.h5
avg_cp - 2D np.ndarray of size (length, width) in complex64, average cum. seq. closure phase
Saved to file: avgCpxClosurePhase.h5
"""
# basic info
stack_obj = ifgramStack(stack_file)
stack_obj.open(print_msg=False)
meta = dict(stack_obj.metadata)
length, width = stack_obj.length, stack_obj.width
date_list = stack_obj.get_date_list(dropIfgram=True)
num_cp = stack_obj.get_closure_phase_index(bias_free_conn).shape[0]
## What is a good thredshold?
# Assume that it's pure noise so that the phase is uniform distributed from -pi to pi.
# The standard deviation of phase in each loop is:
# pi/sqrt(3)
# (technically should be smaller because when forming loops there should be a reduction in phase variance)
# The standard deviation of phase in cumulative wrapped closure phase is:
# pi/sqrt(3)/sqrt(num_cp) -- again another simplification assuming no correlation.
# We use 3\delta as threshold -- 99.7% confidence
threshold_pha = np.pi / np.sqrt(3 * num_cp) * num_sigma
# key info
print('\n'+'-'*80)
print('calculating the mask to flag areas susceptible to non-closure-phase related biases (as zero) ...')
print(f'number of valid acquisitions: {len(date_list)} ({date_list[0]} - {date_list[-1]})')
print(f'average complex closure phase threshold in amplitude/correlation: {threshold_amp}')
print(f'average complex closure phase threshold in phase: {num_sigma} sigma ({threshold_pha:.1f} rad)')
# calculate the average complex closure phase
# process block-by-block to save memory
print('\ncalculating the average complex closure phase')
print(f'length / width: {length} / {width}')
box_list, num_box = stack_obj.split2boxes(max_memory=max_memory, dim0_size=stack_obj.numIfgram+num_cp*2)
avg_cp = np.zeros([length,width], dtype=np.complex64)
for i, box in enumerate(box_list):
if num_box > 1:
print(f'\n------- processing patch {i+1} out of {num_box} --------------')
print(f'box: {box}')
print(f'box width: {box[2] - box[0]}')
print(f'box length: {box[3] - box[1]}')
avg_cp[box[1]:box[3], box[0]:box[2]], num_cp = stack_obj.get_sequential_closure_phase(
box=box,
conn=bias_free_conn,
post_proc='mean',
)[1:]
# mask out no-data pixels
geom_file = 'geometryGeo.h5' if 'Y_FIRST' in meta.keys() else 'geometryRadar.h5'
geom_file = os.path.join(os.path.dirname(stack_file), geom_file)
if os.path.isfile(geom_file):
geom_ds_names = readfile.get_dataset_list(geom_file)
ds_names = [x for x in ['incidenceAngle', 'waterMask'] if x in geom_ds_names]
if len(ds_names) > 0:
print(f'mask out pixels with no-data-value (zero {ds_names[0]} from file: {os.path.basename(geom_file)})')
no_data_mask = readfile.read(geom_file, datasetName=ds_names[0])[0] == 0
avg_cp[no_data_mask] = np.nan
# create mask
print('\ncreate mask for areas susceptible to non-closure phase biases')
mask = np.ones([length,width], dtype=bool)
# mask areas with potential bias
print(f'set pixels with average complex closure phase angle > {num_sigma} sigma ({threshold_pha:.1f} rad) to 0.')
mask[np.abs(np.angle(avg_cp)) > threshold_pha] = 0
# unmask areas with low correlation
# where it's hard to know whether there is bias or not
print(f'set pixels with average complex closure phase amplitude (correlation) < {threshold_amp} to 1.')
mask[np.abs(np.abs(avg_cp) < threshold_amp)] = 1
# write file 1 - mask
mask_file = os.path.join(outdir, 'maskClosurePhase.h5')
meta['FILE_TYPE'] = 'mask'
meta['DATA_TYPE'] = 'bool'
writefile.write(mask, out_file=mask_file, metadata=meta)
# write file 2 - average closure phase
avg_cp_file = os.path.join(outdir, 'avgCpxClosurePhase.h5')
meta['FILE_TYPE'] = 'mask'
meta['DATA_TYPE'] = 'float32'
ds_dict = {
'amplitude' : np.abs(avg_cp),
'phase' : np.angle(avg_cp),
}
writefile.write(ds_dict, out_file=avg_cp_file, metadata=meta)
return mask, avg_cp
################################################################################
def unwrap_closure_phase(int_file, cor_file, unw_file):
"""Unwrap the input wrapped sequential closure phase interferogram.
"""
if os.path.isfile(cor_file) and os.path.isfile(unw_file):
print(f'unwrapped interferogram file exists: {unw_file}, skip re-unwrapping.')
else:
isce_utils.estimate_coherence(int_file, cor_file)
isce_utils.unwrap_snaphu(int_file, cor_file, unw_file)
return unw_file
def cum_seq_unw_closure_phase_timeseries(conn, conn_dir, date_list, meta):
'''Output cumulative conn-n sequential closure phase in time-series format,
which is the weighted phase history of the temporally inconsistent process (f^n / n_l).
Reference: Equation (25) and (28) in Zheng et al. (2022, TGRS).
Parameters: conn - int, connection level of closure phases
conn_dir - str, path of sequential closure phases file for connection - n
date_list - list of str, SLC dates
meta - dict, metadata of ifgramStack.h5
Returns: bias_ts - 3D np.ndarray in size of (num_ifgram, length, width) in float32,
cumulative sequential closure phase time series,
saved to file: cumSeqClosurePhase.h5
common_mask - 2D np.ndarray in size of (length, width) in bool,
mask based on common connected components,
saved to file: maskConnComp.h5
'''
# output file
cum_cp_file = os.path.join(conn_dir, 'cumSeqClosurePhase.h5')
mask_file = os.path.join(conn_dir, 'maskConnComp.h5')
# update mode checking
if os.path.isfile(cum_cp_file) and os.path.isfile(mask_file):
msg = 'cumulative seq closure phase time series and mask files exist, skip re-generating.'
msg += f'\n{cum_cp_file}\n{mask_file}'
print(msg)
# read data
bias_ts = readfile.read(cum_cp_file)[0]
common_mask = readfile.read(mask_file)[0]
return bias_ts, common_mask
# basic info
length, width = int(meta['LENGTH']), int(meta['WIDTH'])
ref_y, ref_x = int(meta['REF_Y']), int(meta['REF_X'])
unw_files = sorted(glob.glob(os.path.join(conn_dir, '*.unw')))
num_file = len(unw_files)
print('calculate the cumulative seq closure phase time series ...')
cp_phase = np.zeros((num_file, length, width), dtype=np.float32)
mask = np.zeros((num_file, length, width), dtype=np.float32)
prog_bar = ptime.progressBar(maxValue=num_file)
for i, unw_file in enumerate(unw_files):
prog_bar.update(i+1, suffix=f'{i+1}/{num_file} {os.path.basename(unw_file)}')
unw = readfile.read(unw_file, datasetName='phase')[0]
unw -= unw[ref_y, ref_x]
cp_phase[i] = unw
conn_comp_file = unw_file + '.conncomp'
conn_comp = readfile.read(conn_comp_file)[0]
mask[i] = np.where(conn_comp >= 1, 1, np.nan)
prog_bar.close()
# compute cumulative sequential closure phase - f^n
# equation (25) in Zheng et al. (2022, TGRS)
num_date = len(date_list)
bias_ts = np.zeros((num_date, length, width), dtype=np.float32)
bias_ts[1:num_date-conn+1, :, :] = np.cumsum(cp_phase, 0)
for i in range(num_date-conn+1, num_date):
bias_ts[i] = (i - num_date + conn) * cp_phase[-1] + bias_ts[num_date - conn]
# equation (28)
bias_ts /= conn
# write bias time series to HDF5 file
ds_dict = {
'timeseries' : [np.float32, (num_date, length, width), bias_ts],
'date' : [np.dtype('S8'), (num_date,), np.array(date_list, np.bytes_)],
}
meta['FILE_TYPE'] = 'timeseries'
writefile.layout_hdf5(cum_cp_file, ds_dict, metadata=meta)
# write mask to HDF5 file
common_mask = np.where(np.isnan(np.sum(mask,0)), False, True)
meta['FILE_TYPE'] = 'mask'
writefile.write(common_mask, out_file=mask_file, metadata=meta)
return bias_ts, common_mask
def compute_unwrap_closure_phase(stack_file, conn, num_worker=1, outdir='./', max_memory=4.0):
'''Compute the following phase stack & time-series of connection-conn:
+ wrapped seq closure phase stack
+ unwrapped seq closure phase stack
+ cumulative unwrapped seq closure phase time-series
at directory: outdir/closurePhase/conn{conn}
Parameters: stack_file - str, path for ifgramStack.h5
conn - int, connection level
max_mermory - float, maximum memory in GB for each patch processed
outdir - str, path for output files
'''
# output directory
conn_dir = os.path.join(outdir, f'closurePhase/conn{conn}')
os.makedirs(conn_dir, exist_ok=True)
# update mode checking
cum_cp_file = os.path.join(conn_dir, 'cumSeqClosurePhase.h5')
if os.path.isfile(cum_cp_file):
print(f'cumulative unwrapped seq closure phase time-series exists at: {cum_cp_file}, skip re-generating.')
return
print('-'*60)
print('step 1/3: calculate and filter the wrapped sequential closure phase stack ...')
# basic info
stack_obj = ifgramStack(stack_file)
stack_obj.open()
length, width = stack_obj.length, stack_obj.width
meta = dict(stack_obj.metadata)
print(f'scene size: {length} x {width}')
date_list = stack_obj.get_date_list(dropIfgram=True)
num_date = len(date_list)
print(f'number of acquisitions found: {num_date}')
print(f'start / end date: {date_list[0]} / {date_list[-1]}')
# number of expected closure phase
num_cp = num_date - conn
num_digit = len(str(num_cp))
## default output binary filenames
fbases = [os.path.join(conn_dir, f'filt_{x+1:0{num_digit}}') for x in range(num_cp)]
int_files = [f'{x}.int' for x in fbases]
cor_files = [f'{x}.cor' for x in fbases]
unw_files = [f'{x}.unw' for x in fbases]
if all(os.path.isfile(x) for x in int_files):
print('ALL the filtered closure phase file exist, skip re-generation.')
else:
# process block-by-block
# split igram_file into blocks to save memory
box_list, num_box = stack_obj.split2boxes(max_memory=max_memory,
dim0_size=stack_obj.numIfgram+num_cp*2)
closure_phase = np.zeros([num_cp, length, width],np.float32)
for i, box in enumerate(box_list):
print(box)
if num_box > 1:
print(f'\n------- processing patch {i+1} out of {num_box} --------------')
print(f'box length: {box[3] - box[1]}')
print(f'box width : {box[2] - box[0]}')
closure_phase[:, box[1]:box[3], box[0]:box[2]] = stack_obj.get_sequential_closure_phase(
box=box,
conn=conn,
)[0]
## filter the closure phase and re-unwrap
print('-'*80)
print('filter the wrapped closure phase stack with a Gaussian kernel of 5 x 5 ...')
print(f'number of wrapped closure phase: {num_cp}')
kernel = isce_utils.gaussian_kernel(5, 5, 1, 1)
for i, int_file in enumerate(int_files):
if not os.path.isfile(int_file):
# filter the closure phase interferogram
closure_phase_filt = isce_utils.convolve(
data=np.exp(1j*closure_phase[i]),
kernel=kernel,
).astype(np.complex64)
# write to binary file in isce2 format
print(f'write file: {int_file}')
with open(int_file, mode='wb') as fid:
closure_phase_filt.tofile(fid)
# write metadata in isce2/roipac format
meta['FILE_TYPE'] = '.int'
meta['INTERLEAVE'] = 'BIP'
meta['DATA_TYPE'] = 'complex64'
meta['BANDS'] = 1
writefile.write_isce_xml(meta, int_file)
writefile.write_roipac_rsc(meta, int_file+'.rsc')
del closure_phase
print('-'*60)
print('step 2/3: unwrap the filtered wrapped closure phase stack ...')
print(f'number of closure phase: {num_cp}')
if all(os.path.isfile(x) for x in unw_files):
print('ALL the unwrapped closure phase file exist, skip re-generation.')
else:
num_core, run_parallel, Parallel, delayed = ut.check_parallel(
num_cp,
print_msg=False,
maxParallelNum=num_worker)
if run_parallel and num_core > 1:
print(f'parallel processing using {num_core} cores')
Parallel(n_jobs=num_core)(delayed(unwrap_closure_phase)(x, y, z)
for x, y, z in zip(int_files, cor_files, unw_files))
else:
for x, y, z in zip(int_files, cor_files, unw_files):
unwrap_closure_phase(x, y, z)
## calc the cumulativev unwrapped closure phase time-series
print('-'*60)
print('step 3/3: calculate the unwrapped cumulative sequential closure phase time-series ...')
print(' Note that a reference point in the ifgramStack.h5 (as attributes "REF_Y/X") is needed to continue. ')
print(' A good reference point should be a pixel that has good temporal coherence and no bias.')
cum_seq_unw_closure_phase_timeseries(conn, conn_dir, date_list, meta)
return
################################################################################
def read_cum_seq_closure_phase4conn(conn, outdir='./', box=None, print_msg=False):
'''Read cumulative sequential closure phase from individual closure phase directory.
Reference: Eq. (25) in Zheng et al. (2022).
Parameters: conn - integer, connection level of sequential closure phases
outdir - string, directory of conn{n}_cumSeqClosurePhase.h5
box - list in size of (4,) in integer, coordinates of bounding box
Returns: bias_ts - 3D array in size of (num_date, box_lengh, box_wid) in float,
cumulative sequential closure phases
'''
cum_cp_file = os.path.join(outdir, f'closurePhase/conn{conn}/cumSeqClosurePhase.h5')
if print_msg:
print(f'read timeseries from file: {cum_cp_file}')
bias_ts = readfile.read(cum_cp_file, box=box, print_msg=False)[0]
return bias_ts
def estimate_wratio(tbase, conn, bias_free_conn, wvl, box, outdir='./', mask=False):
'''Estimate W_r & velocity bias for the given connection level.
W_r is the M x M diagonal matrix with W_r(ii) = w(i*delta_t) / w(delta_t), i = 1,2,...,M.
This is defined in Equation (20), to be used for bias estimation; and can be calculated from
the weighted phase history (cumulative seq closure phase) based on Equation (29).
Parameters: tbase - list(float) or array, in size of (num_date), time in accumulated years
conn - integer, connection-level
bias_free_conn - integer, minimum connection-level that we think is bias-free
wvl - float, wavelength
box - list in size of (4,) in integer, coordinates of bounding box
outdir - str, the working directory
mask - bool, whether to mask out areas with average bias velocity less than 1 mm/year
Returns: wratio_connN - 2D np.ndarray of size (box_len, box_wid) in float32, W_r of the input connection level
vel_bias_connN - 2D np.ndarray of size (box_len, box_wid) in float32, velocity bias of the input connection level
'''
delta_t = tbase[-1] - tbase[0]
phase2range = -1 * wvl / (4 * np.pi)
# cum/vel_bias at bias free connection level
cum_bias_connF = read_cum_seq_closure_phase4conn(bias_free_conn, outdir, box)[-1,:,:]
vel_bias_connF = cum_bias_connF / delta_t * phase2range
# calc wratio at input connection level
box_wid = box[2] - box[0]
box_len = box[3] - box[1]
wratio_connN = np.ones([box_len, box_wid], dtype=np.float32)
if conn > 1:
cum_bias_connN = read_cum_seq_closure_phase4conn(conn, outdir, box)[-1,:,:]
# skip invalid pixels
flag = np.multiply(~np.isnan(cum_bias_connF), cum_bias_connF != 0)
# Equation (29)
wratio_connN[flag] = 1 - cum_bias_connN[flag] / cum_bias_connF[flag]
# bound within [0, 1]
wratio_connN[wratio_connN > 1] = 1
wratio_connN[wratio_connN < 0] = 0
else:
cum_bias_connN = None
# vel_bias at input connection level
vel_bias_connN = np.multiply(wratio_connN, vel_bias_connF)
if mask:
# if average velocity smaller than 1 mm/year (hardcoded here), mask out for better visual
# this option is only turned on while outputting wratio.h5 file.
wratio_connN[abs(vel_bias_connF) < 0.001] = np.nan
# debug mode
debug_mode = False
if debug_mode:
from matplotlib import pyplot as plt
data_list = [wratio_connN, vel_bias_connN, cum_bias_connN,
None, vel_bias_connF, cum_bias_connF]
titles = ['w_ratio', f'bias_vel_{conn}', f'bias_{conn}',
None, 'bias_vel_F', 'bias_F']
fig, axs = plt.subplots(nrows=2, ncols=3, figsize=[12, 6])
for ax, data, title in zip(axs.flatten(), data_list, titles):
if data is not None:
im = ax.imshow(data, cmap='jet', interpolation='nearest')
ax.set_title(title)
fig.colorbar(im, ax=ax)
else:
ax.axis('off')
fig.tight_layout()
plt.show()
return wratio_connN, vel_bias_connN
def estimate_wratio_all(bw, bias_free_conn, outdir, box):
'''Estimate diaginal matrix W_r for all connections levels within the given bandwidth.
Parameters: bias_free_conn - integer, minimum connection-level that we think is bias-free
bw - integer, bandwidth of given time-sereis analysis
box - list in size of (4,) in integer, coordinates of bounding box
outdir - string, the working directory
Returns: wratio - 3D array in size of (bw+1, length, width) in float32,
the first slice (w[0,:,:]) is a padding
to ensure that wratio[n,:,:] = w(n * delta_t) / w(delta_t).
'''
box_wid = box[2] - box[0]
box_len = box[3] - box[1]
cum_bias_connF = read_cum_seq_closure_phase4conn(bias_free_conn, outdir, box)[-1,:,:]
# skip invalid pixels
flag = np.multiply(~np.isnan(cum_bias_connF), cum_bias_connF != 0)
wratio = np.ones([bw+1, box_len, box_wid], dtype=np.float32)
for n in np.arange(2, bw+1):
cum_bias_connN = read_cum_seq_closure_phase4conn(n, outdir, box)[-1,:,:]
wratio[n,flag] = 1 - cum_bias_connN[flag] / cum_bias_connF[flag]
# bound into [0, 1]
wratio[wratio > 1] = 1
wratio[wratio < 0] = 0
return wratio
def get_avg_time_span_within_bandwidth(date_ordinal, bw):
'''Compute average temporal span (days) for all interferogram within the given bandwidth
Parameters: date_ordinal - list of size (num_date,) in integer, time in days
bw - integer, bandwidth of time-series analysis
Return: avg_time - float, average time-span in days
'''
avg_time = 0
num_ifgram = 0
for level in range(1, bw+1):
slc_date_firstN = date_ordinal[0:level]
slc_date_lastN = date_ordinal[-level:]
for i in range(level):
avg_time += slc_date_lastN[i] - slc_date_firstN[i]
num_ifgram += len(date_ordinal) - level
avg_time /= num_ifgram
return avg_time
def get_avg_time_span4conn(date_ordinal, conn):
'''Compute the average temporal span (days) for connection-n interferograms
Parameters: date_ordinal - list of size (num_date,) in integer, time in days
conn - int, connection level of interferograms
Return: avg_time - float, average time-span in days
'''
slc_date_firstN = date_ordinal[0:conn]
slc_date_lastN = date_ordinal[-conn:]
avg_time = 0
for i in range(conn):
avg_time += slc_date_lastN[i] - slc_date_firstN[i]
num_ifgram = len(date_ordinal) - conn
avg_time /= num_ifgram
return avg_time
def estimate_bias_timeseries_approx_patch(bias_free_conn, bw, tbase, date_ordinal, wvl, box, outdir):
'''Quick and approximate estimate of the bias time-series of a certain bandwidth (bw) for a bounding box
Note: This estimate is not exact, but often close enough.
It is good for a quick estimate to see how big the biases are.
Parameters: bias_free_conn - integer, connection level that we assume bias-free
bw - integer, bandwidth of the given time-series analysis
tbase - 1D np.ndarray in size of (num_date,) in float, time in accumulated years
date_ordinal - list of size (num_date,) in integer, time in days
wvl - float, wavelength of the SAR system
box - list in size of (4,) in integer, coordinates of bounding box
outdir - string, directory for outputting files
Returns: bias_ts - 3D array in size of (num_date, box_len, box_wid) in float, bias timeseries
'''
print('\n'+'-'*60)
print(f'quick and approximate estimation of bias time series for bandwidth = {bw}')
# basic info
phase2range = -1 * wvl / (4 * np.pi)
num_date = tbase.size
# average temporal span for ifgrams of connection-1 to connection-bw
deltat_n = np.asarray([get_avg_time_span4conn(date_ordinal, n) for n in range(1, bw+1)])
avg_time_span = get_avg_time_span_within_bandwidth(date_ordinal, bw)
# the bias in a bandwidth-bw analysis is similar to bias in connectoin-p interferograms
p = (np.abs(deltat_n - avg_time_span)).argmin() + 1
print(f'average connection level within the bandwidth = {p}')
# get wratio
kwargs1 = dict(
bias_free_conn=bias_free_conn,
wvl=wvl,
box=box,
outdir=outdir,
)
wratio_p = estimate_wratio(tbase, conn=p, **kwargs1)[0]
wratio_2 = estimate_wratio(tbase, conn=2, **kwargs1)[0]
wratio_p[np.isnan(wratio_p)] = 0
wratio_2[np.isnan(wratio_2)] = 0
wratio_2[abs(wratio_2 - 1) < 0.1] = np.nan
ratio_p2 = wratio_p / (1 - wratio_2)
# get bias_ts
kwargs2 = dict(outdir=outdir, box=box, print_msg=True)
bias_ts = read_cum_seq_closure_phase4conn(2, **kwargs2) * phase2range
bias_ts_bf = read_cum_seq_closure_phase4conn(bias_free_conn, **kwargs2) * phase2range
for i in range(num_date):
bias_ts[i,:,:] *= ratio_p2
bias_ts_bf[i,:,:] *= wratio_p
flag = np.isnan(bias_ts)
bias_ts[flag] = bias_ts_bf[flag]
return bias_ts
def estimate_bias_timeseries_approx(stack_file, bias_free_conn, bw, water_mask_file=None, outdir='./', max_memory=4.0):
'''Quick & approximate estimation of the bias time series and Wr.
Reference: Eq. (20) in Zheng et al. (2022, TGRS).
Parameters: stack_file - string, path for ifgramStack.h5
bias_free_conn - integer, connection level at which we assume is bias-free
bw - integer, bandwidth of the given time-series.
wvl - float, wavelength of the SAR System
outdir - str, directory for output files
max_mermory - float, maximum memory in GB for each patch processed
Returns: bias_ts_file - str, path to the HDF5 file for the approximate bias time series in (num_date, length, width)
wratio_file - str, path to the HDF5 file for the wratio and bias velocity in (bw, length, width)
Shows how fast the bias-inducing signal decays with temporal baseline.
'''
print('\n'+'-'*80)
print(f'quick estimation of the non-closure phase bias time-series for bandwidth={bw} (Zheng et al., 2022) ...')
stack_obj = ifgramStack(stack_file)
stack_obj.open()
length, width = stack_obj.length, stack_obj.width
meta = dict(stack_obj.metadata)
wvl = float(meta['WAVELENGTH'])
# time info
date_list = stack_obj.get_date_list(dropIfgram=True)
num_date = len(date_list)
tbase = np.array(ptime.date_list2tbase(date_list)[0], dtype=np.float32) / 365.25
date_str_fmt = ptime.get_date_str_format(date_list[0])
date_ordinal = [dt.strptime(x, date_str_fmt).toordinal() for x in date_list]
# split igram_file into blocks to save memory
box_list, num_box = stack_obj.split2boxes(max_memory=max_memory, dim0_size=num_date)
# initiate output files
# 1 - wratio file
wratio_file = os.path.join(outdir, 'wratio.h5')
meta['FILE_TYPE'] = 'wratio'
meta['DATA_TYPE'] = 'float32'
meta['UNIT'] = '1'
ds_name_dict = {
'wratio' : [np.float32, (bw, length, width), None],
'velocityBias' : [np.float32, (bw, length, width), None],
}
ds_unit_dict = {
'wratio' : '1',
'velocityBias' : 'm/year',
}
writefile.layout_hdf5(wratio_file, ds_name_dict, metadata=meta, ds_unit_dict=ds_unit_dict)
# 2 - time series file
bias_ts_file = os.path.join(outdir, 'timeseriesBiasApprox.h5')
meta['FILE_TYPE'] = 'timeseries'
meta['UNIT'] = 'm'
ds_name_dict = {
'timeseries' : [np.float32, (num_date, length, width), None],
'date' : [np.dtype('S8'), (num_date,), np.array(date_list, np.bytes_)],
}
writefile.layout_hdf5(bias_ts_file, ds_name_dict, meta)
# process block-by-block
for i, box in enumerate(box_list):
box_wid = box[2] - box[0]
box_len = box[3] - box[1]
print(box)
if num_box > 1:
print(f'\n------- processing patch {i+1} out of {num_box} --------------')
print(f'box width: {box_wid}')
print(f'box length: {box_len}')
# read water mask
if water_mask_file:
print(f'skip pixels on water (zero value from file: {os.path.basename(water_mask_file)})')
water_mask = readfile.read(water_mask_file, box=box)[0]
else:
water_mask_file = None
# 1 - estimate the wratio(_velocity)
wratio = np.zeros([bw, box_len, box_wid], dtype=np.float32)
bias_vel = np.zeros([bw, box_len, box_wid], dtype=np.float32)
for j in range(bw):
print(f'estimation W_ratio for connection level: {j+1}')
wratio[j, :, :], bias_vel[j, :, :] = estimate_wratio(
tbase,
conn=j+1,
bias_free_conn=bias_free_conn,
wvl=wvl,
box=box,
outdir=outdir,
mask=True)
if water_mask_file:
wratio[:, water_mask==0] = np.nan
bias_vel[:, water_mask==0] = np.nan
# write the block to disk
block = [0, bw, box[1], box[3], box[0], box[2]]
writefile.write_hdf5_block(
wratio_file,
data=wratio,
datasetName='wratio',
block=block)
writefile.write_hdf5_block(
wratio_file,
data=bias_vel,
datasetName='velocityBias',
block=block)
# 2 - estimate the bias time series
bias_ts = estimate_bias_timeseries_approx_patch(
bias_free_conn=bias_free_conn,
bw=bw,
tbase=tbase,
date_ordinal=date_ordinal,
wvl=wvl,
box=box,
outdir=outdir)
if water_mask_file:
bias_ts[:, water_mask==0] = np.nan
# write the block to disk
block = [0, len(date_list), box[1], box[3], box[0], box[2]]
writefile.write_hdf5_block(
bias_ts_file,
data=bias_ts,
datasetName='timeseries',
block=block)
return bias_ts_file, wratio_file
################################################################################
def bandwidth2num_ifgram(bw, num_date):
'''Get the number of interferograms for the network with the given bandwidth.
Reference: Equation (15) in Zheng et al. (2022)
Parameters: bw - int, bandwidth
num_date - int, number of acquisitions
Returns: num_ifgram - int, number of interferograms
'''
return int(bw * (num_date * 2 - bw - 1) / 2)
def get_design_matrix_Wr(date12_list, bw, box, bias_free_conn, outdir='./'):
'''Computes the matrix W_r for a given bounding box, following Equation (20).
Parameters: date12_list - list(str), interfeorgram pairs list in YYYYMMDD_YYYYMMDD
bw - integer, bandwidth of time-series analysis
bias_free_conn - integer, minimum connection-level that we think is bias-free
box - list in size of (4,) in integer, coordinates of bounding box
outdir - string, the working directory
Returns: Wr - 2D np.ndarray in size of (num_ifgram, num_pix) in float32,
each row stores the diagnal component of W (Eq. 16 in Zheng et al., 2022) for one pixel.
A - 2D np.ndarray in size of (num_ifgram, num_date) in float32
'''
# get design matrix A
A = ifgramStack.get_design_matrix4timeseries(date12_list=date12_list, refDate='no')[0]
num_ifgram = A.shape[0]
# get w(delta_t) * phi^x - section VI-A
wratio_all = estimate_wratio_all(bw, bias_free_conn, outdir, box)
# initial output value
num_pix = (box[2] - box[0]) * (box[3] - box[1])
Wr = np.zeros((num_ifgram, num_pix), dtype=np.float32)
for i in range(num_ifgram):
# get the connection level
Aline = list(A[i,:])
idx1 = Aline.index(-1)
idx2 = Aline.index(1)
conn = idx2 - idx1
if conn > bw:
print('Existing max-conn-level > the input bandwidth, '
'use modify_network.py inputs/ifgramStack.h5 to adjust the max-conn-level.')
# assign to Wr matrix
Wr[i, :] = wratio_all[conn, :, :].reshape(-1)
return Wr, A
def estimate_bias_timeseries_patch(stack_file, bias_free_conn, bw, wvl, box, water_mask_file=None, outdir='./'):
'''Estimate the bias time-series of a certain bandwidth (bw) for a bounding box.
Reference: Zheng et al. (2022, TGRS).
Parameters: stack_file - string, path for ifgramStack.h5
bias_free_conn - integer, connection level at which we assume is bias-free
bw - integer, bandwidth of the given time-series.
wvl - float, wavelength of the SAR System
box - list in size of (4,) in integer, coordinates of bounding box
outdir - string, directory for output files
Returns: bias_ts_bwn - 3D array of size (bw, box_len, box_wid) of float, estimated bias time-series
box - list in size of (4,) in integer, coordinates of bounding box, output for parallel computing
'''
phase2range = -1 * wvl / (4 * np.pi)
box_wid, box_len = box[2] - box[0], box[3] - box[1]
num_pix = box_wid * box_len
stack_obj = ifgramStack(stack_file)
stack_obj.open(print_msg=False)
date12_list = stack_obj.get_date12_list(dropIfgram=True)
num_ifgram = len(date12_list)
# time info
date_list = stack_obj.get_date_list(dropIfgram=True)
num_date = len(date_list)
# tbase in the unit of years
tbase = np.array(ptime.date_list2tbase(date_list)[0], dtype=np.float32) / 365.25
tbase_diff = np.diff(tbase).reshape(-1,1)
## mask of pixels to invert
mask = np.ones(num_pix, dtype=np.bool_)
# water mask
if water_mask_file and os.path.isfile(water_mask_file):
print(f'skip pixels (on the water) with zero value in file: {os.path.basename(water_mask_file)}')
water_mask = readfile.read(water_mask_file, box=box)[0].flatten()
mask *= np.array(water_mask, dtype=np.bool_)
del water_mask
else:
water_mask_file = None
# invert pixels on mask(s)
num_pix2inv = int(np.sum(mask))
idx_pix2inv = np.where(mask)[0]
print('number of pixels to invert: {} out of {} ({:.1f}%)'.format(
num_pix2inv, num_pix, num_pix2inv/num_pix*100))
## 1. get bias time-series for bw-1 analysis
kwargs = dict(outdir=outdir, box=box, print_msg=True)
bias_ts_bw1_rough = read_cum_seq_closure_phase4conn(bias_free_conn, **kwargs).reshape(num_date, -1)
bias_ts_bw1_fine = read_cum_seq_closure_phase4conn(2, **kwargs).reshape(num_date, -1)
bias_vel_bw1 = bias_ts_bw1_fine[-1,:] * phase2range / (tbase[-1] - tbase[0])
flag = np.where(np.abs(bias_vel_bw1) < 0.001, 0, 1).astype(np.bool_)
num_pix_less, num_pix_more = np.sum(flag[mask]), np.sum(~flag[mask])
digit = len(str(num_pix))
msg = 'number of pixels with bandwidth=1 velocity bias '
msg += f'< | >= 0.1 mm/yr: {num_pix_less:{digit}d} | {num_pix_more:{digit}d} out of {num_pix} '
msg += f'({num_pix_less/num_pix*100:.0f}% | {num_pix_less/num_pix*100:.0f}%)'
print(msg)
# scale bias_ts_bw1_fine based on bias_ts_bw1_rough
r2f_flag = np.multiply(~np.isnan(bias_ts_bw1_fine[-1,:]), bias_ts_bw1_fine[-1,:] != 0)
r2f_scale = np.ones((num_pix), dtype=np.float32)
r2f_scale[r2f_flag] = bias_ts_bw1_rough[-1,r2f_flag] / bias_ts_bw1_fine[-1,r2f_flag]
for i in range(num_date):
bias_ts_bw1_fine[i,:] *= r2f_scale
del r2f_flag, r2f_scale
# 2. construct bias_stack = W * A * Phi^X = Wr * A * w(delta_t) * Phi^X
# Equation (20) in Zheng et al. (2022, TGRS)
# this matrix is a num_pix by num_ifgram matrix, each row stores the diagnal component of the Wr matrix for that pixel
print('estimating bias_stack = Wr * A * w(delta_t) * Phi^X (Zheng et al., 2022, TGRS) ...')
Wr, A = get_design_matrix_Wr(date12_list, bw, box, bias_free_conn, outdir)
wPhi_x = np.array(bias_ts_bw1_rough, dtype=np.float32)
wPhi_x[:, flag] = bias_ts_bw1_fine[:, flag]
bias_stack = np.zeros((num_ifgram, num_pix), dtype=np.float32)
prog_bar = ptime.progressBar(maxValue=num_pix2inv)
for i in range(num_pix2inv):
idx = idx_pix2inv[i]
# calculate the bias_stack = W * A * phi^x = W^r * A * w(delta_t) * phi^x
bias_stack[:, idx] = np.linalg.multi_dot([np.diag(Wr[:, idx]), A, wPhi_x[:, idx]]).flatten()
prog_bar.update(i+1, every=3000, suffix=f'{i+1}/{num_pix2inv} pixels')
prog_bar.close()
del bias_ts_bw1_rough, bias_ts_bw1_fine, wPhi_x, Wr
# 3. estimate bias time-series from bias stack: bias_ts = A+ * bias_stack
# Equation (20) in Zheng et al. (2022, TGRS)
# perform phase velocity inversion as per the original SBAS paper rather doing direct phase inversion.
print('estimating bias time-series from bias stack via the SBAS approach ...')
A1, B1 = stack_obj.get_design_matrix4timeseries(date12_list=date12_list)
kwargs = {
'A' : A1,
'B' : B1,
'tbase_diff' : tbase_diff,
'weight_sqrt' : None,
'min_norm_velocity' : True,
'inv_quality_name' : 'no',
}
# a. split mask into mask_all/par_net
# mask for valid (~NaN) observations in ALL ifgrams (share one B in sbas inversion)
mask_all_net = np.all(~np.isnan(bias_stack), axis=0) * np.all(bias_stack != 0, axis=0)
mask_all_net *= mask
mask_par_net = mask ^ mask_all_net
msg = 'estimating time-series for pixels with valid stack values'
# b. invert once for all pixels with obs in ALL ifgrams
bias_ts = np.zeros((num_date, num_pix), dtype=np.float32)
if np.sum(mask_all_net) > 0:
num_pix_all = int(np.sum(mask_all_net))
print(f'{msg} in all ifgrams ({num_pix_all} pixels; {num_pix_all/num_pix2inv*100:.0f}%) ...')
# invert
bias_ts[:, mask_all_net] = estimate_timeseries(y=bias_stack[:, mask_all_net], **kwargs)[0]
# c. invert pixel-by-pixel for pixels with obs NOT in all ifgrams
if np.sum(mask_par_net) > 0:
num_pix_par = int(np.sum(mask_par_net))
idx_pix_par = np.where(mask_par_net)[0]
print(f'{msg} in some ifgrams ({num_pix_par} pixels; {num_pix_par/num_pix2inv*100:.0f}%) ...')
prog_bar = ptime.progressBar(maxValue=num_pix_par)
for i in range(num_pix_par):
idx = idx_pix_par[i]
# invert
bias_ts[:, idx] = estimate_timeseries(y=bias_stack[:, idx], **kwargs)[0].flatten()
prog_bar.update(i+1, every=200, suffix=f'{i+1}/{num_pix_par} pixels')
prog_bar.close()
del bias_stack
bias_ts = bias_ts.reshape(num_date, box_len, box_wid) * phase2range
return bias_ts, box
def estimate_bias_timeseries(stack_file, bias_free_conn, bw, cluster_kwargs, water_mask_file=None, outdir='./', max_memory=4.0):
'''Run the bias time-series estimation.
Parameters: stack_file - string, path for ifgramStack.h5
bias_free_conn - integer, connection level at which we assume is bias-free
bw - integer, bandwidth of the given time-series.
cluster_kwargs - dictionary containing settings of parallel computing. To turn off, set parallel['clustertype']=''
outdir - string, directory for output files
max_memory - float, maximum memory in GB for each patch processed
Returns: bias_ts_file - str, path to the bias time series file: timeseriesBias.h5
'''
print('\n'+'-'*80)
print(f'estimating the non-closure phase bias time-series for bandwidth={bw} (Zheng et al., 2022) ...')
stack_obj = ifgramStack(stack_file)
stack_obj.open(print_msg=False)
length, width = stack_obj.length, stack_obj.width
meta = dict(stack_obj.metadata)
wvl = float(meta['WAVELENGTH'])
date12_list = stack_obj.get_date12_list(dropIfgram=True)
date_list = stack_obj.get_date_list(dropIfgram=True)
num_ifgram = len(date12_list)
num_date = len(date_list)
# check the bandwidth of ifgramStack
num_ifgram_exp = bandwidth2num_ifgram(bw, num_date)
print(f'number of interferograms expected for bandwidth={bw}: {num_ifgram_exp}')
print(f'number of interferograms kept in ifgramStack.h5 : {num_ifgram}')
if num_ifgram != num_ifgram_exp:
msg = f'number of the kept interferograms ({num_ifgram}) is NOT the same as expected ({num_ifgram_exp})!'
msg += f'\n This indicates the bandwidth between ifgramStack.h5 and the user input ({bw}) are NOT consistent!'
msg += '\n Modify the network of interferograms to be consistent via modify_network.py by:'
msg += f'\n 1) set mintpy.network.connNumMax={bw} and 2) re-run modify_network.py -t smallbaselineApp.cfg'
raise Exception(msg)
# estimate for bias time-series
bias_ts_file = os.path.join(outdir, 'timeseriesBias.h5')
ds_name_dict = {
'timeseries' : [np.float32, (num_date, length, width), None],
'date' : [np.dtype('S8'), (num_date,), np.array(date_list, np.bytes_)],
}
meta['FILE_TYPE'] = 'timeseries'
meta['DATA_TYPE'] = 'float32'
meta['REF_DATE'] = date_list[0]
meta['UNIT'] = 'm'
meta['BANDS'] = '1'
meta['DATE12'] = f'{date_list[0][2:]}-{date_list[-1][2:]}'
writefile.layout_hdf5(bias_ts_file, ds_name_dict, meta)
data_kwargs = {
"stack_file" : stack_file,
"bias_free_conn" : bias_free_conn,
"bw" : bw,
"wvl" : wvl,
"water_mask_file" : water_mask_file,
"outdir" : outdir,
}
# split igram_file into blocks to save memory
box_list, num_box = stack_obj.split2boxes(max_memory=max_memory, dim0_size=num_ifgram*2+num_date*3)
num_threads_dict = cluster.set_num_threads("1")
for i, box in enumerate(box_list):
box_wid, box_len = box[2] - box[0], box[3] - box[1]
print(box)
if num_box > 1:
print(f'\n------- processing patch {i+1} out of {num_box} --------------')
print(f'box width : {box_wid}')
print(f'box length: {box_len}')
#update box argument in the input data
data_kwargs['box'] = box
if not cluster_kwargs['cluster_type']:
# non-parallel
bias_ts = estimate_bias_timeseries_patch(**data_kwargs)[:-1]
else:
# parallel
print('\n\n------- start parallel processing using Dask -------')
# initiate the output data
bias_ts = np.zeros((num_date, box_len, box_wid), dtype=np.float32)
# initiate dask cluster and client
cluster_obj = cluster.DaskCluster(**cluster_kwargs)
cluster_obj.open()
# run dask
bias_ts = cluster_obj.run(
func=estimate_bias_timeseries_patch,
func_data=data_kwargs,
results=[bias_ts],
)
# close dask cluster and client
cluster_obj.close()
print('------- finished parallel processing -------\n\n')
writefile.write_hdf5_block(
bias_ts_file,
data=bias_ts,
datasetName='timeseries',
block=[0, num_date, box[1], box[3], box[0], box[2]],
)
# roll back to the original number of threads
cluster.roll_back_num_threads(num_threads_dict)
return bias_ts_file
################################################################################
def run_closure_phase_bias(inps):
"""Run non-closure phase related bias masking or estimation."""
start_time = time.time()
# common inputs
kwargs = dict(outdir=inps.outdir, max_memory=inps.maxMemory)
if inps.action == 'mask':
calc_closure_phase_mask(
stack_file=inps.stack_file,
bias_free_conn=inps.nl,
num_sigma=inps.num_sigma,
threshold_amp=inps.epsilon,
**kwargs)
elif inps.action.endswith('estimate'):
# compute the unwrapped closure phase bias time-series
# and re-unwrap to mitigate the impact of phase unwrapping errors
# which can dominate the true non-closure phase.
# max(2, inps.bw) is used to ensure we have conn-2 closure phase processed
conn_list = np.arange(2, max(2, inps.bw) + 1).tolist() + [inps.nl]
conn_list = sorted(list(set(conn_list)))
for conn in conn_list:
print('\n'+'-'*80)
print('calculating the unwrapped closure phase for '
f'connection level = {conn} out of {conn_list} ...')
compute_unwrap_closure_phase(
stack_file=inps.stack_file,
conn=conn,
num_worker=int(inps.numWorker),
**kwargs)
if inps.action == 'quick_estimate':
estimate_bias_timeseries_approx(
stack_file=inps.stack_file,
bias_free_conn=inps.nl,
bw=inps.bw,
water_mask_file=inps.water_mask_file,
**kwargs)
elif inps.action == 'estimate':
cluster_kwargs = {
"cluster_type" : inps.cluster,
"num_worker" : inps.numWorker,
"config_name" : inps.config}
estimate_bias_timeseries(
stack_file=inps.stack_file,
bias_free_conn=inps.nl,
bw=inps.bw,
cluster_kwargs=cluster_kwargs,
water_mask_file=inps.water_mask_file,
**kwargs)
# used time
m, s = divmod(time.time() - start_time, 60)
print(f'time used: {m:02.0f} mins {s:02.1f} secs.\n')
return
MintPy-1.6.2/src/mintpy/constants.py 0000664 0000000 0000000 00000001255 15032632755 0017450 0 ustar 00root root 0000000 0000000 ############################################################
# Program is part of MintPy #
# Copyright (c) 2013, Zhang Yunjun, Heresh Fattahi #
# Author: Zhang Yunjun, Feb 2022 #
############################################################
# Recommend usage:
# from mintpy.constants import SPEED_OF_LIGHT
SPEED_OF_LIGHT = 299792458 # meters per second
# Earth radius
# equatorial radius: a = 6378.1370e3
# polar radius: b = 6356.7523e3
# arithmetic mean radius: R_1 = (2 * a + b) / 3 = 6371.0088e3
# defined by IUGG and used in geophysics
EARTH_RADIUS = 6371.0088e3 # the arithmetic mean radius in meters
MintPy-1.6.2/src/mintpy/data/ 0000775 0000000 0000000 00000000000 15032632755 0015770 5 ustar 00root root 0000000 0000000 MintPy-1.6.2/src/mintpy/data/colormaps/ 0000775 0000000 0000000 00000000000 15032632755 0017767 5 ustar 00root root 0000000 0000000 MintPy-1.6.2/src/mintpy/data/colormaps/BlueWhiteOrangeRed.cpt 0000664 0000000 0000000 00000031146 15032632755 0024163 0 ustar 00root root 0000000 0000000 # ../cpt/ncar/BlueWhiteOrangeRed.cpt
# autogenerated GMT palette "BlueWhiteOrangeRed.txt"
# cptutils version 1.41, Fri Jan 20 21:01:59 2012
# COLOR_MODEL = RGB
0.000000e+00 27 44 98 1.000000e+00 27 44 98
1.000000e+00 27 46 101 2.000000e+00 27 46 101
2.000000e+00 28 48 104 3.000000e+00 28 48 104
3.000000e+00 28 50 107 4.000000e+00 28 50 107
4.000000e+00 29 52 110 5.000000e+00 29 52 110
5.000000e+00 29 53 112 6.000000e+00 29 53 112
6.000000e+00 29 55 115 7.000000e+00 29 55 115
7.000000e+00 30 57 118 8.000000e+00 30 57 118
8.000000e+00 30 59 121 9.000000e+00 30 59 121
9.000000e+00 30 61 124 1.000000e+01 30 61 124
1.000000e+01 31 63 127 1.100000e+01 31 63 127
1.100000e+01 31 65 130 1.200000e+01 31 65 130
1.200000e+01 32 67 133 1.300000e+01 32 67 133
1.300000e+01 32 68 135 1.400000e+01 32 68 135
1.400000e+01 32 70 138 1.500000e+01 32 70 138
1.500000e+01 33 72 141 1.600000e+01 33 72 141
1.600000e+01 33 74 144 1.700000e+01 33 74 144
1.700000e+01 33 76 147 1.800000e+01 33 76 147
1.800000e+01 34 78 150 1.900000e+01 34 78 150
1.900000e+01 34 80 153 2.000000e+01 34 80 153
2.000000e+01 35 82 156 2.100000e+01 35 82 156
2.100000e+01 35 83 158 2.200000e+01 35 83 158
2.200000e+01 35 85 161 2.300000e+01 35 85 161
2.300000e+01 36 89 167 2.400000e+01 36 89 167
2.400000e+01 38 92 169 2.500000e+01 38 92 169
2.500000e+01 40 95 171 2.600000e+01 40 95 171
2.600000e+01 42 98 173 2.700000e+01 42 98 173
2.700000e+01 45 102 175 2.800000e+01 45 102 175
2.800000e+01 47 105 177 2.900000e+01 47 105 177
2.900000e+01 49 108 179 3.000000e+01 49 108 179
3.000000e+01 51 111 181 3.100000e+01 51 111 181
3.100000e+01 53 114 183 3.200000e+01 53 114 183
3.200000e+01 55 117 185 3.300000e+01 55 117 185
3.300000e+01 57 120 187 3.400000e+01 57 120 187
3.400000e+01 59 123 189 3.500000e+01 59 123 189
3.500000e+01 62 127 192 3.600000e+01 62 127 192
3.600000e+01 64 130 194 3.700000e+01 64 130 194
3.700000e+01 66 133 196 3.800000e+01 66 133 196
3.800000e+01 68 136 198 3.900000e+01 68 136 198
3.900000e+01 70 139 200 4.000000e+01 70 139 200
4.000000e+01 72 142 202 4.100000e+01 72 142 202
4.100000e+01 74 145 204 4.200000e+01 74 145 204
4.200000e+01 76 148 206 4.300000e+01 76 148 206
4.300000e+01 79 152 208 4.400000e+01 79 152 208
4.400000e+01 81 155 210 4.500000e+01 81 155 210
4.500000e+01 83 158 212 4.600000e+01 83 158 212
4.600000e+01 87 164 216 4.700000e+01 87 164 216
4.700000e+01 90 166 217 4.800000e+01 90 166 217
4.800000e+01 93 169 219 4.900000e+01 93 169 219
4.900000e+01 96 171 220 5.000000e+01 96 171 220
5.000000e+01 99 173 221 5.100000e+01 99 173 221
5.100000e+01 102 175 222 5.200000e+01 102 175 222
5.200000e+01 105 178 224 5.300000e+01 105 178 224
5.300000e+01 107 180 225 5.400000e+01 107 180 225
5.400000e+01 110 182 226 5.500000e+01 110 182 226
5.500000e+01 113 184 228 5.600000e+01 113 184 228
5.600000e+01 116 187 229 5.700000e+01 116 187 229
5.700000e+01 119 189 230 5.800000e+01 119 189 230
5.800000e+01 122 191 232 5.900000e+01 122 191 232
5.900000e+01 125 193 233 6.000000e+01 125 193 233
6.000000e+01 128 196 234 6.100000e+01 128 196 234
6.100000e+01 131 198 235 6.200000e+01 131 198 235
6.200000e+01 134 200 237 6.300000e+01 134 200 237
6.300000e+01 137 202 238 6.400000e+01 137 202 238
6.400000e+01 140 205 239 6.500000e+01 140 205 239
6.500000e+01 142 207 241 6.600000e+01 142 207 241
6.600000e+01 145 209 242 6.700000e+01 145 209 242
6.700000e+01 148 211 243 6.800000e+01 148 211 243
6.800000e+01 151 214 244 6.900000e+01 151 214 244
6.900000e+01 157 218 247 7.000000e+01 157 218 247
7.000000e+01 159 219 247 7.100000e+01 159 219 247
7.100000e+01 162 220 247 7.200000e+01 162 220 247
7.200000e+01 164 221 247 7.300000e+01 164 221 247
7.300000e+01 167 222 247 7.400000e+01 167 222 247
7.400000e+01 169 222 247 7.500000e+01 169 222 247
7.500000e+01 172 223 248 7.600000e+01 172 223 248
7.600000e+01 174 224 248 7.700000e+01 174 224 248
7.700000e+01 176 225 248 7.800000e+01 176 225 248
7.800000e+01 179 226 248 7.900000e+01 179 226 248
7.900000e+01 181 227 248 8.000000e+01 181 227 248
8.000000e+01 184 228 248 8.100000e+01 184 228 248
8.100000e+01 186 229 248 8.200000e+01 186 229 248
8.200000e+01 188 229 248 8.300000e+01 188 229 248
8.300000e+01 191 230 248 8.400000e+01 191 230 248
8.400000e+01 193 231 248 8.500000e+01 193 231 248
8.500000e+01 196 232 248 8.600000e+01 196 232 248
8.600000e+01 198 233 248 8.700000e+01 198 233 248
8.700000e+01 201 234 249 8.800000e+01 201 234 249
8.800000e+01 203 235 249 8.900000e+01 203 235 249
8.900000e+01 205 236 249 9.000000e+01 205 236 249
9.000000e+01 208 236 249 9.100000e+01 208 236 249
9.100000e+01 210 237 249 9.200000e+01 210 237 249
9.200000e+01 215 239 249 9.300000e+01 215 239 249
9.300000e+01 217 240 249 9.400000e+01 217 240 249
9.400000e+01 218 240 250 9.500000e+01 218 240 250
9.500000e+01 220 241 250 9.600000e+01 220 241 250
9.600000e+01 222 242 250 9.700000e+01 222 242 250
9.700000e+01 223 242 250 9.800000e+01 223 242 250
9.800000e+01 225 243 251 9.900000e+01 225 243 251
9.900000e+01 227 244 251 1.000000e+02 227 244 251
1.000000e+02 228 244 251 1.010000e+02 228 244 251
1.010000e+02 230 245 251 1.020000e+02 230 245 251
1.020000e+02 232 246 252 1.030000e+02 232 246 252
1.030000e+02 233 246 252 1.040000e+02 233 246 252
1.040000e+02 235 247 252 1.050000e+02 235 247 252
1.050000e+02 237 248 252 1.060000e+02 237 248 252
1.060000e+02 238 248 253 1.070000e+02 238 248 253
1.070000e+02 240 249 253 1.080000e+02 240 249 253
1.080000e+02 242 250 253 1.090000e+02 242 250 253
1.090000e+02 243 250 253 1.100000e+02 243 250 253
1.100000e+02 245 251 254 1.110000e+02 245 251 254
1.110000e+02 247 252 254 1.120000e+02 247 252 254
1.120000e+02 248 252 254 1.130000e+02 248 252 254
1.130000e+02 250 253 254 1.140000e+02 250 253 254
1.140000e+02 252 254 255 1.150000e+02 252 254 255
1.150000e+02 255 255 255 1.160000e+02 255 255 255
1.160000e+02 255 255 255 1.170000e+02 255 255 255
1.170000e+02 255 255 255 1.180000e+02 255 255 255
1.180000e+02 255 255 255 1.190000e+02 255 255 255
1.190000e+02 255 255 255 1.200000e+02 255 255 255
1.200000e+02 255 255 255 1.210000e+02 255 255 255
1.210000e+02 255 255 255 1.220000e+02 255 255 255
1.220000e+02 255 255 255 1.230000e+02 255 255 255
1.230000e+02 255 255 255 1.240000e+02 255 255 255
1.240000e+02 255 255 255 1.250000e+02 255 255 255
1.250000e+02 255 255 255 1.260000e+02 255 255 255
1.260000e+02 255 255 255 1.270000e+02 255 255 255
1.270000e+02 255 255 255 1.280000e+02 255 255 255
1.280000e+02 255 255 255 1.290000e+02 255 255 255
1.290000e+02 255 255 255 1.300000e+02 255 255 255
1.300000e+02 255 255 255 1.310000e+02 255 255 255
1.310000e+02 255 255 255 1.320000e+02 255 255 255
1.320000e+02 255 255 255 1.330000e+02 255 255 255
1.330000e+02 255 255 255 1.340000e+02 255 255 255
1.340000e+02 255 255 255 1.350000e+02 255 255 255
1.350000e+02 255 255 255 1.360000e+02 255 255 255
1.360000e+02 255 255 255 1.370000e+02 255 255 255
1.370000e+02 255 255 255 1.380000e+02 255 255 255
1.380000e+02 255 255 255 1.390000e+02 255 255 255
1.390000e+02 255 254 251 1.400000e+02 255 254 251
1.400000e+02 255 253 247 1.410000e+02 255 253 247
1.410000e+02 255 253 243 1.420000e+02 255 253 243
1.420000e+02 255 252 238 1.430000e+02 255 252 238
1.430000e+02 254 251 234 1.440000e+02 254 251 234
1.440000e+02 254 250 230 1.450000e+02 254 250 230
1.450000e+02 254 249 226 1.460000e+02 254 249 226
1.460000e+02 254 248 222 1.470000e+02 254 248 222
1.470000e+02 254 248 218 1.480000e+02 254 248 218
1.480000e+02 254 247 213 1.490000e+02 254 247 213
1.490000e+02 254 246 209 1.500000e+02 254 246 209
1.500000e+02 254 245 205 1.510000e+02 254 245 205
1.510000e+02 253 244 201 1.520000e+02 253 244 201
1.520000e+02 253 243 197 1.530000e+02 253 243 197
1.530000e+02 253 243 193 1.540000e+02 253 243 193
1.540000e+02 253 242 188 1.550000e+02 253 242 188
1.550000e+02 253 241 184 1.560000e+02 253 241 184
1.560000e+02 253 240 180 1.570000e+02 253 240 180
1.570000e+02 253 239 176 1.580000e+02 253 239 176
1.580000e+02 253 238 172 1.590000e+02 253 238 172
1.590000e+02 252 238 168 1.600000e+02 252 238 168
1.600000e+02 252 237 163 1.610000e+02 252 237 163
1.610000e+02 252 235 155 1.620000e+02 252 235 155
1.620000e+02 252 233 151 1.630000e+02 252 233 151
1.630000e+02 252 230 146 1.640000e+02 252 230 146
1.640000e+02 252 228 142 1.650000e+02 252 228 142
1.650000e+02 252 225 138 1.660000e+02 252 225 138
1.660000e+02 252 223 133 1.670000e+02 252 223 133
1.670000e+02 253 220 129 1.680000e+02 253 220 129
1.680000e+02 253 218 124 1.690000e+02 253 218 124
1.690000e+02 253 215 120 1.700000e+02 253 215 120
1.700000e+02 253 213 116 1.710000e+02 253 213 116
1.710000e+02 253 210 111 1.720000e+02 253 210 111
1.720000e+02 253 208 107 1.730000e+02 253 208 107
1.730000e+02 253 206 103 1.740000e+02 253 206 103
1.740000e+02 253 203 98 1.750000e+02 253 203 98
1.750000e+02 253 201 94 1.760000e+02 253 201 94
1.760000e+02 253 198 89 1.770000e+02 253 198 89
1.770000e+02 253 196 85 1.780000e+02 253 196 85
1.780000e+02 253 193 81 1.790000e+02 253 193 81
1.790000e+02 254 191 76 1.800000e+02 254 191 76
1.800000e+02 254 188 72 1.810000e+02 254 188 72
1.810000e+02 254 186 68 1.820000e+02 254 186 68
1.820000e+02 254 183 63 1.830000e+02 254 183 63
1.830000e+02 254 181 59 1.840000e+02 254 181 59
1.840000e+02 254 176 50 1.850000e+02 254 176 50
1.850000e+02 254 173 50 1.860000e+02 254 173 50
1.860000e+02 253 170 49 1.870000e+02 253 170 49
1.870000e+02 253 167 49 1.880000e+02 253 167 49
1.880000e+02 253 164 49 1.890000e+02 253 164 49
1.890000e+02 252 161 48 1.900000e+02 252 161 48
1.900000e+02 252 159 48 1.910000e+02 252 159 48
1.910000e+02 251 156 47 1.920000e+02 251 156 47
1.920000e+02 251 153 47 1.930000e+02 251 153 47
1.930000e+02 251 150 47 1.940000e+02 251 150 47
1.940000e+02 250 147 46 1.950000e+02 250 147 46
1.950000e+02 250 144 46 1.960000e+02 250 144 46
1.960000e+02 250 141 46 1.970000e+02 250 141 46
1.970000e+02 249 138 45 1.980000e+02 249 138 45
1.980000e+02 249 135 45 1.990000e+02 249 135 45
1.990000e+02 248 132 44 2.000000e+02 248 132 44
2.000000e+02 248 129 44 2.010000e+02 248 129 44
2.010000e+02 248 126 44 2.020000e+02 248 126 44
2.020000e+02 247 124 43 2.030000e+02 247 124 43
2.030000e+02 247 121 43 2.040000e+02 247 121 43
2.040000e+02 247 118 43 2.050000e+02 247 118 43
2.050000e+02 246 115 42 2.060000e+02 246 115 42
2.060000e+02 246 112 42 2.070000e+02 246 112 42
2.070000e+02 245 106 41 2.080000e+02 245 106 41
2.080000e+02 244 103 41 2.090000e+02 244 103 41
2.090000e+02 242 100 41 2.100000e+02 242 100 41
2.100000e+02 241 97 41 2.110000e+02 241 97 41
2.110000e+02 239 94 41 2.120000e+02 239 94 41
2.120000e+02 238 90 41 2.130000e+02 238 90 41
2.130000e+02 237 87 41 2.140000e+02 237 87 41
2.140000e+02 235 84 41 2.150000e+02 235 84 41
2.150000e+02 234 81 41 2.160000e+02 234 81 41
2.160000e+02 232 78 41 2.170000e+02 232 78 41
2.170000e+02 231 75 41 2.180000e+02 231 75 41
2.180000e+02 229 72 41 2.190000e+02 229 72 41
2.190000e+02 228 69 41 2.200000e+02 228 69 41
2.200000e+02 227 65 40 2.210000e+02 227 65 40
2.210000e+02 225 62 40 2.220000e+02 225 62 40
2.220000e+02 224 59 40 2.230000e+02 224 59 40
2.230000e+02 222 56 40 2.240000e+02 222 56 40
2.240000e+02 221 53 40 2.250000e+02 221 53 40
2.250000e+02 220 50 40 2.260000e+02 220 50 40
2.260000e+02 218 47 40 2.270000e+02 218 47 40
2.270000e+02 217 44 40 2.280000e+02 217 44 40
2.280000e+02 215 40 40 2.290000e+02 215 40 40
2.290000e+02 214 37 40 2.300000e+02 214 37 40
2.300000e+02 211 31 40 2.310000e+02 211 31 40
2.310000e+02 208 31 39 2.320000e+02 208 31 39
2.320000e+02 206 30 39 2.330000e+02 206 30 39
2.330000e+02 203 30 38 2.340000e+02 203 30 38
2.340000e+02 200 29 38 2.350000e+02 200 29 38
2.350000e+02 197 29 37 2.360000e+02 197 29 37
2.360000e+02 195 29 36 2.370000e+02 195 29 36
2.370000e+02 192 28 36 2.380000e+02 192 28 36
2.380000e+02 189 28 35 2.390000e+02 189 28 35
2.390000e+02 187 27 34 2.400000e+02 187 27 34
2.400000e+02 184 27 34 2.410000e+02 184 27 34
2.410000e+02 181 26 33 2.420000e+02 181 26 33
2.420000e+02 179 26 33 2.430000e+02 179 26 33
2.430000e+02 176 26 32 2.440000e+02 176 26 32
2.440000e+02 173 25 31 2.450000e+02 173 25 31
2.450000e+02 170 25 31 2.460000e+02 170 25 31
2.460000e+02 168 24 30 2.470000e+02 168 24 30
2.470000e+02 165 24 29 2.480000e+02 165 24 29
2.480000e+02 162 24 29 2.490000e+02 162 24 29
2.490000e+02 160 23 28 2.500000e+02 160 23 28
2.500000e+02 157 23 28 2.510000e+02 157 23 28
2.510000e+02 154 22 27 2.520000e+02 154 22 27
2.520000e+02 151 22 26 2.530000e+02 151 22 26
2.530000e+02 146 21 25 2.540000e+02 146 21 25
B 0 0 0
F 255 255 255
N 255 0 0
MintPy-1.6.2/src/mintpy/data/colormaps/DEM_print.cpt 0000664 0000000 0000000 00000000472 15032632755 0022323 0 ustar 00root root 0000000 0000000 # cpt file created by: Thomas Dewez for printing
#
# COLOR_MODEL = RGB
0 51 102 0 100 129 195 31
100 129 195 31 200 255 255 204
200 255 255 204 400 244 189 69
400 244 189 69 500 102 51 12
500 102 51 12 600 102 51 0
600 102 51 0 800 255 255 255
B 51 102 0
F 255 255 255
N 51 102 0
MintPy-1.6.2/src/mintpy/data/colormaps/GMT_haxby.cpt 0000664 0000000 0000000 00000001763 15032632755 0022330 0 ustar 00root root 0000000 0000000 # $Id: GMT_haxby.cpt,v 1.1.1.1 2000/12/28 01:23:45 gmt Exp $
#
# The colortable popularized by Bill Haxby, LDEO
# COLOR_MODEL = RGB
0 10 0 121 1 10 0 121
1 40 0 150 2 40 0 150
2 20 5 175 3 20 5 175
3 0 10 200 4 0 10 200
4 0 25 212 5 0 25 212
5 0 40 224 6 0 40 224
6 26 102 240 7 26 102 240
7 13 129 248 8 13 129 248
8 25 175 255 9 25 175 255
9 50 190 255 10 50 190 255
10 68 202 255 11 68 202 255
11 97 225 240 12 97 225 240
12 106 235 225 13 106 235 225
13 124 235 200 14 124 235 200
14 138 236 174 15 138 236 174
15 172 245 168 16 172 245 168
16 205 255 162 17 205 255 162
17 223 245 141 18 223 245 141
18 240 236 121 19 240 236 121
19 247 215 104 20 247 215 104
20 255 189 87 21 255 189 87
21 255 160 69 22 255 160 69
22 244 117 75 23 244 117 75
23 238 80 78 24 238 80 78
24 255 90 90 25 255 90 90
25 255 124 124 26 255 124 124
26 255 158 158 27 255 158 158
27 245 179 174 28 245 179 174
28 255 196 196 29 255 196 196
29 255 215 215 30 255 215 215
30 255 235 235 31 255 235 235
31 255 255 255 32 255 255 255
MintPy-1.6.2/src/mintpy/data/colormaps/GMT_no_green.cpt 0000664 0000000 0000000 00000001234 15032632755 0023002 0 ustar 00root root 0000000 0000000 # $Id: GMT_no_green.cpt,v 1.1.1.1 2000/12/28 01:23:45 gmt Exp $
#
# Colormap using in Lab for Satellite Altimetry
# For folks who hate green in their cpt files
# Designed by W.H.F. Smith, NOAA
# COLOR_MODEL = RGB
-32 32 96 255 -28 32 96 255
-28 32 159 255 -24 32 159 255
-24 32 191 255 -20 32 191 255
-20 0 207 255 -16 0 207 255
-16 42 255 255 -12 42 255 255
-12 85 255 255 -8 85 255 255
-8 127 255 255 -4 127 255 255
-4 170 255 255 0 170 255 255
0 255 255 84 4 255 255 84
4 255 240 0 8 255 240 0
8 255 191 0 12 255 191 0
12 255 168 0 16 255 168 0
16 255 138 0 20 255 138 0
20 255 112 0 24 255 112 0
24 255 77 0 28 255 77 0
28 255 0 0 32 255 0 0
B 32 96 255
F 255 0 0
MintPy-1.6.2/src/mintpy/data/colormaps/batlow.cpt 0000664 0000000 0000000 00000023505 15032632755 0021774 0 ustar 00root root 0000000 0000000 #
# batlow
# www.fabiocrameri.ch/visualisation
0.000000 1 25 89 0.003922 2 27 89
0.003922 2 27 89 0.007843 2 28 90
0.007843 2 28 90 0.011765 3 29 90
0.011765 3 29 90 0.015686 3 30 90
0.015686 3 30 90 0.019608 4 31 90
0.019608 4 31 90 0.023529 4 32 90
0.023529 4 32 90 0.027451 5 33 91
0.027451 5 33 91 0.031373 5 34 91
0.031373 5 34 91 0.035294 6 35 91
0.035294 6 35 91 0.039216 6 36 91
0.039216 6 36 91 0.043137 7 37 91
0.043137 7 37 91 0.047059 7 38 91
0.047059 7 38 91 0.050980 8 39 92
0.050980 8 39 92 0.054902 8 40 92
0.054902 8 40 92 0.058824 9 41 92
0.058824 9 41 92 0.062745 9 42 92
0.062745 9 42 92 0.066667 10 43 92
0.066667 10 43 92 0.070588 10 44 92
0.070588 10 44 92 0.074510 11 45 93
0.074510 11 45 93 0.078431 11 46 93
0.078431 11 46 93 0.082353 11 47 93
0.082353 11 47 93 0.086275 12 48 93
0.086275 12 48 93 0.090196 12 49 93
0.090196 12 49 93 0.094118 13 50 94
0.094118 13 50 94 0.098039 13 51 94
0.098039 13 51 94 0.101961 13 52 94
0.101961 13 52 94 0.105882 14 53 94
0.105882 14 53 94 0.109804 14 54 94
0.109804 14 54 94 0.113725 14 55 94
0.113725 14 55 94 0.117647 15 56 95
0.117647 15 56 95 0.121569 15 58 95
0.121569 15 58 95 0.125490 15 59 95
0.125490 15 59 95 0.129412 16 60 95
0.129412 16 60 95 0.133333 16 61 95
0.133333 16 61 95 0.137255 17 62 95
0.137255 17 62 95 0.141176 17 63 96
0.141176 17 63 96 0.145098 17 64 96
0.145098 17 64 96 0.149020 18 65 96
0.149020 18 65 96 0.152941 18 66 96
0.152941 18 66 96 0.156863 19 67 96
0.156863 19 67 96 0.160784 19 68 96
0.160784 19 68 96 0.164706 19 69 96
0.164706 19 69 96 0.168627 20 70 96
0.168627 20 70 96 0.172549 20 71 97
0.172549 20 71 97 0.176471 21 72 97
0.176471 21 72 97 0.180392 21 74 97
0.180392 21 74 97 0.184314 22 75 97
0.184314 22 75 97 0.188235 22 76 97
0.188235 22 76 97 0.192157 23 77 97
0.192157 23 77 97 0.196078 24 78 97
0.196078 24 78 97 0.200000 24 79 97
0.200000 24 79 97 0.203922 25 80 97
0.203922 25 80 97 0.207843 26 81 97
0.207843 26 81 97 0.211765 26 82 97
0.211765 26 82 97 0.215686 27 83 97
0.215686 27 83 97 0.219608 28 84 97
0.219608 28 84 97 0.223529 29 85 97
0.223529 29 85 97 0.227451 29 86 97
0.227451 29 86 97 0.231373 30 87 97
0.231373 30 87 97 0.235294 31 88 97
0.235294 31 88 97 0.239216 32 89 96
0.239216 32 89 96 0.243137 33 90 96
0.243137 33 90 96 0.247059 34 91 96
0.247059 34 91 96 0.250980 35 92 96
0.250980 35 92 96 0.254902 36 93 95
0.254902 36 93 95 0.258824 37 94 95
0.258824 37 94 95 0.262745 38 95 95
0.262745 38 95 95 0.266667 40 96 95
0.266667 40 96 95 0.270588 41 97 94
0.270588 41 97 94 0.274510 42 97 94
0.274510 42 97 94 0.278431 43 98 93
0.278431 43 98 93 0.282353 44 99 93
0.282353 44 99 93 0.286275 46 100 92
0.286275 46 100 92 0.290196 47 101 92
0.290196 47 101 92 0.294118 48 102 91
0.294118 48 102 91 0.298039 50 102 91
0.298039 50 102 91 0.301961 51 103 90
0.301961 51 103 90 0.305882 52 104 90
0.305882 52 104 90 0.309804 54 105 89
0.309804 54 105 89 0.313725 55 105 88
0.313725 55 105 88 0.317647 56 106 88
0.317647 56 106 88 0.321569 58 107 87
0.321569 58 107 87 0.325490 59 107 86
0.325490 59 107 86 0.329412 61 108 86
0.329412 61 108 86 0.333333 62 108 85
0.333333 62 108 85 0.337255 64 109 84
0.337255 64 109 84 0.341176 65 110 83
0.341176 65 110 83 0.345098 66 110 83
0.345098 66 110 83 0.349020 68 111 82
0.349020 68 111 82 0.352941 69 111 81
0.352941 69 111 81 0.356863 71 112 80
0.356863 71 112 80 0.360784 72 113 80
0.360784 72 113 80 0.364706 74 113 79
0.364706 74 113 79 0.368627 75 114 78
0.368627 75 114 78 0.372549 77 114 77
0.372549 77 114 77 0.376471 78 115 76
0.376471 78 115 76 0.380392 80 115 75
0.380392 80 115 75 0.384314 81 116 75
0.384314 81 116 75 0.388235 83 116 74
0.388235 83 116 74 0.392157 84 117 73
0.392157 84 117 73 0.396078 86 117 72
0.396078 86 117 72 0.400000 87 118 71
0.400000 87 118 71 0.403922 89 118 70
0.403922 89 118 70 0.407843 90 119 70
0.407843 90 119 70 0.411765 92 119 69
0.411765 92 119 69 0.415686 93 120 68
0.415686 93 120 68 0.419608 95 120 67
0.419608 95 120 67 0.423529 96 120 66
0.423529 96 120 66 0.427451 98 121 65
0.427451 98 121 65 0.431373 99 121 65
0.431373 99 121 65 0.435294 101 122 64
0.435294 101 122 64 0.439216 102 122 63
0.439216 102 122 63 0.443137 104 123 62
0.443137 104 123 62 0.447059 106 123 61
0.447059 106 123 61 0.450980 107 124 60
0.450980 107 124 60 0.454902 109 124 60
0.454902 109 124 60 0.458824 110 125 59
0.458824 110 125 59 0.462745 112 125 58
0.462745 112 125 58 0.466667 113 126 57
0.466667 113 126 57 0.470588 115 126 56
0.470588 115 126 56 0.474510 117 126 56
0.474510 117 126 56 0.478431 118 127 55
0.478431 118 127 55 0.482353 120 127 54
0.482353 120 127 54 0.486275 122 128 53
0.486275 122 128 53 0.490196 123 128 53
0.490196 123 128 53 0.494118 125 129 52
0.494118 125 129 52 0.498039 127 129 51
0.498039 127 129 51 0.501961 129 130 51
0.501961 129 130 51 0.505882 130 130 50
0.505882 130 130 50 0.509804 132 131 50
0.509804 132 131 50 0.513725 134 131 49
0.513725 134 131 49 0.517647 136 132 48
0.517647 136 132 48 0.521569 137 132 48
0.521569 137 132 48 0.525490 139 133 47
0.525490 139 133 47 0.529412 141 133 47
0.529412 141 133 47 0.533333 143 134 47
0.533333 143 134 47 0.537255 145 134 46
0.537255 145 134 46 0.541176 147 134 46
0.541176 147 134 46 0.545098 149 135 46
0.545098 149 135 46 0.549020 151 135 46
0.549020 151 135 46 0.552941 153 136 46
0.552941 153 136 46 0.556863 155 136 46
0.556863 155 136 46 0.560784 157 137 46
0.560784 157 137 46 0.564706 159 137 46
0.564706 159 137 46 0.568627 161 138 46
0.568627 161 138 46 0.572549 163 138 46
0.572549 163 138 46 0.576471 165 139 46
0.576471 165 139 46 0.580392 168 139 47
0.580392 168 139 47 0.584314 170 140 47
0.584314 170 140 47 0.588235 172 140 48
0.588235 172 140 48 0.592157 174 141 49
0.592157 174 141 49 0.596078 176 141 49
0.596078 176 141 49 0.600000 178 141 50
0.600000 178 141 50 0.603922 180 142 51
0.603922 180 142 51 0.607843 183 142 52
0.607843 183 142 52 0.611765 185 143 53
0.611765 185 143 53 0.615686 187 143 54
0.615686 187 143 54 0.619608 189 144 55
0.619608 189 144 55 0.623529 191 144 56
0.623529 191 144 56 0.627451 193 144 57
0.627451 193 144 57 0.631373 195 145 59
0.631373 195 145 59 0.635294 197 145 60
0.635294 197 145 60 0.639216 199 145 61
0.639216 199 145 61 0.643137 201 146 63
0.643137 201 146 63 0.647059 203 146 64
0.647059 203 146 64 0.650980 205 147 66
0.650980 205 147 66 0.654902 207 147 67
0.654902 207 147 67 0.658824 209 147 69
0.658824 209 147 69 0.662745 211 148 70
0.662745 211 148 70 0.666667 213 148 72
0.666667 213 148 72 0.670588 215 149 74
0.670588 215 149 74 0.674510 217 149 75
0.674510 217 149 75 0.678431 218 149 77
0.678431 218 149 77 0.682353 220 150 79
0.682353 220 150 79 0.686275 222 150 81
0.686275 222 150 81 0.690196 224 151 83
0.690196 224 151 83 0.694118 225 151 85
0.694118 225 151 85 0.698039 227 152 86
0.698039 227 152 86 0.701961 228 152 88
0.701961 228 152 88 0.705882 230 152 90
0.705882 230 152 90 0.709804 232 153 92
0.709804 232 153 92 0.713725 233 153 94
0.713725 233 153 94 0.717647 234 154 96
0.717647 234 154 96 0.721569 236 154 99
0.721569 236 154 99 0.725490 237 155 101
0.725490 237 155 101 0.729412 238 156 103
0.729412 238 156 103 0.733333 239 156 105
0.733333 239 156 105 0.737255 241 157 107
0.737255 241 157 107 0.741176 242 157 109
0.741176 242 157 109 0.745098 243 158 111
0.745098 243 158 111 0.749020 244 158 113
0.749020 244 158 113 0.752941 245 159 116
0.752941 245 159 116 0.756863 245 160 118
0.756863 245 160 118 0.760784 246 160 120
0.760784 246 160 120 0.764706 247 161 122
0.764706 247 161 122 0.768627 248 162 124
0.768627 248 162 124 0.772549 248 162 126
0.772549 248 162 126 0.776471 249 163 128
0.776471 249 163 128 0.780392 249 164 131
0.780392 249 164 131 0.784314 250 164 133
0.784314 250 164 133 0.788235 250 165 135
0.788235 250 165 135 0.792157 251 166 137
0.792157 251 166 137 0.796078 251 166 139
0.796078 251 166 139 0.800000 252 167 141
0.800000 252 167 141 0.803922 252 168 143
0.803922 252 168 143 0.807843 252 168 146
0.807843 252 168 146 0.811765 252 169 148
0.811765 252 169 148 0.815686 253 170 150
0.815686 253 170 150 0.819608 253 170 152
0.819608 253 170 152 0.823529 253 171 154
0.823529 253 171 154 0.827451 253 172 156
0.827451 253 172 156 0.831373 253 172 158
0.831373 253 172 158 0.835294 253 173 160
0.835294 253 173 160 0.839216 253 174 162
0.839216 253 174 162 0.843137 253 175 164
0.843137 253 175 164 0.847059 253 175 166
0.847059 253 175 166 0.850980 253 176 168
0.850980 253 176 168 0.854902 253 177 171
0.854902 253 177 171 0.858824 253 177 173
0.858824 253 177 173 0.862745 253 178 175
0.862745 253 178 175 0.866667 253 179 177
0.866667 253 179 177 0.870588 253 180 179
0.870588 253 180 179 0.874510 253 180 181
0.874510 253 180 181 0.878431 253 181 183
0.878431 253 181 183 0.882353 253 182 185
0.882353 253 182 185 0.886275 253 182 187
0.886275 253 182 187 0.890196 253 183 189
0.890196 253 183 189 0.894118 253 184 191
0.894118 253 184 191 0.898039 253 185 194
0.898039 253 185 194 0.901961 253 185 196
0.901961 253 185 196 0.905882 253 186 198
0.905882 253 186 198 0.909804 253 187 200
0.909804 253 187 200 0.913725 253 187 202
0.913725 253 187 202 0.917647 253 188 204
0.917647 253 188 204 0.921569 253 189 206
0.921569 253 189 206 0.925490 253 190 208
0.925490 253 190 208 0.929412 253 190 211
0.929412 253 190 211 0.933333 252 191 213
0.933333 252 191 213 0.937255 252 192 215
0.937255 252 192 215 0.941176 252 193 217
0.941176 252 193 217 0.945098 252 193 219
0.945098 252 193 219 0.949020 252 194 221
0.949020 252 194 221 0.952941 252 195 224
0.952941 252 195 224 0.956863 252 196 226
0.956863 252 196 226 0.960784 252 196 228
0.960784 252 196 228 0.964706 252 197 230
0.964706 252 197 230 0.968627 251 198 232
0.968627 251 198 232 0.972549 251 199 235
0.972549 251 199 235 0.976471 251 199 237
0.976471 251 199 237 0.980392 251 200 239
0.980392 251 200 239 0.984314 251 201 241
0.984314 251 201 241 0.988235 251 202 243
0.988235 251 202 243 0.992157 251 203 246
0.992157 251 203 246 0.996078 250 203 248
0.996078 250 203 248 1.000000 250 204 250
N 255 255 255
B 1 25 89
F 250 204 250
MintPy-1.6.2/src/mintpy/data/colormaps/differences.cpt 0000664 0000000 0000000 00000000273 15032632755 0022756 0 ustar 00root root 0000000 0000000 # GMT colour palette table (cpt)
# grass2cpt output
# COLOR_MODEL = RGB
-1.000000e+00 0 0 255 0.000000e+00 255 255 255
0.000000e+00 255 255 255 1.000000e+00 255 0 0
N 128 128 128
MintPy-1.6.2/src/mintpy/data/colormaps/hawaii.cpt 0000664 0000000 0000000 00000024063 15032632755 0021746 0 ustar 00root root 0000000 0000000 #
# hawaii
# www.fabiocrameri.ch/visualisation
0.000000 140 2 115 0.003922 141 4 114
0.003922 141 4 114 0.007843 141 6 113
0.007843 141 6 113 0.011765 141 8 112
0.011765 141 8 112 0.015686 141 10 111
0.015686 141 10 111 0.019608 142 13 110
0.019608 142 13 110 0.023529 142 14 109
0.023529 142 14 109 0.027451 142 16 108
0.027451 142 16 108 0.031373 142 18 107
0.031373 142 18 107 0.035294 142 19 106
0.035294 142 19 106 0.039216 143 21 105
0.039216 143 21 105 0.043137 143 22 104
0.043137 143 22 104 0.047059 143 24 103
0.047059 143 24 103 0.050980 143 25 102
0.050980 143 25 102 0.054902 143 26 101
0.054902 143 26 101 0.058824 144 28 100
0.058824 144 28 100 0.062745 144 29 99
0.062745 144 29 99 0.066667 144 30 99
0.066667 144 30 99 0.070588 144 31 98
0.070588 144 31 98 0.074510 144 32 97
0.074510 144 32 97 0.078431 144 33 96
0.078431 144 33 96 0.082353 145 35 95
0.082353 145 35 95 0.086275 145 36 94
0.086275 145 36 94 0.090196 145 37 93
0.090196 145 37 93 0.094118 145 38 92
0.094118 145 38 92 0.098039 145 39 91
0.098039 145 39 91 0.101961 145 40 90
0.101961 145 40 90 0.105882 146 41 90
0.105882 146 41 90 0.109804 146 42 89
0.109804 146 42 89 0.113725 146 43 88
0.113725 146 43 88 0.117647 146 44 87
0.117647 146 44 87 0.121569 146 45 86
0.121569 146 45 86 0.125490 146 46 85
0.125490 146 46 85 0.129412 146 47 84
0.129412 146 47 84 0.133333 147 48 84
0.133333 147 48 84 0.137255 147 49 83
0.137255 147 49 83 0.141176 147 50 82
0.141176 147 50 82 0.145098 147 51 81
0.145098 147 51 81 0.149020 147 52 80
0.149020 147 52 80 0.152941 147 53 80
0.152941 147 53 80 0.156863 147 54 79
0.156863 147 54 79 0.160784 148 55 78
0.160784 148 55 78 0.164706 148 56 77
0.164706 148 56 77 0.168627 148 57 77
0.168627 148 57 77 0.172549 148 58 76
0.172549 148 58 76 0.176471 148 59 75
0.176471 148 59 75 0.180392 148 60 74
0.180392 148 60 74 0.184314 148 61 74
0.184314 148 61 74 0.188235 149 62 73
0.188235 149 62 73 0.192157 149 63 72
0.192157 149 63 72 0.196078 149 64 71
0.196078 149 64 71 0.200000 149 65 71
0.200000 149 65 71 0.203922 149 66 70
0.203922 149 66 70 0.207843 149 67 69
0.207843 149 67 69 0.211765 149 68 69
0.211765 149 68 69 0.215686 149 69 68
0.215686 149 69 68 0.219608 150 70 67
0.219608 150 70 67 0.223529 150 71 66
0.223529 150 71 66 0.227451 150 72 66
0.227451 150 72 66 0.231373 150 73 65
0.231373 150 73 65 0.235294 150 74 64
0.235294 150 74 64 0.239216 150 75 64
0.239216 150 75 64 0.243137 150 76 63
0.243137 150 76 63 0.247059 150 77 62
0.247059 150 77 62 0.250980 151 78 62
0.250980 151 78 62 0.254902 151 79 61
0.254902 151 79 61 0.258824 151 80 60
0.258824 151 80 60 0.262745 151 81 60
0.262745 151 81 60 0.266667 151 82 59
0.266667 151 82 59 0.270588 151 83 58
0.270588 151 83 58 0.274510 151 83 58
0.274510 151 83 58 0.278431 151 84 57
0.278431 151 84 57 0.282353 152 85 56
0.282353 152 85 56 0.286275 152 86 56
0.286275 152 86 56 0.290196 152 87 55
0.290196 152 87 55 0.294118 152 88 54
0.294118 152 88 54 0.298039 152 89 54
0.298039 152 89 54 0.301961 152 90 53
0.301961 152 90 53 0.305882 152 92 52
0.305882 152 92 52 0.309804 153 93 52
0.309804 153 93 52 0.313725 153 94 51
0.313725 153 94 51 0.317647 153 95 50
0.317647 153 95 50 0.321569 153 96 50
0.321569 153 96 50 0.325490 153 97 49
0.325490 153 97 49 0.329412 153 98 48
0.329412 153 98 48 0.333333 153 99 48
0.333333 153 99 48 0.337255 153 100 47
0.337255 153 100 47 0.341176 154 101 46
0.341176 154 101 46 0.345098 154 102 46
0.345098 154 102 46 0.349020 154 103 45
0.349020 154 103 45 0.352941 154 104 44
0.352941 154 104 44 0.356863 154 105 44
0.356863 154 105 44 0.360784 154 106 43
0.360784 154 106 43 0.364706 154 107 42
0.364706 154 107 42 0.368627 155 108 42
0.368627 155 108 42 0.372549 155 109 41
0.372549 155 109 41 0.376471 155 111 40
0.376471 155 111 40 0.380392 155 112 40
0.380392 155 112 40 0.384314 155 113 39
0.384314 155 113 39 0.388235 155 114 38
0.388235 155 114 38 0.392157 155 115 38
0.392157 155 115 38 0.396078 155 116 37
0.396078 155 116 37 0.400000 156 117 36
0.400000 156 117 36 0.403922 156 119 36
0.403922 156 119 36 0.407843 156 120 35
0.407843 156 120 35 0.411765 156 121 35
0.411765 156 121 35 0.415686 156 122 34
0.415686 156 122 34 0.419608 156 123 33
0.419608 156 123 33 0.423529 156 125 33
0.423529 156 125 33 0.427451 156 126 32
0.427451 156 126 32 0.431373 156 127 32
0.431373 156 127 32 0.435294 156 128 31
0.435294 156 128 31 0.439216 157 129 31
0.439216 157 129 31 0.443137 157 131 30
0.443137 157 131 30 0.447059 157 132 30
0.447059 157 132 30 0.450980 157 133 29
0.450980 157 133 29 0.454902 157 135 29
0.454902 157 135 29 0.458824 157 136 29
0.458824 157 136 29 0.462745 157 137 28
0.462745 157 137 28 0.466667 157 138 28
0.466667 157 138 28 0.470588 157 140 28
0.470588 157 140 28 0.474510 157 141 28
0.474510 157 141 28 0.478431 157 142 28
0.478431 157 142 28 0.482353 157 144 28
0.482353 157 144 28 0.486275 156 145 28
0.486275 156 145 28 0.490196 156 146 28
0.490196 156 146 28 0.494118 156 148 28
0.494118 156 148 28 0.498039 156 149 28
0.498039 156 149 28 0.501961 156 150 28
0.501961 156 150 28 0.505882 156 152 29
0.505882 156 152 29 0.509804 155 153 29
0.509804 155 153 29 0.513725 155 154 30
0.513725 155 154 30 0.517647 155 156 31
0.517647 155 156 31 0.521569 155 157 31
0.521569 155 157 31 0.525490 154 159 32
0.525490 154 159 32 0.529412 154 160 33
0.529412 154 160 33 0.533333 154 161 34
0.533333 154 161 34 0.537255 153 163 35
0.537255 153 163 35 0.541176 153 164 36
0.541176 153 164 36 0.545098 152 165 38
0.545098 152 165 38 0.549020 152 166 39
0.549020 152 166 39 0.552941 151 168 40
0.552941 151 168 40 0.556863 151 169 42
0.556863 151 169 42 0.560784 150 170 43
0.560784 150 170 43 0.564706 149 171 45
0.564706 149 171 45 0.568627 149 173 46
0.568627 149 173 46 0.572549 148 174 48
0.572549 148 174 48 0.576471 147 175 50
0.576471 147 175 50 0.580392 147 176 51
0.580392 147 176 51 0.584314 146 177 53
0.584314 146 177 53 0.588235 145 179 55
0.588235 145 179 55 0.592157 145 180 57
0.592157 145 180 57 0.596078 144 181 59
0.596078 144 181 59 0.600000 143 182 60
0.600000 143 182 60 0.603922 142 183 62
0.603922 142 183 62 0.607843 141 184 64
0.607843 141 184 64 0.611765 140 185 66
0.611765 140 185 66 0.615686 140 186 68
0.615686 140 186 68 0.619608 139 187 70
0.619608 139 187 70 0.623529 138 188 72
0.623529 138 188 72 0.627451 137 189 74
0.627451 137 189 74 0.631373 136 190 76
0.631373 136 190 76 0.635294 135 190 78
0.635294 135 190 78 0.639216 134 191 80
0.639216 134 191 80 0.643137 133 192 82
0.643137 133 192 82 0.647059 132 193 84
0.647059 132 193 84 0.650980 131 194 87
0.650980 131 194 87 0.654902 130 195 89
0.654902 130 195 89 0.658824 130 195 91
0.658824 130 195 91 0.662745 129 196 93
0.662745 129 196 93 0.666667 128 197 95
0.666667 128 197 95 0.670588 127 198 97
0.670588 127 198 97 0.674510 126 198 99
0.674510 126 198 99 0.678431 125 199 101
0.678431 125 199 101 0.682353 124 200 103
0.682353 124 200 103 0.686275 123 201 105
0.686275 123 201 105 0.690196 122 201 108
0.690196 122 201 108 0.694118 121 202 110
0.694118 121 202 110 0.698039 120 203 112
0.698039 120 203 112 0.701961 119 204 114
0.701961 119 204 114 0.705882 118 204 116
0.705882 118 204 116 0.709804 117 205 118
0.709804 117 205 118 0.713725 116 206 121
0.713725 116 206 121 0.717647 115 206 123
0.717647 115 206 123 0.721569 114 207 125
0.721569 114 207 125 0.725490 113 208 127
0.725490 113 208 127 0.729412 112 208 129
0.729412 112 208 129 0.733333 112 209 131
0.733333 112 209 131 0.737255 111 210 134
0.737255 111 210 134 0.741176 110 210 136
0.741176 110 210 136 0.745098 109 211 138
0.745098 109 211 138 0.749020 108 212 140
0.749020 108 212 140 0.752941 107 212 142
0.752941 107 212 142 0.756863 106 213 145
0.756863 106 213 145 0.760784 105 214 147
0.760784 105 214 147 0.764706 104 214 149
0.764706 104 214 149 0.768627 104 215 151
0.768627 104 215 151 0.772549 103 216 153
0.772549 103 216 153 0.776471 102 216 156
0.776471 102 216 156 0.780392 101 217 158
0.780392 101 217 158 0.784314 100 218 160
0.784314 100 218 160 0.788235 100 218 162
0.788235 100 218 162 0.792157 99 219 165
0.792157 99 219 165 0.796078 98 220 167
0.796078 98 220 167 0.800000 98 220 169
0.800000 98 220 169 0.803922 97 221 171
0.803922 97 221 171 0.807843 97 222 174
0.807843 97 222 174 0.811765 96 222 176
0.811765 96 222 176 0.815686 96 223 178
0.815686 96 223 178 0.819608 96 224 180
0.819608 96 224 180 0.823529 95 224 183
0.823529 95 224 183 0.827451 95 225 185
0.827451 95 225 185 0.831373 95 226 187
0.831373 95 226 187 0.835294 95 226 189
0.835294 95 226 189 0.839216 95 227 192
0.839216 95 227 192 0.843137 95 228 194
0.843137 95 228 194 0.847059 96 228 196
0.847059 96 228 196 0.850980 96 229 198
0.850980 96 229 198 0.854902 97 229 200
0.854902 97 229 200 0.858824 97 230 202
0.858824 97 230 202 0.862745 98 231 205
0.862745 98 231 205 0.866667 99 231 207
0.866667 99 231 207 0.870588 100 232 209
0.870588 100 232 209 0.874510 102 232 211
0.874510 102 232 211 0.878431 103 233 213
0.878431 103 233 213 0.882353 104 233 215
0.882353 104 233 215 0.886275 106 234 217
0.886275 106 234 217 0.890196 108 235 219
0.890196 108 235 219 0.894118 109 235 220
0.894118 109 235 220 0.898039 111 235 222
0.898039 111 235 222 0.901961 113 236 224
0.901961 113 236 224 0.905882 115 236 226
0.905882 115 236 226 0.909804 118 237 227
0.909804 118 237 227 0.913725 120 237 229
0.913725 120 237 229 0.917647 122 238 231
0.917647 122 238 231 0.921569 125 238 232
0.921569 125 238 232 0.925490 127 238 234
0.925490 127 238 234 0.929412 130 239 235
0.929412 130 239 235 0.933333 132 239 236
0.933333 132 239 236 0.937255 135 239 238
0.937255 135 239 238 0.941176 138 240 239
0.941176 138 240 239 0.945098 141 240 240
0.945098 141 240 240 0.949020 143 240 241
0.949020 143 240 241 0.952941 146 240 243
0.952941 146 240 243 0.956863 149 241 244
0.956863 149 241 244 0.960784 152 241 245
0.960784 152 241 245 0.964706 154 241 246
0.964706 154 241 246 0.968627 157 241 247
0.968627 157 241 247 0.972549 160 241 248
0.972549 160 241 248 0.976471 163 241 249
0.976471 163 241 249 0.980392 166 241 249
0.980392 166 241 249 0.984314 168 242 250
0.984314 168 242 250 0.988235 171 242 251
0.988235 171 242 251 0.992157 174 242 252
0.992157 174 242 252 0.996078 177 242 253
0.996078 177 242 253 1.000000 179 242 253
N 255 255 255
B 140 2 115
F 179 242 253
MintPy-1.6.2/src/mintpy/data/colormaps/oleron.cpt 0000664 0000000 0000000 00000024075 15032632755 0022005 0 ustar 00root root 0000000 0000000 #
# oleron
# www.fabiocrameri.ch/visualisation
0.000000 26 38 89 0.003922 27 40 91
0.003922 27 40 91 0.007843 29 41 92
0.007843 29 41 92 0.011765 30 43 94
0.011765 30 43 94 0.015686 32 44 95
0.015686 32 44 95 0.019608 33 46 97
0.019608 33 46 97 0.023529 35 47 98
0.023529 35 47 98 0.027451 36 49 100
0.027451 36 49 100 0.031373 38 50 101
0.031373 38 50 101 0.035294 40 52 103
0.035294 40 52 103 0.039216 41 53 104
0.039216 41 53 104 0.043137 43 55 106
0.043137 43 55 106 0.047059 44 56 107
0.047059 44 56 107 0.050980 46 58 109
0.050980 46 58 109 0.054902 47 59 111
0.054902 47 59 111 0.058824 49 61 112
0.058824 49 61 112 0.062745 50 63 114
0.062745 50 63 114 0.066667 52 64 115
0.066667 52 64 115 0.070588 53 66 117
0.070588 53 66 117 0.074510 55 67 118
0.074510 55 67 118 0.078431 57 69 120
0.078431 57 69 120 0.082353 58 71 122
0.082353 58 71 122 0.086275 60 72 123
0.086275 60 72 123 0.090196 61 74 125
0.090196 61 74 125 0.094118 63 75 126
0.094118 63 75 126 0.098039 65 77 128
0.098039 65 77 128 0.101961 66 79 130
0.101961 66 79 130 0.105882 68 80 131
0.105882 68 80 131 0.109804 69 82 133
0.109804 69 82 133 0.113725 71 84 135
0.113725 71 84 135 0.117647 73 85 136
0.117647 73 85 136 0.121569 74 87 138
0.121569 74 87 138 0.125490 76 89 140
0.125490 76 89 140 0.129412 78 90 141
0.129412 78 90 141 0.133333 79 92 143
0.133333 79 92 143 0.137255 81 94 145
0.137255 81 94 145 0.141176 83 95 146
0.141176 83 95 146 0.145098 84 97 148
0.145098 84 97 148 0.149020 86 99 150
0.149020 86 99 150 0.152941 88 100 151
0.152941 88 100 151 0.156863 89 102 153
0.156863 89 102 153 0.160784 91 104 155
0.160784 91 104 155 0.164706 93 105 156
0.164706 93 105 156 0.168627 94 107 158
0.168627 94 107 158 0.172549 96 109 160
0.172549 96 109 160 0.176471 98 111 162
0.176471 98 111 162 0.180392 100 112 163
0.180392 100 112 163 0.184314 101 114 165
0.184314 101 114 165 0.188235 103 116 167
0.188235 103 116 167 0.192157 105 117 169
0.192157 105 117 169 0.196078 107 119 170
0.196078 107 119 170 0.200000 108 121 172
0.200000 108 121 172 0.203922 110 123 174
0.203922 110 123 174 0.207843 112 125 176
0.207843 112 125 176 0.211765 114 126 177
0.211765 114 126 177 0.215686 115 128 179
0.215686 115 128 179 0.219608 117 130 181
0.219608 117 130 181 0.223529 119 132 183
0.223529 119 132 183 0.227451 121 133 184
0.227451 121 133 184 0.231373 122 135 186
0.231373 122 135 186 0.235294 124 137 188
0.235294 124 137 188 0.239216 126 139 190
0.239216 126 139 190 0.243137 128 141 192
0.243137 128 141 192 0.247059 130 142 193
0.247059 130 142 193 0.250980 131 144 195
0.250980 131 144 195 0.254902 133 146 197
0.254902 133 146 197 0.258824 135 148 199
0.258824 135 148 199 0.262745 137 150 201
0.262745 137 150 201 0.266667 139 151 202
0.266667 139 151 202 0.270588 141 153 204
0.270588 141 153 204 0.274510 142 155 206
0.274510 142 155 206 0.278431 144 157 208
0.278431 144 157 208 0.282353 146 159 210
0.282353 146 159 210 0.286275 148 161 211
0.286275 148 161 211 0.290196 150 162 213
0.290196 150 162 213 0.294118 152 164 215
0.294118 152 164 215 0.298039 153 166 217
0.298039 153 166 217 0.301961 155 168 219
0.301961 155 168 219 0.305882 157 170 220
0.305882 157 170 220 0.309804 159 172 222
0.309804 159 172 222 0.313725 161 173 224
0.313725 161 173 224 0.317647 163 175 225
0.317647 163 175 225 0.321569 164 177 227
0.321569 164 177 227 0.325490 166 179 229
0.325490 166 179 229 0.329412 168 181 230
0.329412 168 181 230 0.333333 170 183 232
0.333333 170 183 232 0.337255 172 184 233
0.337255 172 184 233 0.341176 173 186 234
0.341176 173 186 234 0.345098 175 188 236
0.345098 175 188 236 0.349020 177 189 237
0.349020 177 189 237 0.352941 178 191 238
0.352941 178 191 238 0.356863 180 193 239
0.356863 180 193 239 0.360784 182 194 240
0.360784 182 194 240 0.364706 183 196 241
0.364706 183 196 241 0.368627 185 198 242
0.368627 185 198 242 0.372549 186 199 243
0.372549 186 199 243 0.376471 188 201 243
0.376471 188 201 243 0.380392 189 202 244
0.380392 189 202 244 0.384314 191 203 244
0.384314 191 203 244 0.388235 192 205 245
0.388235 192 205 245 0.392157 194 206 245
0.392157 194 206 245 0.396078 195 208 246
0.396078 195 208 246 0.400000 196 209 246
0.400000 196 209 246 0.403922 198 210 247
0.403922 198 210 247 0.407843 199 212 247
0.407843 199 212 247 0.411765 200 213 248
0.411765 200 213 248 0.415686 202 214 248
0.415686 202 214 248 0.419608 203 216 248
0.419608 203 216 248 0.423529 204 217 249
0.423529 204 217 249 0.427451 206 218 249
0.427451 206 218 249 0.431373 207 220 249
0.431373 207 220 249 0.435294 208 221 250
0.435294 208 221 250 0.439216 210 222 250
0.439216 210 222 250 0.443137 211 224 250
0.443137 211 224 250 0.447059 212 225 251
0.447059 212 225 251 0.450980 214 226 251
0.450980 214 226 251 0.454902 215 228 251
0.454902 215 228 251 0.458824 216 229 252
0.458824 216 229 252 0.462745 218 230 252
0.462745 218 230 252 0.466667 219 232 252
0.466667 219 232 252 0.470588 220 233 253
0.470588 220 233 253 0.474510 222 234 253
0.474510 222 234 253 0.478431 223 236 253
0.478431 223 236 253 0.482353 224 237 254
0.482353 224 237 254 0.486275 226 238 254
0.486275 226 238 254 0.490196 227 240 254
0.490196 227 240 254 0.494118 228 241 255
0.494118 228 241 255 0.498039 230 242 255
0.498039 230 242 255 0.501961 26 76 0
0.501961 26 76 0 0.505882 29 77 0
0.505882 29 77 0 0.509804 31 78 0
0.509804 31 78 0 0.513725 34 79 0
0.513725 34 79 0 0.517647 37 79 0
0.517647 37 79 0 0.521569 39 80 0
0.521569 39 80 0 0.525490 42 81 0
0.525490 42 81 0 0.529412 44 81 0
0.529412 44 81 0 0.533333 47 82 0
0.533333 47 82 0 0.537255 49 83 0
0.537255 49 83 0 0.541176 51 84 0
0.541176 51 84 0 0.545098 53 84 0
0.545098 53 84 0 0.549020 56 85 0
0.549020 56 85 0 0.552941 58 86 0
0.552941 58 86 0 0.556863 60 86 0
0.556863 60 86 0 0.560784 62 87 0
0.560784 62 87 0 0.564706 64 87 0
0.564706 64 87 0 0.568627 66 88 0
0.568627 66 88 0 0.572549 68 89 0
0.572549 68 89 0 0.576471 70 89 0
0.576471 70 89 0 0.580392 73 90 1
0.580392 73 90 1 0.584314 75 91 1
0.584314 75 91 1 0.588235 77 92 1
0.588235 77 92 1 0.592157 79 92 2
0.592157 79 92 2 0.596078 81 93 2
0.596078 81 93 2 0.600000 83 94 2
0.600000 83 94 2 0.603922 85 95 3
0.603922 85 95 3 0.607843 87 96 4
0.607843 87 96 4 0.611765 90 96 5
0.611765 90 96 5 0.615686 92 97 6
0.615686 92 97 6 0.619608 94 98 7
0.619608 94 98 7 0.623529 96 99 9
0.623529 96 99 9 0.627451 99 100 10
0.627451 99 100 10 0.631373 101 102 12
0.631373 101 102 12 0.635294 103 103 14
0.635294 103 103 14 0.639216 106 104 16
0.639216 106 104 16 0.643137 108 105 18
0.643137 108 105 18 0.647059 110 106 20
0.647059 110 106 20 0.650980 113 108 22
0.650980 113 108 22 0.654902 115 109 24
0.654902 115 109 24 0.658824 117 110 26
0.658824 117 110 26 0.662745 120 112 29
0.662745 120 112 29 0.666667 122 113 31
0.666667 122 113 31 0.670588 124 114 33
0.670588 124 114 33 0.674510 126 116 35
0.674510 126 116 35 0.678431 129 117 37
0.678431 129 117 37 0.682353 131 118 40
0.682353 131 118 40 0.686275 133 120 42
0.686275 133 120 42 0.690196 135 121 44
0.690196 135 121 44 0.694118 138 123 46
0.694118 138 123 46 0.698039 140 124 49
0.698039 140 124 49 0.701961 142 125 51
0.701961 142 125 51 0.705882 144 127 53
0.705882 144 127 53 0.709804 146 128 55
0.709804 146 128 55 0.713725 148 130 58
0.713725 148 130 58 0.717647 151 131 60
0.717647 151 131 60 0.721569 153 132 62
0.721569 153 132 62 0.725490 155 134 64
0.725490 155 134 64 0.729412 157 135 67
0.729412 157 135 67 0.733333 159 137 69
0.733333 159 137 69 0.737255 161 138 71
0.737255 161 138 71 0.741176 163 140 73
0.741176 163 140 73 0.745098 166 141 76
0.745098 166 141 76 0.749020 168 143 78
0.749020 168 143 78 0.752941 170 144 80
0.752941 170 144 80 0.756863 172 146 83
0.756863 172 146 83 0.760784 174 147 85
0.760784 174 147 85 0.764706 177 149 87
0.764706 177 149 87 0.768627 179 151 89
0.768627 179 151 89 0.772549 181 152 92
0.772549 181 152 92 0.776471 183 154 94
0.776471 183 154 94 0.780392 186 156 96
0.780392 186 156 96 0.784314 188 157 99
0.784314 188 157 99 0.788235 190 159 101
0.788235 190 159 101 0.792157 193 161 103
0.792157 193 161 103 0.796078 195 163 106
0.796078 195 163 106 0.800000 197 164 108
0.800000 197 164 108 0.803922 199 166 110
0.803922 199 166 110 0.807843 202 168 113
0.807843 202 168 113 0.811765 204 170 115
0.811765 204 170 115 0.815686 206 172 117
0.815686 206 172 117 0.819608 209 173 120
0.819608 209 173 120 0.823529 211 175 122
0.823529 211 175 122 0.827451 213 177 124
0.827451 213 177 124 0.831373 215 179 127
0.831373 215 179 127 0.835294 217 181 129
0.835294 217 181 129 0.839216 220 182 132
0.839216 220 182 132 0.843137 222 184 134
0.843137 222 184 134 0.847059 224 186 137
0.847059 224 186 137 0.850980 226 188 139
0.850980 226 188 139 0.854902 228 190 142
0.854902 228 190 142 0.858824 229 192 144
0.858824 229 192 144 0.862745 231 194 147
0.862745 231 194 147 0.866667 233 196 149
0.866667 233 196 149 0.870588 234 197 152
0.870588 234 197 152 0.874510 236 199 154
0.874510 236 199 154 0.878431 237 201 157
0.878431 237 201 157 0.882353 238 203 159
0.882353 238 203 159 0.886275 240 205 162
0.886275 240 205 162 0.890196 241 206 164
0.890196 241 206 164 0.894118 242 208 167
0.894118 242 208 167 0.898039 242 210 169
0.898039 242 210 169 0.901961 243 212 171
0.901961 243 212 171 0.905882 244 213 174
0.905882 244 213 174 0.909804 245 215 176
0.909804 245 215 176 0.913725 245 217 178
0.913725 245 217 178 0.917647 246 218 181
0.917647 246 218 181 0.921569 246 220 183
0.921569 246 220 183 0.925490 247 222 185
0.925490 247 222 185 0.929412 247 223 188
0.929412 247 223 188 0.933333 247 225 190
0.933333 247 225 190 0.937255 248 226 192
0.937255 248 226 192 0.941176 248 228 195
0.941176 248 228 195 0.945098 248 230 197
0.945098 248 230 197 0.949020 249 231 199
0.949020 249 231 199 0.952941 249 233 201
0.952941 249 233 201 0.956863 249 234 204
0.956863 249 234 204 0.960784 250 236 206
0.960784 250 236 206 0.964706 250 238 208
0.964706 250 238 208 0.968627 250 239 211
0.968627 250 239 211 0.972549 251 241 213
0.972549 251 241 213 0.976471 251 243 215
0.976471 251 243 215 0.980392 251 244 218
0.980392 251 244 218 0.984314 251 246 220
0.984314 251 246 220 0.988235 252 248 222
0.988235 252 248 222 0.992157 252 249 225
0.992157 252 249 225 0.996078 252 251 227
0.996078 252 251 227 1.000000 253 253 230
N 255 255 255
B 26 38 89
F 253 253 230
MintPy-1.6.2/src/mintpy/data/colormaps/roma.cpt 0000664 0000000 0000000 00000024131 15032632755 0021436 0 ustar 00root root 0000000 0000000 #
# roma
# www.fabiocrameri.ch/visualisation
0.000000 127 25 0 0.003922 128 28 1
0.003922 128 28 1 0.007843 129 31 2
0.007843 129 31 2 0.011765 130 34 3
0.011765 130 34 3 0.015686 131 37 4
0.015686 131 37 4 0.019608 132 39 5
0.019608 132 39 5 0.023529 134 42 5
0.023529 134 42 5 0.027451 135 44 6
0.027451 135 44 6 0.031373 136 47 7
0.031373 136 47 7 0.035294 137 49 8
0.035294 137 49 8 0.039216 138 51 8
0.039216 138 51 8 0.043137 139 53 9
0.043137 139 53 9 0.047059 140 56 10
0.047059 140 56 10 0.050980 141 58 11
0.050980 141 58 11 0.054902 143 60 12
0.054902 143 60 12 0.058824 144 62 13
0.058824 144 62 13 0.062745 145 64 14
0.062745 145 64 14 0.066667 146 66 15
0.066667 146 66 15 0.070588 147 68 16
0.070588 147 68 16 0.074510 148 71 16
0.074510 148 71 16 0.078431 149 73 17
0.078431 149 73 17 0.082353 150 75 18
0.082353 150 75 18 0.086275 151 77 19
0.086275 151 77 19 0.090196 152 79 20
0.090196 152 79 20 0.094118 153 81 21
0.094118 153 81 21 0.098039 154 83 22
0.098039 154 83 22 0.101961 155 85 22
0.101961 155 85 22 0.105882 156 87 23
0.105882 156 87 23 0.109804 157 89 24
0.109804 157 89 24 0.113725 158 91 25
0.113725 158 91 25 0.117647 159 93 26
0.117647 159 93 26 0.121569 160 95 27
0.121569 160 95 27 0.125490 161 97 28
0.125490 161 97 28 0.129412 162 99 28
0.129412 162 99 28 0.133333 163 101 29
0.133333 163 101 29 0.137255 164 103 30
0.137255 164 103 30 0.141176 165 105 31
0.141176 165 105 31 0.145098 166 107 32
0.145098 166 107 32 0.149020 167 109 33
0.149020 167 109 33 0.152941 168 111 33
0.152941 168 111 33 0.156863 169 113 34
0.156863 169 113 34 0.160784 170 114 35
0.160784 170 114 35 0.164706 171 116 36
0.164706 171 116 36 0.168627 172 118 37
0.168627 172 118 37 0.172549 173 120 38
0.172549 173 120 38 0.176471 173 122 39
0.176471 173 122 39 0.180392 174 124 39
0.180392 174 124 39 0.184314 175 126 40
0.184314 175 126 40 0.188235 176 128 41
0.188235 176 128 41 0.192157 177 130 42
0.192157 177 130 42 0.196078 178 132 43
0.196078 178 132 43 0.200000 179 134 44
0.200000 179 134 44 0.203922 180 136 45
0.203922 180 136 45 0.207843 181 138 46
0.207843 181 138 46 0.211765 182 140 47
0.211765 182 140 47 0.215686 183 143 48
0.215686 183 143 48 0.219608 184 145 49
0.219608 184 145 49 0.223529 185 147 51
0.223529 185 147 51 0.227451 186 149 52
0.227451 186 149 52 0.231373 187 151 53
0.231373 187 151 53 0.235294 188 153 54
0.235294 188 153 54 0.239216 189 155 56
0.239216 189 155 56 0.243137 191 157 57
0.243137 191 157 57 0.247059 192 159 58
0.247059 192 159 58 0.250980 193 162 60
0.250980 193 162 60 0.254902 194 164 62
0.254902 194 164 62 0.258824 195 166 63
0.258824 195 166 63 0.262745 196 168 65
0.262745 196 168 65 0.266667 197 171 67
0.266667 197 171 67 0.270588 198 173 69
0.270588 198 173 69 0.274510 200 175 71
0.274510 200 175 71 0.278431 201 177 73
0.278431 201 177 73 0.282353 202 180 75
0.282353 202 180 75 0.286275 203 182 77
0.286275 203 182 77 0.290196 205 184 79
0.290196 205 184 79 0.294118 206 187 82
0.294118 206 187 82 0.298039 207 189 84
0.298039 207 189 84 0.301961 208 191 87
0.301961 208 191 87 0.305882 209 193 89
0.305882 209 193 89 0.309804 211 195 92
0.309804 211 195 92 0.313725 212 198 95
0.313725 212 198 95 0.317647 213 200 97
0.317647 213 200 97 0.321569 214 202 100
0.321569 214 202 100 0.325490 215 204 103
0.325490 215 204 103 0.329412 216 206 106
0.329412 216 206 106 0.333333 217 207 109
0.333333 217 207 109 0.337255 218 209 111
0.337255 218 209 111 0.341176 219 211 114
0.341176 219 211 114 0.345098 220 213 117
0.345098 220 213 117 0.349020 221 214 120
0.349020 221 214 120 0.352941 222 216 123
0.352941 222 216 123 0.356863 222 217 126
0.356863 222 217 126 0.360784 223 219 128
0.360784 223 219 128 0.364706 224 220 131
0.364706 224 220 131 0.368627 224 221 134
0.368627 224 221 134 0.372549 225 222 137
0.372549 225 222 137 0.376471 225 223 139
0.376471 225 223 139 0.380392 226 224 142
0.380392 226 224 142 0.384314 226 225 144
0.384314 226 225 144 0.388235 226 226 147
0.388235 226 226 147 0.392157 227 227 149
0.392157 227 227 149 0.396078 227 228 152
0.396078 227 228 152 0.400000 227 229 154
0.400000 227 229 154 0.403922 227 229 157
0.403922 227 229 157 0.407843 227 230 159
0.407843 227 230 159 0.411765 227 231 161
0.411765 227 231 161 0.415686 226 231 163
0.415686 226 231 163 0.419608 226 232 166
0.419608 226 232 166 0.423529 226 232 168
0.423529 226 232 168 0.427451 225 233 170
0.427451 225 233 170 0.431373 225 233 172
0.431373 225 233 172 0.435294 224 234 174
0.435294 224 234 174 0.439216 224 234 176
0.439216 224 234 176 0.443137 223 234 178
0.443137 223 234 178 0.447059 222 234 180
0.447059 222 234 180 0.450980 221 235 182
0.450980 221 235 182 0.454902 220 235 183
0.454902 220 235 183 0.458824 219 235 185
0.458824 219 235 185 0.462745 218 235 187
0.462745 218 235 187 0.466667 217 235 188
0.466667 217 235 188 0.470588 215 235 190
0.470588 215 235 190 0.474510 214 236 192
0.474510 214 236 192 0.478431 212 236 193
0.478431 212 236 193 0.482353 211 236 195
0.482353 211 236 195 0.486275 209 236 196
0.486275 209 236 196 0.490196 208 235 197
0.490196 208 235 197 0.494118 206 235 199
0.494118 206 235 199 0.498039 204 235 200
0.498039 204 235 200 0.501961 202 235 201
0.501961 202 235 201 0.505882 200 235 202
0.505882 200 235 202 0.509804 198 235 203
0.509804 198 235 203 0.513725 196 234 204
0.513725 196 234 204 0.517647 194 234 205
0.517647 194 234 205 0.521569 191 234 206
0.521569 191 234 206 0.525490 189 233 207
0.525490 189 233 207 0.529412 187 233 208
0.529412 187 233 208 0.533333 184 232 209
0.533333 184 232 209 0.537255 182 232 210
0.537255 182 232 210 0.541176 179 231 211
0.541176 179 231 211 0.545098 177 230 211
0.545098 177 230 211 0.549020 174 230 212
0.549020 174 230 212 0.552941 171 229 212
0.552941 171 229 212 0.556863 169 228 213
0.556863 169 228 213 0.560784 166 227 213
0.560784 166 227 213 0.564706 163 227 214
0.564706 163 227 214 0.568627 160 226 214
0.568627 160 226 214 0.572549 158 225 215
0.572549 158 225 215 0.576471 155 224 215
0.576471 155 224 215 0.580392 152 223 215
0.580392 152 223 215 0.584314 149 221 215
0.584314 149 221 215 0.588235 146 220 215
0.588235 146 220 215 0.592157 143 219 216
0.592157 143 219 216 0.596078 141 218 216
0.596078 141 218 216 0.600000 138 216 216
0.600000 138 216 216 0.603922 135 215 216
0.603922 135 215 216 0.607843 132 214 216
0.607843 132 214 216 0.611765 130 212 216
0.611765 130 212 216 0.615686 127 211 215
0.615686 127 211 215 0.619608 124 209 215
0.619608 124 209 215 0.623529 122 208 215
0.623529 122 208 215 0.627451 119 206 215
0.627451 119 206 215 0.631373 117 204 214
0.631373 117 204 214 0.635294 114 203 214
0.635294 114 203 214 0.639216 112 201 214
0.639216 112 201 214 0.643137 110 199 213
0.643137 110 199 213 0.647059 107 198 213
0.647059 107 198 213 0.650980 105 196 213
0.650980 105 196 213 0.654902 103 194 212
0.654902 103 194 212 0.658824 101 193 212
0.658824 101 193 212 0.662745 99 191 211
0.662745 99 191 211 0.666667 97 189 211
0.666667 97 189 211 0.670588 96 187 210
0.670588 96 187 210 0.674510 94 186 209
0.674510 94 186 209 0.678431 92 184 209
0.678431 92 184 209 0.682353 91 182 208
0.682353 91 182 208 0.686275 89 180 208
0.686275 89 180 208 0.690196 88 178 207
0.690196 88 178 207 0.694118 87 177 206
0.694118 87 177 206 0.698039 85 175 206
0.698039 85 175 206 0.701961 84 173 205
0.701961 84 173 205 0.705882 83 171 204
0.705882 83 171 204 0.709804 82 170 204
0.709804 82 170 204 0.713725 80 168 203
0.713725 80 168 203 0.717647 79 166 202
0.717647 79 166 202 0.721569 78 164 201
0.721569 78 164 201 0.725490 77 163 201
0.725490 77 163 201 0.729412 76 161 200
0.729412 76 161 200 0.733333 75 159 199
0.733333 75 159 199 0.737255 74 157 199
0.737255 74 157 199 0.741176 74 156 198
0.741176 74 156 198 0.745098 73 154 197
0.745098 73 154 197 0.749020 72 152 197
0.749020 72 152 197 0.752941 71 150 196
0.752941 71 150 196 0.756863 70 149 195
0.756863 70 149 195 0.760784 69 147 194
0.760784 69 147 194 0.764706 69 145 194
0.764706 69 145 194 0.768627 68 144 193
0.768627 68 144 193 0.772549 67 142 192
0.772549 67 142 192 0.776471 66 140 191
0.776471 66 140 191 0.780392 66 138 191
0.780392 66 138 191 0.784314 65 137 190
0.784314 65 137 190 0.788235 64 135 189
0.788235 64 135 189 0.792157 64 133 189
0.792157 64 133 189 0.796078 63 132 188
0.796078 63 132 188 0.800000 62 130 187
0.800000 62 130 187 0.803922 61 129 187
0.803922 61 129 187 0.807843 61 127 186
0.807843 61 127 186 0.811765 60 125 185
0.811765 60 125 185 0.815686 59 124 184
0.815686 59 124 184 0.819608 59 122 184
0.819608 59 122 184 0.823529 58 120 183
0.823529 58 120 183 0.827451 57 119 182
0.827451 57 119 182 0.831373 57 117 182
0.831373 57 117 182 0.835294 56 116 181
0.835294 56 116 181 0.839216 56 114 180
0.839216 56 114 180 0.843137 55 112 180
0.843137 55 112 180 0.847059 54 111 179
0.847059 54 111 179 0.850980 54 109 178
0.850980 54 109 178 0.854902 53 108 177
0.854902 53 108 177 0.858824 52 106 177
0.858824 52 106 177 0.862745 52 104 176
0.862745 52 104 176 0.866667 51 103 175
0.866667 51 103 175 0.870588 50 101 175
0.870588 50 101 175 0.874510 50 100 174
0.874510 50 100 174 0.878431 49 98 173
0.878431 49 98 173 0.882353 48 97 173
0.882353 48 97 173 0.886275 48 95 172
0.886275 48 95 172 0.890196 47 94 171
0.890196 47 94 171 0.894118 47 92 171
0.894118 47 92 171 0.898039 46 90 170
0.898039 46 90 170 0.901961 45 89 169
0.901961 45 89 169 0.905882 45 87 169
0.905882 45 87 169 0.909804 44 86 168
0.909804 44 86 168 0.913725 43 84 167
0.913725 43 84 167 0.917647 43 83 167
0.917647 43 83 167 0.921569 42 81 166
0.921569 42 81 166 0.925490 41 80 165
0.925490 41 80 165 0.929412 41 78 165
0.929412 41 78 165 0.933333 40 77 164
0.933333 40 77 164 0.937255 39 75 163
0.937255 39 75 163 0.941176 39 74 163
0.941176 39 74 163 0.945098 38 72 162
0.945098 38 72 162 0.949020 37 71 161
0.949020 37 71 161 0.952941 37 69 161
0.952941 37 69 161 0.956863 36 68 160
0.956863 36 68 160 0.960784 35 66 160
0.960784 35 66 160 0.964706 34 65 159
0.964706 34 65 159 0.968627 34 63 158
0.968627 34 63 158 0.972549 33 62 158
0.972549 33 62 158 0.976471 32 60 157
0.976471 32 60 157 0.980392 31 59 156
0.980392 31 59 156 0.984314 30 57 156
0.984314 30 57 156 0.988235 29 56 155
0.988235 29 56 155 0.992157 28 54 154
0.992157 28 54 154 0.996078 27 53 154
0.996078 27 53 154 1.000000 26 51 153
N 255 255 255
B 127 25 0
F 26 51 153
MintPy-1.6.2/src/mintpy/data/colormaps/romanian.cpt 0000664 0000000 0000000 00000023720 15032632755 0022307 0 ustar 00root root 0000000 0000000 #
# romanian
# self-defined cpt
0.000000 0 44 223 0.003922 2 45 222
0.003922 2 45 222 0.007843 4 47 222
0.007843 4 47 222 0.011765 5 48 221
0.011765 5 48 221 0.015686 7 50 221
0.015686 7 50 221 0.019608 9 51 220
0.019608 9 51 220 0.023529 11 52 220
0.023529 11 52 220 0.027451 13 54 219
0.027451 13 54 219 0.031373 14 55 219
0.031373 14 55 219 0.035294 16 57 219
0.035294 16 57 219 0.039216 18 58 218
0.039216 18 58 218 0.043137 20 60 218
0.043137 20 60 218 0.047059 22 61 217
0.047059 22 61 217 0.050980 23 62 217
0.050980 23 62 217 0.054902 25 64 216
0.054902 25 64 216 0.058824 27 65 216
0.058824 27 65 216 0.062745 29 67 216
0.062745 29 67 216 0.066667 31 68 215
0.066667 31 68 215 0.070588 33 69 215
0.070588 33 69 215 0.074510 34 71 214
0.074510 34 71 214 0.078431 36 72 214
0.078431 36 72 214 0.082353 38 74 213
0.082353 38 74 213 0.086275 40 75 213
0.086275 40 75 213 0.090196 42 76 213
0.090196 42 76 213 0.094118 43 78 212
0.094118 43 78 212 0.098039 45 79 212
0.098039 45 79 212 0.101961 47 81 211
0.101961 47 81 211 0.105882 49 82 211
0.105882 49 82 211 0.109804 51 83 210
0.109804 51 83 210 0.113725 52 85 210
0.113725 52 85 210 0.117647 54 86 209
0.117647 54 86 209 0.121569 56 88 209
0.121569 56 88 209 0.125490 58 89 209
0.125490 58 89 209 0.129412 60 90 208
0.129412 60 90 208 0.133333 61 92 208
0.133333 61 92 208 0.137255 63 93 207
0.137255 63 93 207 0.141176 65 95 207
0.141176 65 95 207 0.145098 67 96 206
0.145098 67 96 206 0.149020 69 97 206
0.149020 69 97 206 0.152941 70 99 206
0.152941 70 99 206 0.156863 72 100 205
0.156863 72 100 205 0.160784 74 102 205
0.160784 74 102 205 0.164706 76 103 204
0.164706 76 103 204 0.168627 78 105 204
0.168627 78 105 204 0.172549 79 106 203
0.172549 79 106 203 0.176471 81 107 203
0.176471 81 107 203 0.180392 83 109 202
0.180392 83 109 202 0.184314 85 110 202
0.184314 85 110 202 0.188235 87 112 202
0.188235 87 112 202 0.192157 88 113 201
0.192157 88 113 201 0.196078 90 114 201
0.196078 90 114 201 0.200000 92 116 200
0.200000 92 116 200 0.203922 94 117 200
0.203922 94 117 200 0.207843 96 119 199
0.207843 96 119 199 0.211765 98 120 199
0.211765 98 120 199 0.215686 99 121 199
0.215686 99 121 199 0.219608 101 123 198
0.219608 101 123 198 0.223529 103 124 198
0.223529 103 124 198 0.227451 105 126 197
0.227451 105 126 197 0.231373 107 127 197
0.231373 107 127 197 0.235294 108 128 196
0.235294 108 128 196 0.239216 110 130 196
0.239216 110 130 196 0.243137 112 131 195
0.243137 112 131 195 0.247059 114 133 195
0.247059 114 133 195 0.250980 116 134 194
0.250980 116 134 194 0.254902 118 135 191
0.254902 118 135 191 0.258824 120 136 189
0.258824 120 136 189 0.262745 122 138 186
0.262745 122 138 186 0.266667 124 139 183
0.266667 124 139 183 0.270588 127 140 180
0.270588 127 140 180 0.274510 129 141 178
0.274510 129 141 178 0.278431 131 142 175
0.278431 131 142 175 0.282353 133 144 172
0.282353 133 144 172 0.286275 135 145 170
0.286275 135 145 170 0.290196 137 146 167
0.290196 137 146 167 0.294118 140 147 164
0.294118 140 147 164 0.298039 142 148 161
0.298039 142 148 161 0.301961 144 150 159
0.301961 144 150 159 0.305882 146 151 156
0.305882 146 151 156 0.309804 148 152 153
0.309804 148 152 153 0.313725 150 153 150
0.313725 150 153 150 0.317647 153 154 148
0.317647 153 154 148 0.321569 155 156 145
0.321569 155 156 145 0.325490 157 157 142
0.325490 157 157 142 0.329412 159 158 140
0.329412 159 158 140 0.333333 161 159 137
0.333333 161 159 137 0.337255 163 160 134
0.337255 163 160 134 0.341176 166 162 131
0.341176 166 162 131 0.345098 168 163 129
0.345098 168 163 129 0.349020 170 164 126
0.349020 170 164 126 0.352941 172 165 123
0.352941 172 165 123 0.356863 174 166 120
0.356863 174 166 120 0.360784 176 168 118
0.360784 176 168 118 0.364706 179 169 115
0.364706 179 169 115 0.368627 181 170 112
0.368627 181 170 112 0.372549 183 171 109
0.372549 183 171 109 0.376471 185 172 107
0.376471 185 172 107 0.380392 187 174 104
0.380392 187 174 104 0.384314 189 175 101
0.384314 189 175 101 0.388235 192 176 99
0.388235 192 176 99 0.392157 194 177 96
0.392157 194 177 96 0.396078 196 178 93
0.396078 196 178 93 0.400000 198 180 90
0.400000 198 180 90 0.403922 200 181 88
0.403922 200 181 88 0.407843 202 182 85
0.407843 202 182 85 0.411765 205 183 82
0.411765 205 183 82 0.415686 207 184 80
0.415686 207 184 80 0.419608 209 186 77
0.419608 209 186 77 0.423529 211 187 74
0.423529 211 187 74 0.427451 213 188 71
0.427451 213 188 71 0.431373 215 189 69
0.431373 215 189 69 0.435294 218 190 66
0.435294 218 190 66 0.439216 220 192 63
0.439216 220 192 63 0.443137 222 193 60
0.443137 222 193 60 0.447059 224 194 58
0.447059 224 194 58 0.450980 226 195 55
0.450980 226 195 55 0.454902 229 196 52
0.454902 229 196 52 0.458824 231 198 50
0.458824 231 198 50 0.462745 233 199 47
0.462745 233 199 47 0.466667 235 200 44
0.466667 235 200 44 0.470588 237 201 41
0.470588 237 201 41 0.474510 239 202 39
0.474510 239 202 39 0.478431 242 204 36
0.478431 242 204 36 0.482353 244 205 33
0.482353 244 205 33 0.486275 246 206 30
0.486275 246 206 30 0.490196 248 207 28
0.490196 248 207 28 0.494118 250 208 25
0.494118 250 208 25 0.498039 252 210 22
0.498039 252 210 22 0.501961 253 209 21
0.501961 253 209 21 0.505882 253 208 21
0.505882 253 208 21 0.509804 252 207 21
0.509804 252 207 21 0.513725 252 205 21
0.513725 252 205 21 0.517647 252 204 21
0.517647 252 204 21 0.521569 251 203 22
0.521569 251 203 22 0.525490 251 201 22
0.525490 251 201 22 0.529412 251 200 22
0.529412 251 200 22 0.533333 250 198 22
0.533333 250 198 22 0.537255 250 197 22
0.537255 250 197 22 0.541176 249 196 22
0.541176 249 196 22 0.545098 249 194 22
0.545098 249 194 22 0.549020 249 193 23
0.549020 249 193 23 0.552941 248 192 23
0.552941 248 192 23 0.556863 248 190 23
0.556863 248 190 23 0.560784 247 189 23
0.560784 247 189 23 0.564706 247 187 23
0.564706 247 187 23 0.568627 247 186 23
0.568627 247 186 23 0.572549 246 185 23
0.572549 246 185 23 0.576471 246 183 23
0.576471 246 183 23 0.580392 246 182 24
0.580392 246 182 24 0.584314 245 180 24
0.584314 245 180 24 0.588235 245 179 24
0.588235 245 179 24 0.592157 244 178 24
0.592157 244 178 24 0.596078 244 176 24
0.596078 244 176 24 0.600000 244 175 24
0.600000 244 175 24 0.603922 243 174 24
0.603922 243 174 24 0.607843 243 172 25
0.607843 243 172 25 0.611765 242 171 25
0.611765 242 171 25 0.615686 242 169 25
0.615686 242 169 25 0.619608 242 168 25
0.619608 242 168 25 0.623529 241 167 25
0.623529 241 167 25 0.627451 241 165 25
0.627451 241 165 25 0.631373 240 164 25
0.631373 240 164 25 0.635294 240 163 25
0.635294 240 163 25 0.639216 240 161 26
0.639216 240 161 26 0.643137 239 160 26
0.643137 239 160 26 0.647059 239 158 26
0.647059 239 158 26 0.650980 239 157 26
0.650980 239 157 26 0.654902 238 156 26
0.654902 238 156 26 0.658824 238 154 26
0.658824 238 154 26 0.662745 237 153 26
0.662745 237 153 26 0.666667 237 151 27
0.666667 237 151 27 0.670588 237 150 27
0.670588 237 150 27 0.674510 236 149 27
0.674510 236 149 27 0.678431 236 147 27
0.678431 236 147 27 0.682353 235 146 27
0.682353 235 146 27 0.686275 235 145 27
0.686275 235 145 27 0.690196 235 143 27
0.690196 235 143 27 0.694118 234 142 27
0.694118 234 142 27 0.698039 234 140 28
0.698039 234 140 28 0.701961 233 139 28
0.701961 233 139 28 0.705882 233 138 28
0.705882 233 138 28 0.709804 233 136 28
0.709804 233 136 28 0.713725 232 135 28
0.713725 232 135 28 0.717647 232 133 28
0.717647 232 133 28 0.721569 232 132 28
0.721569 232 132 28 0.725490 231 131 29
0.725490 231 131 29 0.729412 231 129 29
0.729412 231 129 29 0.733333 230 128 29
0.733333 230 128 29 0.737255 230 127 29
0.737255 230 127 29 0.741176 230 125 29
0.741176 230 125 29 0.745098 229 124 29
0.745098 229 124 29 0.749020 229 122 29
0.749020 229 122 29 0.752941 228 121 29
0.752941 228 121 29 0.756863 228 119 30
0.756863 228 119 30 0.760784 228 118 30
0.760784 228 118 30 0.764706 227 116 30
0.764706 227 116 30 0.768627 227 114 30
0.768627 227 114 30 0.772549 227 113 30
0.772549 227 113 30 0.776471 226 111 30
0.776471 226 111 30 0.780392 226 109 30
0.780392 226 109 30 0.784314 226 108 31
0.784314 226 108 31 0.788235 225 106 31
0.788235 225 106 31 0.792157 225 105 31
0.792157 225 105 31 0.796078 225 103 31
0.796078 225 103 31 0.800000 224 101 31
0.800000 224 101 31 0.803922 224 100 31
0.803922 224 100 31 0.807843 224 98 31
0.807843 224 98 31 0.811765 223 96 31
0.811765 223 96 31 0.815686 223 95 32
0.815686 223 95 32 0.819608 222 93 32
0.819608 222 93 32 0.823529 222 91 32
0.823529 222 91 32 0.827451 222 90 32
0.827451 222 90 32 0.831373 221 88 32
0.831373 221 88 32 0.835294 221 86 32
0.835294 221 86 32 0.839216 221 85 32
0.839216 221 85 32 0.843137 220 83 33
0.843137 220 83 33 0.847059 220 82 33
0.847059 220 82 33 0.850980 220 80 33
0.850980 220 80 33 0.854902 219 78 33
0.854902 219 78 33 0.858824 219 77 33
0.858824 219 77 33 0.862745 219 75 33
0.862745 219 75 33 0.866667 218 73 33
0.866667 218 73 33 0.870588 218 72 33
0.870588 218 72 33 0.874510 218 70 34
0.874510 218 70 34 0.878431 217 69 34
0.878431 217 69 34 0.882353 217 67 34
0.882353 217 67 34 0.886275 217 65 34
0.886275 217 65 34 0.890196 216 64 34
0.890196 216 64 34 0.894118 216 62 34
0.894118 216 62 34 0.898039 215 60 34
0.898039 215 60 34 0.901961 215 59 35
0.901961 215 59 35 0.905882 215 57 35
0.905882 215 57 35 0.909804 214 55 35
0.909804 214 55 35 0.913725 214 54 35
0.913725 214 54 35 0.917647 214 52 35
0.917647 214 52 35 0.921569 213 51 35
0.921569 213 51 35 0.925490 213 49 35
0.925490 213 49 35 0.929412 213 47 35
0.929412 213 47 35 0.933333 212 46 36
0.933333 212 46 36 0.937255 212 44 36
0.937255 212 44 36 0.941176 212 42 36
0.941176 212 42 36 0.945098 211 41 36
0.945098 211 41 36 0.949020 211 39 36
0.949020 211 39 36 0.952941 211 37 36
0.952941 211 37 36 0.956863 210 36 36
0.956863 210 36 36 0.960784 210 34 37
0.960784 210 34 37 0.964706 209 32 37
0.964706 209 32 37 0.968627 209 31 37
0.968627 209 31 37 0.972549 209 29 37
0.972549 209 29 37 0.976471 208 28 37
0.976471 208 28 37 0.980392 208 26 37
0.980392 208 26 37 0.984314 208 24 37
0.984314 208 24 37 0.988235 207 23 37
0.988235 207 23 37 0.992157 207 21 38
0.992157 207 21 38 0.996078 207 19 38
0.996078 207 19 38 1.000000 206 18 38
N 255 255 255
B 0 44 223
F 206 18 38
MintPy-1.6.2/src/mintpy/data/colormaps/seminf-haxby.cpt 0000664 0000000 0000000 00000002545 15032632755 0023077 0 ustar 00root root 0000000 0000000 # seminf-haxby.cpt
#
# This palette intended for use on semi-infinite (bottomless)
# data. The upper part is a subset of the haxby palette, but
# with the upper fade to with truncated at full saturation red.
# The lower part is simply a fade from high saturation blue down
# to white.
#
# J.J.Green 2004, contributed to the public domain
# $Id: seminf-haxby.cpt,v 1.1 2004/02/25 18:15:50 jjg Exp $
#
# COLOR_MODEL = RGB
0.00 255 255 255 1.25 255 255 255
1.25 208 216 251 2.50 208 216 251
2.50 186 197 247 3.75 186 197 247
3.75 143 161 241 5.00 143 161 241
5.00 97 122 236 6.25 97 122 236
6.25 0 39 224 7.50 0 39 224
7.50 25 101 240 8.75 25 101 240
8.75 12 129 248 10.00 12 129 248
10.0 24 175 255 11.25 24 175 255
11.25 49 190 255 12.50 49 190 255
12.50 67 202 255 13.75 67 202 255
13.75 96 225 240 15.00 96 225 240
15.00 105 235 225 16.25 105 235 225
16.25 123 235 200 17.50 123 235 200
17.50 138 236 174 18.75 138 236 174
18.75 172 245 168 20.00 172 245 168
20.00 205 255 162 21.25 205 255 162
21.25 223 245 141 22.50 223 245 141
22.50 240 236 120 23.75 240 236 120
23.75 247 215 103 25.00 247 215 103
25.00 255 189 86 26.25 255 189 86
26.25 255 160 68 27.50 255 160 68
27.50 244 116 74 28.75 244 116 74
28.75 238 79 77 30.00 238 79 77
B 255 255 255
F 238 79 77
N 0 0 0
MintPy-1.6.2/src/mintpy/data/colormaps/temp-c.cpt 0000664 0000000 0000000 00000001652 15032632755 0021670 0 ustar 00root root 0000000 0000000 # COLOR MODEL = RGB
-14 74 0 29 -12 74 0 29
-12 49 0 126 -10 49 0 126
-10 0 0 129 -8 0 0 129
-8 0 50 179 -6 0 50 179
-6 0 0 255 -4 0 0 255
-4 0 125 255 -2 0 125 255
-2 0 189 255 0 0 189 255
0 23 215 139 2 23 215 139
2 57 173 115 4 57 173 115
4 42 169 42 6 42 169 42
6 42 200 42 8 42 200 42
8 0 255 49 10 0 255 49
10 83 255 0 12 83 255 0
12 159 255 0 14 159 255 0
14 255 255 0 16 255 255 0
16 255 204 0 18 255 204 0
18 255 152 0 20 255 152 0
20 255 101 0 22 255 101 0
22 255 84 0 24 255 84 0
24 255 0 0 26 255 0 0
26 255 0 127 28 255 0 127
28 255 34 144 30 255 34 144
30 255 94 177 32 255 94 177
32 255 134 194 34 255 134 194
34 255 174 215 36 255 174 215
36 255 215 235 38 255 215 235
38 255 255 255 40 255 255 255
MintPy-1.6.2/src/mintpy/data/colormaps/temperature.cpt 0000664 0000000 0000000 00000001521 15032632755 0023033 0 ustar 00root root 0000000 0000000 # extracted from GRID-Arendal
# http://www.grida.no/graphicslib/detail/mean-surface-temperature_c7e4
#
# COLOR_MODEL = RGB
17.00 30 92 179 17.33 30 92 179
17.33 23 111 193 17.67 23 111 193
17.67 11 142 216 18.00 11 142 216
18.00 4 161 230 18.33 4 161 230
18.33 25 181 241 18.67 25 181 241
18.67 51 188 207 19.00 51 188 207
19.00 102 204 206 19.33 102 204 206
19.33 153 219 184 19.67 153 219 184
19.67 192 229 136 20.00 192 229 136
20.00 204 230 75 20.33 204 230 75
20.33 243 240 29 20.67 243 240 29
20.67 254 222 39 21.00 254 222 39
21.00 252 199 7 21.33 252 199 7
21.33 248 157 14 21.67 248 157 14
21.67 245 114 21 22.00 245 114 21
22.00 241 71 28 22.33 241 71 28
22.33 219 30 38 22.67 219 30 38
22.67 164 38 44 23.00 164 38 44
B 0 0 0
F 255 255 255
N 255 0 0
MintPy-1.6.2/src/mintpy/data/colormaps/vik.cpt 0000664 0000000 0000000 00000023546 15032632755 0021302 0 ustar 00root root 0000000 0000000 #
# vik
# www.fabiocrameri.ch/visualisation
0.000000 0 18 97 0.003922 1 20 98
0.003922 1 20 98 0.007843 1 21 99
0.007843 1 21 99 0.011765 1 23 100
0.011765 1 23 100 0.015686 1 24 101
0.015686 1 24 101 0.019608 1 26 102
0.019608 1 26 102 0.023529 2 28 103
0.023529 2 28 103 0.027451 2 29 104
0.027451 2 29 104 0.031373 2 31 105
0.031373 2 31 105 0.035294 2 32 106
0.035294 2 32 106 0.039216 2 34 107
0.039216 2 34 107 0.043137 2 35 108
0.043137 2 35 108 0.047059 2 37 109
0.047059 2 37 109 0.050980 2 39 110
0.050980 2 39 110 0.054902 2 40 111
0.054902 2 40 111 0.058824 2 42 112
0.058824 2 42 112 0.062745 2 43 113
0.062745 2 43 113 0.066667 2 45 114
0.066667 2 45 114 0.070588 2 46 115
0.070588 2 46 115 0.074510 2 48 116
0.074510 2 48 116 0.078431 2 49 117
0.078431 2 49 117 0.082353 2 51 118
0.082353 2 51 118 0.086275 2 52 119
0.086275 2 52 119 0.090196 2 54 120
0.090196 2 54 120 0.094118 2 55 121
0.094118 2 55 121 0.098039 2 57 122
0.098039 2 57 122 0.101961 2 58 123
0.101961 2 58 123 0.105882 3 60 124
0.105882 3 60 124 0.109804 3 62 125
0.109804 3 62 125 0.113725 3 63 126
0.113725 3 63 126 0.117647 3 65 127
0.117647 3 65 127 0.121569 3 66 128
0.121569 3 66 128 0.125490 3 68 129
0.125490 3 68 129 0.129412 3 69 130
0.129412 3 69 130 0.133333 3 71 131
0.133333 3 71 131 0.137255 3 73 132
0.137255 3 73 132 0.141176 3 74 133
0.141176 3 74 133 0.145098 4 76 134
0.145098 4 76 134 0.149020 4 77 135
0.149020 4 77 135 0.152941 4 79 136
0.152941 4 79 136 0.156863 5 81 137
0.156863 5 81 137 0.160784 5 82 138
0.160784 5 82 138 0.164706 6 84 139
0.164706 6 84 139 0.168627 6 86 140
0.168627 6 86 140 0.172549 7 87 141
0.172549 7 87 141 0.176471 8 89 143
0.176471 8 89 143 0.180392 9 91 144
0.180392 9 91 144 0.184314 11 93 145
0.184314 11 93 145 0.188235 12 94 146
0.188235 12 94 146 0.192157 14 96 147
0.192157 14 96 147 0.196078 16 98 148
0.196078 16 98 148 0.200000 17 100 150
0.200000 17 100 150 0.203922 19 102 151
0.203922 19 102 151 0.207843 21 103 152
0.207843 21 103 152 0.211765 23 105 153
0.211765 23 105 153 0.215686 25 107 154
0.215686 25 107 154 0.219608 28 109 156
0.219608 28 109 156 0.223529 30 111 157
0.223529 30 111 157 0.227451 32 113 158
0.227451 32 113 158 0.231373 35 115 160
0.231373 35 115 160 0.235294 37 117 161
0.235294 37 117 161 0.239216 40 119 162
0.239216 40 119 162 0.243137 43 121 164
0.243137 43 121 164 0.247059 45 123 165
0.247059 45 123 165 0.250980 48 125 166
0.250980 48 125 166 0.254902 51 127 168
0.254902 51 127 168 0.258824 54 129 169
0.258824 54 129 169 0.262745 57 131 171
0.262745 57 131 171 0.266667 60 133 172
0.266667 60 133 172 0.270588 63 135 173
0.270588 63 135 173 0.274510 66 137 175
0.274510 66 137 175 0.278431 69 139 176
0.278431 69 139 176 0.282353 72 141 178
0.282353 72 141 178 0.286275 75 144 179
0.286275 75 144 179 0.290196 78 146 180
0.290196 78 146 180 0.294118 81 148 182
0.294118 81 148 182 0.298039 84 150 183
0.298039 84 150 183 0.301961 87 152 185
0.301961 87 152 185 0.305882 90 154 186
0.305882 90 154 186 0.309804 93 156 187
0.309804 93 156 187 0.313725 97 158 189
0.313725 97 158 189 0.317647 100 160 190
0.317647 100 160 190 0.321569 103 162 192
0.321569 103 162 192 0.325490 106 164 193
0.325490 106 164 193 0.329412 109 166 194
0.329412 109 166 194 0.333333 113 168 196
0.333333 113 168 196 0.337255 116 170 197
0.337255 116 170 197 0.341176 119 172 198
0.341176 119 172 198 0.345098 122 174 200
0.345098 122 174 200 0.349020 125 176 201
0.349020 125 176 201 0.352941 128 178 202
0.352941 128 178 202 0.356863 132 180 204
0.356863 132 180 204 0.360784 135 182 205
0.360784 135 182 205 0.364706 138 184 206
0.364706 138 184 206 0.368627 141 186 208
0.368627 141 186 208 0.372549 144 188 209
0.372549 144 188 209 0.376471 148 190 210
0.376471 148 190 210 0.380392 151 192 212
0.380392 151 192 212 0.384314 154 194 213
0.384314 154 194 213 0.388235 157 196 214
0.388235 157 196 214 0.392157 160 197 216
0.392157 160 197 216 0.396078 163 199 217
0.396078 163 199 217 0.400000 167 201 218
0.400000 167 201 218 0.403922 170 203 220
0.403922 170 203 220 0.407843 173 205 221
0.407843 173 205 221 0.411765 176 207 222
0.411765 176 207 222 0.415686 179 209 223
0.415686 179 209 223 0.419608 182 211 225
0.419608 182 211 225 0.423529 186 213 226
0.423529 186 213 226 0.427451 189 214 227
0.427451 189 214 227 0.431373 192 216 228
0.431373 192 216 228 0.435294 195 218 229
0.435294 195 218 229 0.439216 198 219 230
0.439216 198 219 230 0.443137 201 221 231
0.443137 201 221 231 0.447059 204 223 232
0.447059 204 223 232 0.450980 207 224 232
0.450980 207 224 232 0.454902 210 225 233
0.454902 210 225 233 0.458824 213 227 233
0.458824 213 227 233 0.462745 216 228 233
0.462745 216 228 233 0.466667 219 229 233
0.466667 219 229 233 0.470588 222 230 233
0.470588 222 230 233 0.474510 224 230 233
0.474510 224 230 233 0.478431 226 231 232
0.478431 226 231 232 0.482353 229 231 232
0.482353 229 231 232 0.486275 231 231 231
0.486275 231 231 231 0.490196 232 231 229
0.490196 232 231 229 0.494118 234 230 228
0.494118 234 230 228 0.498039 235 230 226
0.498039 235 230 226 0.501961 236 229 224
0.501961 236 229 224 0.505882 237 228 222
0.505882 237 228 222 0.509804 238 227 220
0.509804 238 227 220 0.513725 238 225 218
0.513725 238 225 218 0.517647 238 224 216
0.517647 238 224 216 0.521569 238 222 213
0.521569 238 222 213 0.525490 238 221 211
0.525490 238 221 211 0.529412 238 219 208
0.529412 238 219 208 0.533333 238 217 205
0.533333 238 217 205 0.537255 237 215 203
0.537255 237 215 203 0.541176 237 213 200
0.541176 237 213 200 0.545098 236 211 197
0.545098 236 211 197 0.549020 236 209 195
0.549020 236 209 195 0.552941 235 208 192
0.552941 235 208 192 0.556863 234 206 189
0.556863 234 206 189 0.560784 233 204 186
0.560784 233 204 186 0.564706 233 202 184
0.564706 233 202 184 0.568627 232 200 181
0.568627 232 200 181 0.572549 231 198 178
0.572549 231 198 178 0.576471 230 196 176
0.576471 230 196 176 0.580392 229 193 173
0.580392 229 193 173 0.584314 228 191 170
0.584314 228 191 170 0.588235 228 190 168
0.588235 228 190 168 0.592157 227 188 165
0.592157 227 188 165 0.596078 226 186 162
0.596078 226 186 162 0.600000 225 184 160
0.600000 225 184 160 0.603922 224 182 157
0.603922 224 182 157 0.607843 223 180 154
0.607843 223 180 154 0.611765 223 178 152
0.611765 223 178 152 0.615686 222 176 149
0.615686 222 176 149 0.619608 221 174 147
0.619608 221 174 147 0.623529 220 172 144
0.623529 220 172 144 0.627451 219 170 141
0.627451 219 170 141 0.631373 219 168 139
0.631373 219 168 139 0.635294 218 166 136
0.635294 218 166 136 0.639216 217 164 134
0.639216 217 164 134 0.643137 216 162 131
0.643137 216 162 131 0.647059 215 160 129
0.647059 215 160 129 0.650980 214 159 126
0.650980 214 159 126 0.654902 214 157 124
0.654902 214 157 124 0.658824 213 155 121
0.658824 213 155 121 0.662745 212 153 119
0.662745 212 153 119 0.666667 211 151 116
0.666667 211 151 116 0.670588 211 149 114
0.670588 211 149 114 0.674510 210 148 112
0.674510 210 148 112 0.678431 209 146 109
0.678431 209 146 109 0.682353 208 144 107
0.682353 208 144 107 0.686275 207 142 104
0.686275 207 142 104 0.690196 207 140 102
0.690196 207 140 102 0.694118 206 139 100
0.694118 206 139 100 0.698039 205 137 97
0.698039 205 137 97 0.701961 204 135 95
0.701961 204 135 95 0.705882 204 133 93
0.705882 204 133 93 0.709804 203 131 90
0.709804 203 131 90 0.713725 202 130 88
0.713725 202 130 88 0.717647 201 128 86
0.717647 201 128 86 0.721569 201 126 83
0.721569 201 126 83 0.725490 200 124 81
0.725490 200 124 81 0.729412 199 123 79
0.729412 199 123 79 0.733333 198 121 76
0.733333 198 121 76 0.737255 198 119 74
0.737255 198 119 74 0.741176 197 117 72
0.741176 197 117 72 0.745098 196 116 69
0.745098 196 116 69 0.749020 195 114 67
0.749020 195 114 67 0.752941 194 112 65
0.752941 194 112 65 0.756863 194 110 63
0.756863 194 110 63 0.760784 193 109 60
0.760784 193 109 60 0.764706 192 107 58
0.764706 192 107 58 0.768627 191 105 56
0.768627 191 105 56 0.772549 190 103 54
0.772549 190 103 54 0.776471 190 101 51
0.776471 190 101 51 0.780392 189 100 49
0.780392 189 100 49 0.784314 188 98 47
0.784314 188 98 47 0.788235 187 96 45
0.788235 187 96 45 0.792157 186 94 42
0.792157 186 94 42 0.796078 184 92 40
0.796078 184 92 40 0.800000 183 90 38
0.800000 183 90 38 0.803922 182 88 36
0.803922 182 88 36 0.807843 181 85 33
0.807843 181 85 33 0.811765 179 83 31
0.811765 179 83 31 0.815686 178 81 29
0.815686 178 81 29 0.819608 176 79 27
0.819608 176 79 27 0.823529 175 76 24
0.823529 175 76 24 0.827451 173 74 22
0.827451 173 74 22 0.831373 171 72 20
0.831373 171 72 20 0.835294 169 69 18
0.835294 169 69 18 0.839216 167 67 16
0.839216 167 67 16 0.843137 165 64 15
0.843137 165 64 15 0.847059 163 62 13
0.847059 163 62 13 0.850980 161 60 11
0.850980 161 60 11 0.854902 159 57 10
0.854902 159 57 10 0.858824 156 55 9
0.858824 156 55 9 0.862745 154 53 8
0.862745 154 53 8 0.866667 152 51 7
0.866667 152 51 7 0.870588 150 49 7
0.870588 150 49 7 0.874510 148 47 6
0.874510 148 47 6 0.878431 145 45 6
0.878431 145 45 6 0.882353 143 43 6
0.882353 143 43 6 0.886275 141 41 6
0.886275 141 41 6 0.890196 139 39 6
0.890196 139 39 6 0.894118 137 38 6
0.894118 137 38 6 0.898039 135 36 6
0.898039 135 36 6 0.901961 133 34 6
0.901961 133 34 6 0.905882 131 33 6
0.905882 131 33 6 0.909804 129 31 6
0.909804 129 31 6 0.913725 127 30 6
0.913725 127 30 6 0.917647 126 29 6
0.917647 126 29 6 0.921569 124 27 6
0.921569 124 27 6 0.925490 122 26 6
0.925490 122 26 6 0.929412 120 24 6
0.929412 120 24 6 0.933333 118 23 6
0.933333 118 23 6 0.937255 116 21 6
0.937255 116 21 6 0.941176 115 20 6
0.941176 115 20 6 0.945098 113 19 7
0.945098 113 19 7 0.949020 111 17 7
0.949020 111 17 7 0.952941 109 16 7
0.952941 109 16 7 0.956863 108 14 7
0.956863 108 14 7 0.960784 106 13 7
0.960784 106 13 7 0.964706 104 12 7
0.964706 104 12 7 0.968627 103 10 7
0.968627 103 10 7 0.972549 101 9 7
0.972549 101 9 7 0.976471 99 7 7
0.976471 99 7 7 0.980392 98 6 7
0.980392 98 6 7 0.984314 96 4 8
0.984314 96 4 8 0.988235 94 3 8
0.988235 94 3 8 0.992157 93 2 8
0.992157 93 2 8 0.996078 91 1 8
0.996078 91 1 8 1.000000 89 0 8
N 255 255 255
B 0 18 97
F 89 0 8
MintPy-1.6.2/src/mintpy/data/colormaps/vikO.cpt 0000664 0000000 0000000 00000023611 15032632755 0021412 0 ustar 00root root 0000000 0000000 #
# vikO
# www.fabiocrameri.ch/visualisation
0.000000 79 26 61 0.003922 78 26 62
0.003922 78 26 62 0.007843 78 27 63
0.007843 78 27 63 0.011765 77 27 65
0.011765 77 27 65 0.015686 76 28 66
0.015686 76 28 66 0.019608 75 29 67
0.019608 75 29 67 0.023529 75 29 68
0.023529 75 29 68 0.027451 74 30 70
0.027451 74 30 70 0.031373 73 31 71
0.031373 73 31 71 0.035294 72 32 73
0.035294 72 32 73 0.039216 72 33 74
0.039216 72 33 74 0.043137 71 33 75
0.043137 71 33 75 0.047059 70 34 77
0.047059 70 34 77 0.050980 69 35 78
0.050980 69 35 78 0.054902 69 36 80
0.054902 69 36 80 0.058824 68 37 81
0.058824 68 37 81 0.062745 67 38 83
0.062745 67 38 83 0.066667 67 39 84
0.066667 67 39 84 0.070588 66 40 86
0.070588 66 40 86 0.074510 65 41 88
0.074510 65 41 88 0.078431 64 42 89
0.078431 64 42 89 0.082353 63 44 91
0.082353 63 44 91 0.086275 63 45 93
0.086275 63 45 93 0.090196 62 46 94
0.090196 62 46 94 0.094118 61 47 96
0.094118 61 47 96 0.098039 61 49 98
0.098039 61 49 98 0.101961 60 50 99
0.101961 60 50 99 0.105882 59 51 101
0.105882 59 51 101 0.109804 58 53 103
0.109804 58 53 103 0.113725 58 54 104
0.113725 58 54 104 0.117647 57 56 106
0.117647 57 56 106 0.121569 56 57 108
0.121569 56 57 108 0.125490 56 59 110
0.125490 56 59 110 0.129412 55 60 111
0.129412 55 60 111 0.133333 54 62 113
0.133333 54 62 113 0.137255 54 63 115
0.137255 54 63 115 0.141176 53 65 116
0.141176 53 65 116 0.145098 53 67 118
0.145098 53 67 118 0.149020 52 68 120
0.149020 52 68 120 0.152941 52 70 122
0.152941 52 70 122 0.156863 52 72 123
0.156863 52 72 123 0.160784 52 73 125
0.160784 52 73 125 0.164706 51 75 127
0.164706 51 75 127 0.168627 51 77 128
0.168627 51 77 128 0.172549 51 79 130
0.172549 51 79 130 0.176471 51 81 132
0.176471 51 81 132 0.180392 51 82 133
0.180392 51 82 133 0.184314 52 84 135
0.184314 52 84 135 0.188235 52 86 137
0.188235 52 86 137 0.192157 52 88 138
0.192157 52 88 138 0.196078 53 90 140
0.196078 53 90 140 0.200000 53 92 141
0.200000 53 92 141 0.203922 54 94 143
0.203922 54 94 143 0.207843 55 95 144
0.207843 55 95 144 0.211765 56 97 146
0.211765 56 97 146 0.215686 57 99 148
0.215686 57 99 148 0.219608 58 101 149
0.219608 58 101 149 0.223529 59 103 151
0.223529 59 103 151 0.227451 60 105 152
0.227451 60 105 152 0.231373 61 107 154
0.231373 61 107 154 0.235294 63 109 155
0.235294 63 109 155 0.239216 64 111 156
0.239216 64 111 156 0.243137 66 113 158
0.243137 66 113 158 0.247059 67 115 159
0.247059 67 115 159 0.250980 69 117 161
0.250980 69 117 161 0.254902 71 119 162
0.254902 71 119 162 0.258824 73 121 164
0.258824 73 121 164 0.262745 75 123 165
0.262745 75 123 165 0.266667 77 125 166
0.266667 77 125 166 0.270588 79 127 168
0.270588 79 127 168 0.274510 81 129 169
0.274510 81 129 169 0.278431 83 131 171
0.278431 83 131 171 0.282353 85 133 172
0.282353 85 133 172 0.286275 87 135 173
0.286275 87 135 173 0.290196 90 137 175
0.290196 90 137 175 0.294118 92 139 176
0.294118 92 139 176 0.298039 94 141 177
0.298039 94 141 177 0.301961 97 143 178
0.301961 97 143 178 0.305882 99 145 180
0.305882 99 145 180 0.309804 102 147 181
0.309804 102 147 181 0.313725 104 149 182
0.313725 104 149 182 0.317647 107 151 183
0.317647 107 151 183 0.321569 109 152 184
0.321569 109 152 184 0.325490 112 154 186
0.325490 112 154 186 0.329412 114 156 187
0.329412 114 156 187 0.333333 117 158 188
0.333333 117 158 188 0.337255 120 160 189
0.337255 120 160 189 0.341176 122 162 190
0.341176 122 162 190 0.345098 125 164 191
0.345098 125 164 191 0.349020 128 165 192
0.349020 128 165 192 0.352941 131 167 193
0.352941 131 167 193 0.356863 133 169 194
0.356863 133 169 194 0.360784 136 170 194
0.360784 136 170 194 0.364706 139 172 195
0.364706 139 172 195 0.368627 142 174 196
0.368627 142 174 196 0.372549 144 175 197
0.372549 144 175 197 0.376471 147 177 197
0.376471 147 177 197 0.380392 150 178 198
0.380392 150 178 198 0.384314 153 180 198
0.384314 153 180 198 0.388235 155 181 199
0.388235 155 181 199 0.392157 158 182 199
0.392157 158 182 199 0.396078 161 184 200
0.396078 161 184 200 0.400000 164 185 200
0.400000 164 185 200 0.403922 166 186 200
0.403922 166 186 200 0.407843 169 187 200
0.407843 169 187 200 0.411765 171 188 200
0.411765 171 188 200 0.415686 174 189 200
0.415686 174 189 200 0.419608 176 190 200
0.419608 176 190 200 0.423529 179 191 200
0.423529 179 191 200 0.427451 181 192 200
0.427451 181 192 200 0.431373 184 192 199
0.431373 184 192 199 0.435294 186 193 199
0.435294 186 193 199 0.439216 188 193 198
0.439216 188 193 198 0.443137 190 194 198
0.443137 190 194 198 0.447059 192 194 197
0.447059 192 194 197 0.450980 194 194 196
0.450980 194 194 196 0.454902 196 194 195
0.454902 196 194 195 0.458824 198 195 194
0.458824 198 195 194 0.462745 200 195 193
0.462745 200 195 193 0.466667 201 194 192
0.466667 201 194 192 0.470588 203 194 191
0.470588 203 194 191 0.474510 205 194 190
0.474510 205 194 190 0.478431 206 194 188
0.478431 206 194 188 0.482353 207 193 187
0.482353 207 193 187 0.486275 209 193 185
0.486275 209 193 185 0.490196 210 192 184
0.490196 210 192 184 0.494118 211 192 182
0.494118 211 192 182 0.498039 212 191 181
0.498039 212 191 181 0.501961 213 190 179
0.501961 213 190 179 0.505882 213 189 177
0.505882 213 189 177 0.509804 214 189 175
0.509804 214 189 175 0.513725 215 188 173
0.513725 215 188 173 0.517647 215 187 172
0.517647 215 187 172 0.521569 216 186 170
0.521569 216 186 170 0.525490 216 184 168
0.525490 216 184 168 0.529412 217 183 166
0.529412 217 183 166 0.533333 217 182 164
0.533333 217 182 164 0.537255 217 181 161
0.537255 217 181 161 0.541176 217 180 159
0.541176 217 180 159 0.545098 217 178 157
0.545098 217 178 157 0.549020 217 177 155
0.549020 217 177 155 0.552941 217 175 153
0.552941 217 175 153 0.556863 217 174 151
0.556863 217 174 151 0.560784 217 172 148
0.560784 217 172 148 0.564706 217 171 146
0.564706 217 171 146 0.568627 217 169 144
0.568627 217 169 144 0.572549 216 168 141
0.572549 216 168 141 0.576471 216 166 139
0.576471 216 166 139 0.580392 216 165 137
0.580392 216 165 137 0.584314 215 163 135
0.584314 215 163 135 0.588235 215 161 132
0.588235 215 161 132 0.592157 214 160 130
0.592157 214 160 130 0.596078 213 158 128
0.596078 213 158 128 0.600000 213 156 125
0.600000 213 156 125 0.603922 212 154 123
0.603922 212 154 123 0.607843 212 152 121
0.607843 212 152 121 0.611765 211 151 118
0.611765 211 151 118 0.615686 210 149 116
0.615686 210 149 116 0.619608 209 147 114
0.619608 209 147 114 0.623529 208 145 111
0.623529 208 145 111 0.627451 208 143 109
0.627451 208 143 109 0.631373 207 141 107
0.631373 207 141 107 0.635294 206 139 104
0.635294 206 139 104 0.639216 205 138 102
0.639216 205 138 102 0.643137 204 136 100
0.643137 204 136 100 0.647059 203 134 97
0.647059 203 134 97 0.650980 202 132 95
0.650980 202 132 95 0.654902 200 130 93
0.654902 200 130 93 0.658824 199 128 91
0.658824 199 128 91 0.662745 198 126 88
0.662745 198 126 88 0.666667 197 124 86
0.666667 197 124 86 0.670588 196 121 84
0.670588 196 121 84 0.674510 194 119 82
0.674510 194 119 82 0.678431 193 117 79
0.678431 193 117 79 0.682353 192 115 77
0.682353 192 115 77 0.686275 190 113 75
0.686275 190 113 75 0.690196 189 111 73
0.690196 189 111 73 0.694118 187 109 71
0.694118 187 109 71 0.698039 186 106 69
0.698039 186 106 69 0.701961 184 104 67
0.701961 184 104 67 0.705882 183 102 65
0.705882 183 102 65 0.709804 181 100 63
0.709804 181 100 63 0.713725 179 98 61
0.713725 179 98 61 0.717647 178 95 59
0.717647 178 95 59 0.721569 176 93 57
0.721569 176 93 57 0.725490 174 91 55
0.725490 174 91 55 0.729412 172 89 53
0.729412 172 89 53 0.733333 170 86 51
0.733333 170 86 51 0.737255 169 84 50
0.737255 169 84 50 0.741176 167 82 48
0.741176 167 82 48 0.745098 165 80 47
0.745098 165 80 47 0.749020 163 77 45
0.749020 163 77 45 0.752941 161 75 44
0.752941 161 75 44 0.756863 159 73 42
0.756863 159 73 42 0.760784 157 71 41
0.760784 157 71 41 0.764706 155 69 40
0.764706 155 69 40 0.768627 153 67 39
0.768627 153 67 39 0.772549 151 65 38
0.772549 151 65 38 0.776471 149 62 37
0.776471 149 62 37 0.780392 147 60 36
0.780392 147 60 36 0.784314 145 59 35
0.784314 145 59 35 0.788235 143 57 34
0.788235 143 57 34 0.792157 141 55 33
0.792157 141 55 33 0.796078 140 53 33
0.796078 140 53 33 0.800000 138 51 32
0.800000 138 51 32 0.803922 136 49 32
0.803922 136 49 32 0.807843 134 48 31
0.807843 134 48 31 0.811765 132 46 31
0.811765 132 46 31 0.815686 130 44 31
0.815686 130 44 31 0.819608 129 43 30
0.819608 129 43 30 0.823529 127 41 30
0.823529 127 41 30 0.827451 125 40 30
0.827451 125 40 30 0.831373 124 39 30
0.831373 124 39 30 0.835294 122 37 30
0.835294 122 37 30 0.839216 121 36 30
0.839216 121 36 30 0.843137 119 35 30
0.843137 119 35 30 0.847059 118 34 31
0.847059 118 34 31 0.850980 116 33 31
0.850980 116 33 31 0.854902 115 32 31
0.854902 115 32 31 0.858824 114 31 31
0.858824 114 31 31 0.862745 112 30 32
0.862745 112 30 32 0.866667 111 29 32
0.866667 111 29 32 0.870588 110 28 32
0.870588 110 28 32 0.874510 108 27 33
0.874510 108 27 33 0.878431 107 26 33
0.878431 107 26 33 0.882353 106 26 34
0.882353 106 26 34 0.886275 105 25 34
0.886275 105 25 34 0.890196 104 25 35
0.890196 104 25 35 0.894118 103 24 35
0.894118 103 24 35 0.898039 102 24 36
0.898039 102 24 36 0.901961 101 23 37
0.901961 101 23 37 0.905882 100 23 37
0.905882 100 23 37 0.909804 99 22 38
0.909804 99 22 38 0.913725 98 22 39
0.913725 98 22 39 0.917647 97 22 39
0.917647 97 22 39 0.921569 96 22 40
0.921569 96 22 40 0.925490 95 22 41
0.925490 95 22 41 0.929412 94 21 42
0.929412 94 21 42 0.933333 93 21 43
0.933333 93 21 43 0.937255 92 21 43
0.937255 92 21 43 0.941176 91 21 44
0.941176 91 21 44 0.945098 90 21 45
0.945098 90 21 45 0.949020 90 21 46
0.949020 90 21 46 0.952941 89 21 47
0.952941 89 21 47 0.956863 88 22 48
0.956863 88 22 48 0.960784 87 22 49
0.960784 87 22 49 0.964706 86 22 50
0.964706 86 22 50 0.968627 86 22 51
0.968627 86 22 51 0.972549 85 22 52
0.972549 85 22 52 0.976471 84 23 53
0.976471 84 23 53 0.980392 83 23 54
0.980392 83 23 54 0.984314 83 23 55
0.984314 83 23 55 0.988235 82 24 56
0.988235 82 24 56 0.992157 81 24 57
0.992157 81 24 57 0.996078 80 25 58
0.996078 80 25 58 1.000000 80 25 60
N 255 255 255
B 79 26 61
F 80 25 60
MintPy-1.6.2/src/mintpy/data/colormaps/wiki-2.0.cpt 0000664 0000000 0000000 00000003167 15032632755 0021746 0 ustar 00root root 0000000 0000000 # wiki-2.0.cpt
#
# extracted from Maps_template-fr.svg by Eric Gaba (Wikimedia
# Commons user: Sting) and others, released under the following
# licence:
#
# Permission is granted to copy, distribute and/or modify this document
# under the terms of the GNU Free Documentation License, Version 1.2 or
# any later version published by the Free Software Foundation; with no
# Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A
# copy of the license is included in the section entitled "GNU Free
# Documentation License".
#
# Translated by J.J. Green 2009, translation under same licence
#
# $Id: wiki-2.0.cpt.body,v 1.1 2009/05/04 15:32:51 jjg Exp $
# COLOR_MODEL = RGB
-10 113 171 216 -9 113 171 216
-9 121 178 222 -8 121 178 222
-8 132 185 227 -7 132 185 227
-7 141 193 234 -6 141 193 234
-6 150 201 240 -5 150 201 240
-5 161 210 247 -4 161 210 247
-4 172 219 251 -3 172 219 251
-3 185 227 255 -2 185 227 255
-2 198 236 255 -1 198 236 255
-1 216 242 254 0 216 242 254
0 172 208 165 1 172 208 165
1 148 191 139 2 148 191 139
2 168 198 143 3 168 198 143
3 189 204 150 4 189 204 150
4 209 215 171 5 209 215 171
5 225 228 181 6 225 228 181
6 239 235 192 7 239 235 192
7 232 225 182 8 232 225 182
8 222 214 163 9 222 214 163
9 211 202 157 10 211 202 157
10 202 185 130 11 202 185 130
11 195 167 107 12 195 167 107
12 185 152 90 13 185 152 90
13 170 135 83 14 170 135 83
14 172 154 124 15 172 154 124
15 186 174 154 16 186 174 154
16 202 195 184 17 202 195 184
17 224 222 216 18 224 222 216
18 245 244 242 19 245 244 242
B 0 0 0
F 255 255 255
N 255 0 0
MintPy-1.6.2/src/mintpy/data/colormaps/wiki-schwarzwald-d050.cpt 0000664 0000000 0000000 00000002370 15032632755 0024441 0 ustar 00root root 0000000 0000000 # wiki-schwarzwald-d050.cpt
#
# discrete 50m step, extracted from
# http://commons.wikimedia.org/wiki/File:Schwarzwald-topographie.png
# Author: wikipedia users W-j-s, Jide
# Licence: Creative Commons Attribution-Share Alike 3.0 Unported
#
# J.J. Green 2012
# $Id: wiki-schwarzwald-d050.cpt,v 1.2 2012/03/27 09:02:12 jjg Exp $
#
# COLOR_MODEL = RGB
0 176 242 205 50 176 242 205
50 180 246 179 100 180 246 179
100 207 250 177 150 207 250 177
150 242 252 179 200 242 252 179
200 220 238 145 250 220 238 145
250 147 208 93 300 147 208 93
300 69 179 53 350 69 179 53
350 21 151 47 400 21 151 47
400 18 130 63 450 18 130 63
450 81 144 58 500 81 144 58
500 132 158 47 550 132 158 47
550 181 171 35 600 181 171 35
600 233 181 17 650 233 181 17
650 235 149 2 700 235 149 2
700 209 97 2 750 209 97 2
750 177 54 2 800 177 54 2
800 148 20 1 850 148 20 1
850 124 6 1 900 124 6 1
900 117 21 4 950 117 21 4
950 113 30 6 1000 113 30 6
1000 109 39 9 1050 109 39 9
1050 106 45 12 1100 106 45 12
1100 117 64 30 1150 117 64 30
1150 133 88 60 1200 133 88 60
1200 149 113 93 1250 149 113 93
1250 162 144 135 1300 162 144 135
1300 173 173 172 1350 173 173 172
1350 190 190 190 1400 190 190 190
1400 210 208 210 1450 210 208 210
1450 227 225 227 1500 227 225 227
B 255 255 255
F 0 0 0
N 255 0 0
MintPy-1.6.2/src/mintpy/data/colormaps/wiki-scotland.cpt 0000664 0000000 0000000 00000002077 15032632755 0023255 0 ustar 00root root 0000000 0000000 # scotland.cpt
#
# extracted from Scotland_topographic_map-fr.svg
# Author Eric Gaba (Wikimedia Commons user: Sting)
# Licence: Creative Commons Attribution-ShareAlike 3.0 Unported
# (see http://creativecommons.org/licenses/by-sa/3.0/deed.en)
#
# Translated by J.J. Green 2012, translation under same licence
#
# $Id: wiki-scotland.cpt.body,v 1.1 2009/05/04 19:29:16 jjg Exp $
# COLOR_MODEL = RGB
-1750 121 178 222 -1500 121 178 222
-1500 132 185 227 -1250 132 185 227
-1250 141 193 234 -1000 141 193 234
-1000 150 201 240 -750 150 201 240
-750 161 210 247 -500 161 210 247
-500 172 219 251 -200 172 219 251
-200 185 227 255 -100 185 227 255
-100 200 235 255 -50 200 235 255
-50 216 242 254 0 216 242 254
0 172 208 165 50 172 208 165
50 148 191 139 100 148 191 139
100 168 198 143 200 168 198 143
200 189 204 150 400 189 204 150
400 209 215 171 600 209 215 171
600 239 235 192 800 239 235 192
800 222 214 163 1000 222 214 163
1000 202 185 130 1200 202 185 130
1200 192 154 83 1400 192 154 83
B 0 0 0
F 255 255 255
N 255 0 0
MintPy-1.6.2/src/mintpy/data/dygraph-combined.js 0000664 0000000 0000000 00000656511 15032632755 0021560 0 ustar 00root root 0000000 0000000 /*! @license Copyright 2011 Dan Vanderkam (danvdk@gmail.com) MIT-licensed (http://opensource.org/licenses/MIT) */
Date.ext = {};
Date.ext.util = {};
Date.ext.util.xPad = function (a, c, b) {
if (typeof(b) == "undefined") {
b = 10
}
for (; parseInt(a, 10) < b && b > 1; b /= 10) {
a = c.toString() + a
}
return a.toString()
};
Date.prototype.locale = "en-GB";
if (document.getElementsByTagName("html") && document.getElementsByTagName("html")[0].lang) {
Date.prototype.locale = document.getElementsByTagName("html")[0].lang
}
Date.ext.locales = {};
Date.ext.locales.en = {
a: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
A: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
b: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
B: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
c: "%a %d %b %Y %T %Z",
p: ["AM", "PM"],
P: ["am", "pm"],
x: "%d/%m/%y",
X: "%T"
};
Date.ext.locales["en-US"] = Date.ext.locales.en;
Date.ext.locales["en-US"].c = "%a %d %b %Y %r %Z";
Date.ext.locales["en-US"].x = "%D";
Date.ext.locales["en-US"].X = "%r";
Date.ext.locales["en-GB"] = Date.ext.locales.en;
Date.ext.locales["en-AU"] = Date.ext.locales["en-GB"];
Date.ext.formats = {
a: function (a) {
return Date.ext.locales[a.locale].a[a.getDay()]
}, A: function (a) {
return Date.ext.locales[a.locale].A[a.getDay()]
}, b: function (a) {
return Date.ext.locales[a.locale].b[a.getMonth()]
}, B: function (a) {
return Date.ext.locales[a.locale].B[a.getMonth()]
}, c: "toLocaleString", C: function (a) {
return Date.ext.util.xPad(parseInt(a.getFullYear() / 100, 10), 0)
}, d: ["getDate", "0"], e: ["getDate", " "], g: function (a) {
return Date.ext.util.xPad(parseInt(Date.ext.util.G(a) / 100, 10), 0)
}, G: function (c) {
var e = c.getFullYear();
var b = parseInt(Date.ext.formats.V(c), 10);
var a = parseInt(Date.ext.formats.W(c), 10);
if (a > b) {
e++
} else {
if (a === 0 && b >= 52) {
e--
}
}
return e
}, H: ["getHours", "0"], I: function (b) {
var a = b.getHours() % 12;
return Date.ext.util.xPad(a === 0 ? 12 : a, 0)
}, j: function (c) {
var a = c - new Date("" + c.getFullYear() + "/1/1 GMT");
a += c.getTimezoneOffset() * 60000;
var b = parseInt(a / 60000 / 60 / 24, 10) + 1;
return Date.ext.util.xPad(b, 0, 100)
}, m: function (a) {
return Date.ext.util.xPad(a.getMonth() + 1, 0)
}, M: ["getMinutes", "0"], p: function (a) {
return Date.ext.locales[a.locale].p[a.getHours() >= 12 ? 1 : 0]
}, P: function (a) {
return Date.ext.locales[a.locale].P[a.getHours() >= 12 ? 1 : 0]
}, S: ["getSeconds", "0"], u: function (a) {
var b = a.getDay();
return b === 0 ? 7 : b
}, U: function (e) {
var a = parseInt(Date.ext.formats.j(e), 10);
var c = 6 - e.getDay();
var b = parseInt((a + c) / 7, 10);
return Date.ext.util.xPad(b, 0)
}, V: function (e) {
var c = parseInt(Date.ext.formats.W(e), 10);
var a = (new Date("" + e.getFullYear() + "/1/1")).getDay();
var b = c + (a > 4 || a <= 1 ? 0 : 1);
if (b == 53 && (new Date("" + e.getFullYear() + "/12/31")).getDay() < 4) {
b = 1
} else {
if (b === 0) {
b = Date.ext.formats.V(new Date("" + (e.getFullYear() - 1) + "/12/31"))
}
}
return Date.ext.util.xPad(b, 0)
}, w: "getDay", W: function (e) {
var a = parseInt(Date.ext.formats.j(e), 10);
var c = 7 - Date.ext.formats.u(e);
var b = parseInt((a + c) / 7, 10);
return Date.ext.util.xPad(b, 0, 10)
}, y: function (a) {
return Date.ext.util.xPad(a.getFullYear() % 100, 0)
}, Y: "getFullYear", z: function (c) {
var b = c.getTimezoneOffset();
var a = Date.ext.util.xPad(parseInt(Math.abs(b / 60), 10), 0);
var e = Date.ext.util.xPad(b % 60, 0);
return (b > 0 ? "-" : "+") + a + e
}, Z: function (a) {
return a.toString().replace(/^.*\(([^)]+)\)$/, "$1")
}, "%": function (a) {
return "%"
}
};
Date.ext.aggregates = {
c: "locale",
D: "%m/%d/%y",
h: "%b",
n: "\n",
r: "%I:%M:%S %p",
R: "%H:%M",
t: "\t",
T: "%H:%M:%S",
x: "locale",
X: "locale"
};
Date.ext.aggregates.z = Date.ext.formats.z(new Date());
Date.ext.aggregates.Z = Date.ext.formats.Z(new Date());
Date.ext.unsupported = {};
Date.prototype.strftime = function (a) {
if (!(this.locale in Date.ext.locales)) {
if (this.locale.replace(/-[a-zA-Z]+$/, "") in Date.ext.locales) {
this.locale = this.locale.replace(/-[a-zA-Z]+$/, "")
} else {
this.locale = "en-GB"
}
}
var c = this;
while (a.match(/%[cDhnrRtTxXzZ]/)) {
a = a.replace(/%([cDhnrRtTxXzZ])/g, function (e, d) {
var g = Date.ext.aggregates[d];
return (g == "locale" ? Date.ext.locales[c.locale][d] : g)
})
}
var b = a.replace(/%([aAbBCdegGHIjmMpPSuUVwWyY%])/g, function (e, d) {
var g = Date.ext.formats[d];
if (typeof(g) == "string") {
return c[g]()
} else {
if (typeof(g) == "function") {
return g.call(c, c)
} else {
if (typeof(g) == "object" && typeof(g[0]) == "string") {
return Date.ext.util.xPad(c[g[0]](), g[1])
} else {
return d
}
}
}
});
c = null;
return b
};
"use strict";
function RGBColorParser(f) {
this.ok = false;
if (f.charAt(0) == "#") {
f = f.substr(1, 6)
}
f = f.replace(/ /g, "");
f = f.toLowerCase();
var b = {
aliceblue: "f0f8ff",
antiquewhite: "faebd7",
aqua: "00ffff",
aquamarine: "7fffd4",
azure: "f0ffff",
beige: "f5f5dc",
bisque: "ffe4c4",
black: "000000",
blanchedalmond: "ffebcd",
blue: "0000ff",
blueviolet: "8a2be2",
brown: "a52a2a",
burlywood: "deb887",
cadetblue: "5f9ea0",
chartreuse: "7fff00",
chocolate: "d2691e",
coral: "ff7f50",
cornflowerblue: "6495ed",
cornsilk: "fff8dc",
crimson: "dc143c",
cyan: "00ffff",
darkblue: "00008b",
darkcyan: "008b8b",
darkgoldenrod: "b8860b",
darkgray: "a9a9a9",
darkgreen: "006400",
darkkhaki: "bdb76b",
darkmagenta: "8b008b",
darkolivegreen: "556b2f",
darkorange: "ff8c00",
darkorchid: "9932cc",
darkred: "8b0000",
darksalmon: "e9967a",
darkseagreen: "8fbc8f",
darkslateblue: "483d8b",
darkslategray: "2f4f4f",
darkturquoise: "00ced1",
darkviolet: "9400d3",
deeppink: "ff1493",
deepskyblue: "00bfff",
dimgray: "696969",
dodgerblue: "1e90ff",
feldspar: "d19275",
firebrick: "b22222",
floralwhite: "fffaf0",
forestgreen: "228b22",
fuchsia: "ff00ff",
gainsboro: "dcdcdc",
ghostwhite: "f8f8ff",
gold: "ffd700",
goldenrod: "daa520",
gray: "808080",
green: "008000",
greenyellow: "adff2f",
honeydew: "f0fff0",
hotpink: "ff69b4",
indianred: "cd5c5c",
indigo: "4b0082",
ivory: "fffff0",
khaki: "f0e68c",
lavender: "e6e6fa",
lavenderblush: "fff0f5",
lawngreen: "7cfc00",
lemonchiffon: "fffacd",
lightblue: "add8e6",
lightcoral: "f08080",
lightcyan: "e0ffff",
lightgoldenrodyellow: "fafad2",
lightgrey: "d3d3d3",
lightgreen: "90ee90",
lightpink: "ffb6c1",
lightsalmon: "ffa07a",
lightseagreen: "20b2aa",
lightskyblue: "87cefa",
lightslateblue: "8470ff",
lightslategray: "778899",
lightsteelblue: "b0c4de",
lightyellow: "ffffe0",
lime: "00ff00",
limegreen: "32cd32",
linen: "faf0e6",
magenta: "ff00ff",
maroon: "800000",
mediumaquamarine: "66cdaa",
mediumblue: "0000cd",
mediumorchid: "ba55d3",
mediumpurple: "9370d8",
mediumseagreen: "3cb371",
mediumslateblue: "7b68ee",
mediumspringgreen: "00fa9a",
mediumturquoise: "48d1cc",
mediumvioletred: "c71585",
midnightblue: "191970",
mintcream: "f5fffa",
mistyrose: "ffe4e1",
moccasin: "ffe4b5",
navajowhite: "ffdead",
navy: "000080",
oldlace: "fdf5e6",
olive: "808000",
olivedrab: "6b8e23",
orange: "ffa500",
orangered: "ff4500",
orchid: "da70d6",
palegoldenrod: "eee8aa",
palegreen: "98fb98",
paleturquoise: "afeeee",
palevioletred: "d87093",
papayawhip: "ffefd5",
peachpuff: "ffdab9",
peru: "cd853f",
pink: "ffc0cb",
plum: "dda0dd",
powderblue: "b0e0e6",
purple: "800080",
red: "ff0000",
rosybrown: "bc8f8f",
royalblue: "4169e1",
saddlebrown: "8b4513",
salmon: "fa8072",
sandybrown: "f4a460",
seagreen: "2e8b57",
seashell: "fff5ee",
sienna: "a0522d",
silver: "c0c0c0",
skyblue: "87ceeb",
slateblue: "6a5acd",
slategray: "708090",
snow: "fffafa",
springgreen: "00ff7f",
steelblue: "4682b4",
tan: "d2b48c",
teal: "008080",
thistle: "d8bfd8",
tomato: "ff6347",
turquoise: "40e0d0",
violet: "ee82ee",
violetred: "d02090",
wheat: "f5deb3",
white: "ffffff",
whitesmoke: "f5f5f5",
yellow: "ffff00",
yellowgreen: "9acd32"
};
for (var g in b) {
if (f == g) {
f = b[g]
}
}
var e = [{
re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,
example: ["rgb(123, 234, 45)", "rgb(255,234,245)"],
process: function (i) {
return [parseInt(i[1]), parseInt(i[2]), parseInt(i[3])]
}
}, {
re: /^(\w{2})(\w{2})(\w{2})$/, example: ["#00ff00", "336699"], process: function (i) {
return [parseInt(i[1], 16), parseInt(i[2], 16), parseInt(i[3], 16)]
}
}, {
re: /^(\w{1})(\w{1})(\w{1})$/, example: ["#fb0", "f0f"], process: function (i) {
return [parseInt(i[1] + i[1], 16), parseInt(i[2] + i[2], 16), parseInt(i[3] + i[3], 16)]
}
}];
for (var c = 0; c < e.length; c++) {
var j = e[c].re;
var a = e[c].process;
var h = j.exec(f);
if (h) {
var d = a(h);
this.r = d[0];
this.g = d[1];
this.b = d[2];
this.ok = true
}
}
this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 255 : this.r);
this.g = (this.g < 0 || isNaN(this.g)) ? 0 : ((this.g > 255) ? 255 : this.g);
this.b = (this.b < 0 || isNaN(this.b)) ? 0 : ((this.b > 255) ? 255 : this.b);
this.toRGB = function () {
return "rgb(" + this.r + ", " + this.g + ", " + this.b + ")"
};
this.toHex = function () {
var l = this.r.toString(16);
var k = this.g.toString(16);
var i = this.b.toString(16);
if (l.length == 1) {
l = "0" + l
}
if (k.length == 1) {
k = "0" + k
}
if (i.length == 1) {
i = "0" + i
}
return "#" + l + k + i
}
}
function printStackTrace(b) {
b = b || {guess: true};
var c = b.e || null, e = !!b.guess;
var d = new printStackTrace.implementation(), a = d.run(c);
return (e) ? d.guessAnonymousFunctions(a) : a
}
printStackTrace.implementation = function () {
};
printStackTrace.implementation.prototype = {
run: function (a, b) {
a = a || this.createException();
b = b || this.mode(a);
if (b === "other") {
return this.other(arguments.callee)
} else {
return this[b](a)
}
}, createException: function () {
try {
this.undef()
} catch (a) {
return a
}
}, mode: function (a) {
if (a["arguments"] && a.stack) {
return "chrome"
} else {
if (typeof a.message === "string" && typeof window !== "undefined" && window.opera) {
if (!a.stacktrace) {
return "opera9"
}
if (a.message.indexOf("\n") > -1 && a.message.split("\n").length > a.stacktrace.split("\n").length) {
return "opera9"
}
if (!a.stack) {
return "opera10a"
}
if (a.stacktrace.indexOf("called from line") < 0) {
return "opera10b"
}
return "opera11"
} else {
if (a.stack) {
return "firefox"
}
}
}
return "other"
}, instrumentFunction: function (b, d, e) {
b = b || window;
var a = b[d];
b[d] = function c() {
e.call(this, printStackTrace().slice(4));
return b[d]._instrumented.apply(this, arguments)
};
b[d]._instrumented = a
}, deinstrumentFunction: function (a, b) {
if (a[b].constructor === Function && a[b]._instrumented && a[b]._instrumented.constructor === Function) {
a[b] = a[b]._instrumented
}
}, chrome: function (b) {
var a = (b.stack + "\n").replace(/^\S[^\(]+?[\n$]/gm, "").replace(/^\s+at\s+/gm, "").replace(/^([^\(]+?)([\n$])/gm, "{anonymous}()@$1$2").replace(/^Object.\s*\(([^\)]+)\)/gm, "{anonymous}()@$1").split("\n");
a.pop();
return a
}, firefox: function (a) {
return a.stack.replace(/(?:\n@:0)?\s+$/m, "").replace(/^\(/gm, "{anonymous}(").split("\n")
}, opera11: function (g) {
var a = "{anonymous}", h = /^.*line (\d+), column (\d+)(?: in (.+))? in (\S+):$/;
var k = g.stacktrace.split("\n"), l = [];
for (var c = 0, f = k.length; c < f; c += 2) {
var d = h.exec(k[c]);
if (d) {
var j = d[4] + ":" + d[1] + ":" + d[2];
var b = d[3] || "global code";
b = b.replace(//, "$1").replace(//, a);
l.push(b + "@" + j + " -- " + k[c + 1].replace(/^\s+/, ""))
}
}
return l
}, opera10b: function (g) {
var a = "{anonymous}", h = /^(.*)@(.+):(\d+)$/;
var j = g.stacktrace.split("\n"), k = [];
for (var c = 0, f = j.length; c < f; c++) {
var d = h.exec(j[c]);
if (d) {
var b = d[1] ? (d[1] + "()") : "global code";
k.push(b + "@" + d[2] + ":" + d[3])
}
}
return k
}, opera10a: function (g) {
var a = "{anonymous}", h = /Line (\d+).*script (?:in )?(\S+)(?:: In function (\S+))?$/i;
var j = g.stacktrace.split("\n"), k = [];
for (var c = 0, f = j.length; c < f; c += 2) {
var d = h.exec(j[c]);
if (d) {
var b = d[3] || a;
k.push(b + "()@" + d[2] + ":" + d[1] + " -- " + j[c + 1].replace(/^\s+/, ""))
}
}
return k
}, opera9: function (j) {
var d = "{anonymous}", h = /Line (\d+).*script (?:in )?(\S+)/i;
var c = j.message.split("\n"), b = [];
for (var g = 2, a = c.length; g < a; g += 2) {
var f = h.exec(c[g]);
if (f) {
b.push(d + "()@" + f[2] + ":" + f[1] + " -- " + c[g + 1].replace(/^\s+/, ""))
}
}
return b
}, other: function (g) {
var b = "{anonymous}", f = /function\s*([\w\-$]+)?\s*\(/i, a = [], d, c, e = 10;
while (g && a.length < e) {
d = f.test(g.toString()) ? RegExp.$1 || b : b;
c = Array.prototype.slice.call(g["arguments"] || []);
a[a.length] = d + "(" + this.stringifyArguments(c) + ")";
g = g.caller
}
return a
}, stringifyArguments: function (c) {
var b = [];
var e = Array.prototype.slice;
for (var d = 0; d < c.length; ++d) {
var a = c[d];
if (a === undefined) {
b[d] = "undefined"
} else {
if (a === null) {
b[d] = "null"
} else {
if (a.constructor) {
if (a.constructor === Array) {
if (a.length < 3) {
b[d] = "[" + this.stringifyArguments(a) + "]"
} else {
b[d] = "[" + this.stringifyArguments(e.call(a, 0, 1)) + "..." + this.stringifyArguments(e.call(a, -1)) + "]"
}
} else {
if (a.constructor === Object) {
b[d] = "#object"
} else {
if (a.constructor === Function) {
b[d] = "#function"
} else {
if (a.constructor === String) {
b[d] = '"' + a + '"'
} else {
if (a.constructor === Number) {
b[d] = a
}
}
}
}
}
}
}
}
}
return b.join(",")
}, sourceCache: {}, ajax: function (a) {
var b = this.createXMLHTTPObject();
if (b) {
try {
b.open("GET", a, false);
b.send(null);
return b.responseText
} catch (c) {
}
}
return ""
}, createXMLHTTPObject: function () {
var c, a = [function () {
return new XMLHttpRequest()
}, function () {
return new ActiveXObject("Msxml2.XMLHTTP")
}, function () {
return new ActiveXObject("Msxml3.XMLHTTP")
}, function () {
return new ActiveXObject("Microsoft.XMLHTTP")
}];
for (var b = 0; b < a.length; b++) {
try {
c = a[b]();
this.createXMLHTTPObject = a[b];
return c
} catch (d) {
}
}
}, isSameDomain: function (a) {
return a.indexOf(location.hostname) !== -1
}, getSource: function (a) {
if (!(a in this.sourceCache)) {
this.sourceCache[a] = this.ajax(a).split("\n")
}
return this.sourceCache[a]
}, guessAnonymousFunctions: function (k) {
for (var g = 0; g < k.length; ++g) {
var f = /\{anonymous\}\(.*\)@(.*)/, l = /^(.*?)(?::(\d+))(?::(\d+))?(?: -- .+)?$/, b = k[g], c = f.exec(b);
if (c) {
var e = l.exec(c[1]), d = e[1], a = e[2], j = e[3] || 0;
if (d && this.isSameDomain(d) && a) {
var h = this.guessAnonymousFunction(d, a, j);
k[g] = b.replace("{anonymous}", h)
}
}
}
return k
}, guessAnonymousFunction: function (c, f, a) {
var b;
try {
b = this.findFunctionName(this.getSource(c), f)
} catch (d) {
b = "getSource failed with url: " + c + ", exception: " + d.toString()
}
return b
}, findFunctionName: function (a, e) {
var g = /function\s+([^(]*?)\s*\(([^)]*)\)/;
var k = /['"]?([0-9A-Za-z_]+)['"]?\s*[:=]\s*function\b/;
var h = /['"]?([0-9A-Za-z_]+)['"]?\s*[:=]\s*(?:eval|new Function)\b/;
var b = "", l, j = Math.min(e, 20), d, c;
for (var f = 0; f < j; ++f) {
l = a[e - f - 1];
c = l.indexOf("//");
if (c >= 0) {
l = l.substr(0, c)
}
if (l) {
b = l + b;
d = k.exec(b);
if (d && d[1]) {
return d[1]
}
d = g.exec(b);
if (d && d[1]) {
return d[1]
}
d = h.exec(b);
if (d && d[1]) {
return d[1]
}
}
}
return "(?)"
}
};
CanvasRenderingContext2D.prototype.installPattern = function (e) {
if (typeof(this.isPatternInstalled) !== "undefined") {
throw"Must un-install old line pattern before installing a new one."
}
this.isPatternInstalled = true;
var g = [0, 0];
var b = [];
var f = this.beginPath;
var d = this.lineTo;
var c = this.moveTo;
var a = this.stroke;
this.uninstallPattern = function () {
this.beginPath = f;
this.lineTo = d;
this.moveTo = c;
this.stroke = a;
this.uninstallPattern = undefined;
this.isPatternInstalled = undefined
};
this.beginPath = function () {
b = [];
f.call(this)
};
this.moveTo = function (h, i) {
b.push([[h, i]]);
c.call(this, h, i)
};
this.lineTo = function (h, j) {
var i = b[b.length - 1];
i.push([h, j])
};
this.stroke = function () {
if (b.length === 0) {
a.call(this);
return
}
for (var p = 0; p < b.length; p++) {
var o = b[p];
var l = o[0][0], u = o[0][1];
for (var n = 1; n < o.length; n++) {
var h = o[n][0], s = o[n][1];
this.save();
var w = (h - l);
var v = (s - u);
var r = Math.sqrt(w * w + v * v);
var k = Math.atan2(v, w);
this.translate(l, u);
c.call(this, 0, 0);
this.rotate(k);
var m = g[0];
var t = 0;
while (r > t) {
var q = e[m];
if (g[1]) {
t += g[1]
} else {
t += q
}
if (t > r) {
g = [m, t - r];
t = r
} else {
g = [(m + 1) % e.length, 0]
}
if (m % 2 === 0) {
d.call(this, t, 0)
} else {
c.call(this, t, 0)
}
m = (m + 1) % e.length
}
this.restore();
l = h, u = s
}
}
a.call(this);
b = []
}
};
CanvasRenderingContext2D.prototype.uninstallPattern = function () {
throw"Must install a line pattern before uninstalling it."
};
var DygraphOptions = (function () {
var a = function (b) {
this.dygraph_ = b;
this.yAxes_ = [];
this.xAxis_ = {};
this.series_ = {};
this.global_ = this.dygraph_.attrs_;
this.user_ = this.dygraph_.user_attrs_ || {};
this.labels_ = [];
this.highlightSeries_ = this.get("highlightSeriesOpts") || {};
this.reparseSeries()
};
a.AXIS_STRING_MAPPINGS_ = {y: 0, Y: 0, y1: 0, Y1: 0, y2: 1, Y2: 1};
a.axisToIndex_ = function (b) {
if (typeof(b) == "string") {
if (a.AXIS_STRING_MAPPINGS_.hasOwnProperty(b)) {
return a.AXIS_STRING_MAPPINGS_[b]
}
throw"Unknown axis : " + b
}
if (typeof(b) == "number") {
if (b === 0 || b === 1) {
return b
}
throw"Dygraphs only supports two y-axes, indexed from 0-1."
}
if (b) {
throw"Unknown axis : " + b
}
return 0
};
a.prototype.reparseSeries = function () {
var g = this.get("labels");
if (!g) {
return
}
this.labels_ = g.slice(1);
this.yAxes_ = [{series: [], options: {}}];
this.xAxis_ = {options: {}};
this.series_ = {};
var h = !this.user_.series;
if (h) {
var c = 0;
for (var j = 0; j < this.labels_.length; j++) {
var i = this.labels_[j];
var e = this.user_[i] || {};
var b = 0;
var d = e.axis;
if (typeof(d) == "object") {
b = ++c;
this.yAxes_[b] = {series: [i], options: d}
}
if (!d) {
this.yAxes_[0].series.push(i)
}
this.series_[i] = {idx: j, yAxis: b, options: e}
}
for (var j = 0; j < this.labels_.length; j++) {
var i = this.labels_[j];
var e = this.series_[i]["options"];
var d = e.axis;
if (typeof(d) == "string") {
if (!this.series_.hasOwnProperty(d)) {
Dygraph.error("Series " + i + " wants to share a y-axis with series " + d + ", which does not define its own axis.");
return
}
var b = this.series_[d].yAxis;
this.series_[i].yAxis = b;
this.yAxes_[b].series.push(i)
}
}
} else {
for (var j = 0; j < this.labels_.length; j++) {
var i = this.labels_[j];
var e = this.user_.series[i] || {};
var b = a.axisToIndex_(e.axis);
this.series_[i] = {idx: j, yAxis: b, options: e};
if (!this.yAxes_[b]) {
this.yAxes_[b] = {series: [i], options: {}}
} else {
this.yAxes_[b].series.push(i)
}
}
}
var f = this.user_.axes || {};
Dygraph.update(this.yAxes_[0].options, f.y || {});
if (this.yAxes_.length > 1) {
Dygraph.update(this.yAxes_[1].options, f.y2 || {})
}
Dygraph.update(this.xAxis_.options, f.x || {})
};
a.prototype.get = function (c) {
var b = this.getGlobalUser_(c);
if (b !== null) {
return b
}
return this.getGlobalDefault_(c)
};
a.prototype.getGlobalUser_ = function (b) {
if (this.user_.hasOwnProperty(b)) {
return this.user_[b]
}
return null
};
a.prototype.getGlobalDefault_ = function (b) {
if (this.global_.hasOwnProperty(b)) {
return this.global_[b]
}
if (Dygraph.DEFAULT_ATTRS.hasOwnProperty(b)) {
return Dygraph.DEFAULT_ATTRS[b]
}
return null
};
a.prototype.getForAxis = function (d, e) {
var f;
var i;
if (typeof(e) == "number") {
f = e;
i = f === 0 ? "y" : "y2"
} else {
if (e == "y1") {
e = "y"
}
if (e == "y") {
f = 0
} else {
if (e == "y2") {
f = 1
} else {
if (e == "x") {
f = -1
} else {
throw"Unknown axis " + e
}
}
}
i = e
}
var g = (f == -1) ? this.xAxis_ : this.yAxes_[f];
if (g) {
var h = g.options;
if (h.hasOwnProperty(d)) {
return h[d]
}
}
var c = this.getGlobalUser_(d);
if (c !== null) {
return c
}
var b = Dygraph.DEFAULT_ATTRS.axes[i];
if (b.hasOwnProperty(d)) {
return b[d]
}
return this.getGlobalDefault_(d)
};
a.prototype.getForSeries = function (c, e) {
if (e === this.dygraph_.getHighlightSeries()) {
if (this.highlightSeries_.hasOwnProperty(c)) {
return this.highlightSeries_[c]
}
}
if (!this.series_.hasOwnProperty(e)) {
throw"Unknown series: " + e
}
var d = this.series_[e];
var b = d.options;
if (b.hasOwnProperty(c)) {
return b[c]
}
return this.getForAxis(c, d.yAxis)
};
a.prototype.numAxes = function () {
return this.yAxes_.length
};
a.prototype.axisForSeries = function (b) {
return this.series_[b].yAxis
};
a.prototype.axisOptions = function (b) {
return this.yAxes_[b].options
};
a.prototype.seriesForAxis = function (b) {
return this.yAxes_[b].series
};
a.prototype.seriesNames = function () {
return this.labels_
};
return a
})();
"use strict";
var DygraphLayout = function (a) {
this.dygraph_ = a;
this.points = [];
this.setNames = [];
this.annotations = [];
this.yAxes_ = null;
this.xTicks_ = null;
this.yTicks_ = null
};
DygraphLayout.prototype.attr_ = function (a) {
return this.dygraph_.attr_(a)
};
DygraphLayout.prototype.addDataset = function (a, b) {
this.points.push(b);
this.setNames.push(a)
};
DygraphLayout.prototype.getPlotArea = function () {
return this.area_
};
DygraphLayout.prototype.computePlotArea = function () {
var a = {x: 0, y: 0};
a.w = this.dygraph_.width_ - a.x - this.attr_("rightGap");
a.h = this.dygraph_.height_;
var b = {
chart_div: this.dygraph_.graphDiv, reserveSpaceLeft: function (c) {
var d = {x: a.x, y: a.y, w: c, h: a.h};
a.x += c;
a.w -= c;
return d
}, reserveSpaceRight: function (c) {
var d = {x: a.x + a.w - c, y: a.y, w: c, h: a.h};
a.w -= c;
return d
}, reserveSpaceTop: function (c) {
var d = {x: a.x, y: a.y, w: a.w, h: c};
a.y += c;
a.h -= c;
return d
}, reserveSpaceBottom: function (c) {
var d = {x: a.x, y: a.y + a.h - c, w: a.w, h: c};
a.h -= c;
return d
}, chartRect: function () {
return {x: a.x, y: a.y, w: a.w, h: a.h}
}
};
this.dygraph_.cascadeEvents_("layout", b);
this.area_ = a
};
DygraphLayout.prototype.setAnnotations = function (d) {
this.annotations = [];
var e = this.attr_("xValueParser") || function (a) {
return a
};
for (var c = 0; c < d.length; c++) {
var b = {};
if (!d[c].xval && d[c].x === undefined) {
this.dygraph_.error("Annotations must have an 'x' property");
return
}
if (d[c].icon && !(d[c].hasOwnProperty("width") && d[c].hasOwnProperty("height"))) {
this.dygraph_.error("Must set width and height when setting annotation.icon property");
return
}
Dygraph.update(b, d[c]);
if (!b.xval) {
b.xval = e(b.x)
}
this.annotations.push(b)
}
};
DygraphLayout.prototype.setXTicks = function (a) {
this.xTicks_ = a
};
DygraphLayout.prototype.setYAxes = function (a) {
this.yAxes_ = a
};
DygraphLayout.prototype.evaluate = function () {
this._evaluateLimits();
this._evaluateLineCharts();
this._evaluateLineTicks();
this._evaluateAnnotations()
};
DygraphLayout.prototype._evaluateLimits = function () {
var a = this.dygraph_.xAxisRange();
this.minxval = a[0];
this.maxxval = a[1];
var d = a[1] - a[0];
this.xscale = (d !== 0 ? 1 / d : 1);
for (var b = 0; b < this.yAxes_.length; b++) {
var c = this.yAxes_[b];
c.minyval = c.computedValueRange[0];
c.maxyval = c.computedValueRange[1];
c.yrange = c.maxyval - c.minyval;
c.yscale = (c.yrange !== 0 ? 1 / c.yrange : 1);
if (c.g.attr_("logscale")) {
c.ylogrange = Dygraph.log10(c.maxyval) - Dygraph.log10(c.minyval);
c.ylogscale = (c.ylogrange !== 0 ? 1 / c.ylogrange : 1);
if (!isFinite(c.ylogrange) || isNaN(c.ylogrange)) {
c.g.error("axis " + b + " of graph at " + c.g + " can't be displayed in log scale for range [" + c.minyval + " - " + c.maxyval + "]")
}
}
}
};
DygraphLayout._calcYNormal = function (b, c, a) {
if (a) {
return 1 - ((Dygraph.log10(c) - Dygraph.log10(b.minyval)) * b.ylogscale)
} else {
return 1 - ((c - b.minyval) * b.yscale)
}
};
DygraphLayout.prototype._evaluateLineCharts = function () {
var c = this.attr_("connectSeparatedPoints");
var k = this.attr_("stackedGraph");
var e = this.attr_("errorBars") || this.attr_("customBars");
for (var a = 0; a < this.points.length; a++) {
var l = this.points[a];
var f = this.setNames[a];
var b = this.dygraph_.axisPropertiesForSeries(f);
var g = this.dygraph_.attributes_.getForSeries("logscale", f);
for (var d = 0; d < l.length; d++) {
var i = l[d];
i.x = (i.xval - this.minxval) * this.xscale;
var h = i.yval;
if (k) {
i.y_stacked = DygraphLayout._calcYNormal(b, i.yval_stacked, g);
if (h !== null && !isNaN(h)) {
h = i.yval_stacked
}
}
if (h === null) {
h = NaN;
if (!c) {
i.yval = NaN
}
}
i.y = DygraphLayout._calcYNormal(b, h, g);
if (e) {
i.y_top = DygraphLayout._calcYNormal(b, h - i.yval_minus, g);
i.y_bottom = DygraphLayout._calcYNormal(b, h + i.yval_plus, g)
}
}
}
};
DygraphLayout.parseFloat_ = function (a) {
if (a === null) {
return NaN
}
return a
};
DygraphLayout.prototype._evaluateLineTicks = function () {
var d, c, b, f;
this.xticks = [];
for (d = 0; d < this.xTicks_.length; d++) {
c = this.xTicks_[d];
b = c.label;
f = this.xscale * (c.v - this.minxval);
if ((f >= 0) && (f <= 1)) {
this.xticks.push([f, b])
}
}
this.yticks = [];
for (d = 0; d < this.yAxes_.length; d++) {
var e = this.yAxes_[d];
for (var a = 0; a < e.ticks.length; a++) {
c = e.ticks[a];
b = c.label;
f = this.dygraph_.toPercentYCoord(c.v, d);
if ((f >= 0) && (f <= 1)) {
this.yticks.push([d, f, b])
}
}
}
};
DygraphLayout.prototype._evaluateAnnotations = function () {
var d;
var g = {};
for (d = 0; d < this.annotations.length; d++) {
var b = this.annotations[d];
g[b.xval + "," + b.series] = b
}
this.annotated_points = [];
if (!this.annotations || !this.annotations.length) {
return
}
for (var h = 0; h < this.points.length; h++) {
var e = this.points[h];
for (d = 0; d < e.length; d++) {
var f = e[d];
var c = f.xval + "," + f.name;
if (c in g) {
f.annotation = g[c];
this.annotated_points.push(f)
}
}
}
};
DygraphLayout.prototype.removeAllDatasets = function () {
delete this.points;
delete this.setNames;
delete this.setPointsLengths;
delete this.setPointsOffsets;
this.points = [];
this.setNames = [];
this.setPointsLengths = [];
this.setPointsOffsets = []
};
"use strict";
var DygraphCanvasRenderer = function (d, c, b, e) {
this.dygraph_ = d;
this.layout = e;
this.element = c;
this.elementContext = b;
this.container = this.element.parentNode;
this.height = this.element.height;
this.width = this.element.width;
if (!this.isIE && !(DygraphCanvasRenderer.isSupported(this.element))) {
throw"Canvas is not supported."
}
this.area = e.getPlotArea();
this.container.style.position = "relative";
this.container.style.width = this.width + "px";
if (this.dygraph_.isUsingExcanvas_) {
this._createIEClipArea()
} else {
if (!Dygraph.isAndroid()) {
var a = this.dygraph_.canvas_ctx_;
a.beginPath();
a.rect(this.area.x, this.area.y, this.area.w, this.area.h);
a.clip();
a = this.dygraph_.hidden_ctx_;
a.beginPath();
a.rect(this.area.x, this.area.y, this.area.w, this.area.h);
a.clip()
}
}
};
DygraphCanvasRenderer.prototype.attr_ = function (a, b) {
return this.dygraph_.attr_(a, b)
};
DygraphCanvasRenderer.prototype.clear = function () {
var a;
if (this.isIE) {
try {
if (this.clearDelay) {
this.clearDelay.cancel();
this.clearDelay = null
}
a = this.elementContext
} catch (b) {
return
}
}
a = this.elementContext;
a.clearRect(0, 0, this.width, this.height)
};
DygraphCanvasRenderer.isSupported = function (f) {
var b = null;
try {
if (typeof(f) == "undefined" || f === null) {
b = document.createElement("canvas")
} else {
b = f
}
b.getContext("2d")
} catch (c) {
var d = navigator.appVersion.match(/MSIE (\d\.\d)/);
var a = (navigator.userAgent.toLowerCase().indexOf("opera") != -1);
if ((!d) || (d[1] < 6) || (a)) {
return false
}
return true
}
return true
};
DygraphCanvasRenderer.prototype.render = function () {
this._updatePoints();
this._renderLineChart()
};
DygraphCanvasRenderer.prototype._createIEClipArea = function () {
var g = "dygraph-clip-div";
var f = this.dygraph_.graphDiv;
for (var e = f.childNodes.length - 1; e >= 0; e--) {
if (f.childNodes[e].className == g) {
f.removeChild(f.childNodes[e])
}
}
var c = document.bgColor;
var d = this.dygraph_.graphDiv;
while (d != document) {
var a = d.currentStyle.backgroundColor;
if (a && a != "transparent") {
c = a;
break
}
d = d.parentNode
}
function b(j) {
if (j.w === 0 || j.h === 0) {
return
}
var i = document.createElement("div");
i.className = g;
i.style.backgroundColor = c;
i.style.position = "absolute";
i.style.left = j.x + "px";
i.style.top = j.y + "px";
i.style.width = j.w + "px";
i.style.height = j.h + "px";
f.appendChild(i)
}
var h = this.area;
b({x: 0, y: 0, w: h.x, h: this.height});
b({x: h.x, y: 0, w: this.width - h.x, h: h.y});
b({x: h.x + h.w, y: 0, w: this.width - h.x - h.w, h: this.height});
b({x: h.x, y: h.y + h.h, w: this.width - h.x, h: this.height - h.h - h.y})
};
DygraphCanvasRenderer._getIteratorPredicate = function (a) {
return a ? DygraphCanvasRenderer._predicateThatSkipsEmptyPoints : null
};
DygraphCanvasRenderer._predicateThatSkipsEmptyPoints = function (b, a) {
return b[a].yval !== null
};
DygraphCanvasRenderer._drawStyledLine = function (i, a, m, q, f, n, d) {
var h = i.dygraph;
var c = h.getOption("stepPlot", i.setName);
if (!Dygraph.isArrayLike(q)) {
q = null
}
var l = h.getOption("drawGapEdgePoints", i.setName);
var o = i.points;
var k = Dygraph.createIterator(o, 0, o.length, DygraphCanvasRenderer._getIteratorPredicate(h.getOption("connectSeparatedPoints")));
var j = q && (q.length >= 2);
var p = i.drawingContext;
p.save();
if (j) {
p.installPattern(q)
}
var b = DygraphCanvasRenderer._drawSeries(i, k, m, d, f, l, c, a);
DygraphCanvasRenderer._drawPointsOnLine(i, b, n, a, d);
if (j) {
p.uninstallPattern()
}
p.restore()
};
DygraphCanvasRenderer._drawSeries = function (v, t, m, h, p, s, g, q) {
var b = null;
var w = null;
var k = null;
var j;
var o;
var l = [];
var f = true;
var n = v.drawingContext;
n.beginPath();
n.strokeStyle = q;
n.lineWidth = m;
var c = t.array_;
var u = t.end_;
var a = t.predicate_;
for (var r = t.start_; r < u; r++) {
o = c[r];
if (a) {
while (r < u && !a(c, r)) {
r++
}
if (r == u) {
break
}
o = c[r]
}
if (o.canvasy === null || o.canvasy != o.canvasy) {
if (g && b !== null) {
n.moveTo(b, w);
n.lineTo(o.canvasx, w)
}
b = w = null
} else {
j = false;
if (s || !b) {
t.nextIdx_ = r;
t.next();
k = t.hasNext ? t.peek.canvasy : null;
var d = k === null || k != k;
j = (!b && d);
if (s) {
if ((!f && !b) || (t.hasNext && d)) {
j = true
}
}
}
if (b !== null) {
if (m) {
if (g) {
n.moveTo(b, w);
n.lineTo(o.canvasx, w)
}
n.lineTo(o.canvasx, o.canvasy)
}
} else {
n.moveTo(o.canvasx, o.canvasy)
}
if (p || j) {
l.push([o.canvasx, o.canvasy, o.idx])
}
b = o.canvasx;
w = o.canvasy
}
f = false
}
n.stroke();
return l
};
DygraphCanvasRenderer._drawPointsOnLine = function (h, i, f, d, g) {
var c = h.drawingContext;
for (var b = 0; b < i.length; b++) {
var a = i[b];
c.save();
f(h.dygraph, h.setName, c, a[0], a[1], d, g, a[2]);
c.restore()
}
};
DygraphCanvasRenderer.prototype._updatePoints = function () {
var e = this.layout.points;
for (var c = e.length; c--;) {
var d = e[c];
for (var b = d.length; b--;) {
var a = d[b];
a.canvasx = this.area.w * a.x + this.area.x;
a.canvasy = this.area.h * a.y + this.area.y
}
}
};
DygraphCanvasRenderer.prototype._renderLineChart = function (g, u) {
var h = u || this.elementContext;
var n;
var a = this.layout.points;
var s = this.layout.setNames;
var b;
this.colors = this.dygraph_.colorsMap_;
var o = this.attr_("plotter");
var f = o;
if (!Dygraph.isArrayLike(f)) {
f = [f]
}
var c = {};
for (n = 0; n < s.length; n++) {
b = s[n];
var t = this.attr_("plotter", b);
if (t == o) {
continue
}
c[b] = t
}
for (n = 0; n < f.length; n++) {
var r = f[n];
var q = (n == f.length - 1);
for (var l = 0; l < a.length; l++) {
b = s[l];
if (g && b != g) {
continue
}
var m = a[l];
var e = r;
if (b in c) {
if (q) {
e = c[b]
} else {
continue
}
}
var k = this.colors[b];
var d = this.dygraph_.getOption("strokeWidth", b);
h.save();
h.strokeStyle = k;
h.lineWidth = d;
e({
points: m,
setName: b,
drawingContext: h,
color: k,
strokeWidth: d,
dygraph: this.dygraph_,
axis: this.dygraph_.axisPropertiesForSeries(b),
plotArea: this.area,
seriesIndex: l,
seriesCount: a.length,
singleSeriesName: g,
allSeriesPoints: a
});
h.restore()
}
}
};
DygraphCanvasRenderer._Plotters = {
linePlotter: function (a) {
DygraphCanvasRenderer._linePlotter(a)
}, fillPlotter: function (a) {
DygraphCanvasRenderer._fillPlotter(a)
}, errorPlotter: function (a) {
DygraphCanvasRenderer._errorPlotter(a)
}
};
DygraphCanvasRenderer._linePlotter = function (f) {
var d = f.dygraph;
var h = f.setName;
var i = f.strokeWidth;
var a = d.getOption("strokeBorderWidth", h);
var j = d.getOption("drawPointCallback", h) || Dygraph.Circles.DEFAULT;
var k = d.getOption("strokePattern", h);
var c = d.getOption("drawPoints", h);
var b = d.getOption("pointSize", h);
if (a && i) {
DygraphCanvasRenderer._drawStyledLine(f, d.getOption("strokeBorderColor", h), i + 2 * a, k, c, j, b)
}
DygraphCanvasRenderer._drawStyledLine(f, f.color, i, k, c, j, b)
};
DygraphCanvasRenderer._errorPlotter = function (s) {
var r = s.dygraph;
var f = s.setName;
var t = r.getOption("errorBars") || r.getOption("customBars");
if (!t) {
return
}
var k = r.getOption("fillGraph", f);
if (k) {
r.warn("Can't use fillGraph option with error bars")
}
var m = s.drawingContext;
var n = s.color;
var o = r.getOption("fillAlpha", f);
var i = r.getOption("stepPlot", f);
var p = s.points;
var q = Dygraph.createIterator(p, 0, p.length, DygraphCanvasRenderer._getIteratorPredicate(r.getOption("connectSeparatedPoints")));
var j;
var h = NaN;
var c = NaN;
var d = [-1, -1];
var a = new RGBColorParser(n);
var u = "rgba(" + a.r + "," + a.g + "," + a.b + "," + o + ")";
m.fillStyle = u;
m.beginPath();
var b = function (e) {
return (e === null || e === undefined || isNaN(e))
};
while (q.hasNext) {
var l = q.next();
if ((!i && b(l.y)) || (i && !isNaN(c) && b(c))) {
h = NaN;
continue
}
if (i) {
j = [l.y_bottom, l.y_top];
c = l.y
} else {
j = [l.y_bottom, l.y_top]
}
j[0] = s.plotArea.h * j[0] + s.plotArea.y;
j[1] = s.plotArea.h * j[1] + s.plotArea.y;
if (!isNaN(h)) {
if (i) {
m.moveTo(h, d[0]);
m.lineTo(l.canvasx, d[0]);
m.lineTo(l.canvasx, d[1])
} else {
m.moveTo(h, d[0]);
m.lineTo(l.canvasx, j[0]);
m.lineTo(l.canvasx, j[1])
}
m.lineTo(h, d[1]);
m.closePath()
}
d = j;
h = l.canvasx
}
m.fill()
};
DygraphCanvasRenderer._fillPlotter = function (F) {
if (F.singleSeriesName) {
return
}
if (F.seriesIndex !== 0) {
return
}
var D = F.dygraph;
var I = D.getLabels().slice(1);
for (var C = I.length; C >= 0; C--) {
if (!D.visibility()[C]) {
I.splice(C, 1)
}
}
var h = (function () {
for (var e = 0; e < I.length; e++) {
if (D.getOption("fillGraph", I[e])) {
return true
}
}
return false
})();
if (!h) {
return
}
var w = F.drawingContext;
var E = F.plotArea;
var c = F.allSeriesPoints;
var z = c.length;
var y = D.getOption("fillAlpha");
var k = D.getOption("stackedGraph");
var q = D.getColors();
var s = {};
var a;
var r;
for (var u = z - 1; u >= 0; u--) {
var n = I[u];
if (!D.getOption("fillGraph", n)) {
continue
}
var p = D.getOption("stepPlot", n);
var x = q[u];
var f = D.axisPropertiesForSeries(n);
var d = 1 + f.minyval * f.yscale;
if (d < 0) {
d = 0
} else {
if (d > 1) {
d = 1
}
}
d = E.h * d + E.y;
var B = c[u];
var A = Dygraph.createIterator(B, 0, B.length, DygraphCanvasRenderer._getIteratorPredicate(D.getOption("connectSeparatedPoints")));
var m = NaN;
var l = [-1, -1];
var t;
var b = new RGBColorParser(x);
var H = "rgba(" + b.r + "," + b.g + "," + b.b + "," + y + ")";
w.fillStyle = H;
w.beginPath();
var j, G = true;
while (A.hasNext) {
var v = A.next();
if (!Dygraph.isOK(v.y)) {
m = NaN;
if (v.y_stacked !== null && !isNaN(v.y_stacked)) {
s[v.canvasx] = E.h * v.y_stacked + E.y
}
continue
}
if (k) {
if (!G && j == v.xval) {
continue
} else {
G = false;
j = v.xval
}
a = s[v.canvasx];
var o;
if (a === undefined) {
o = d
} else {
if (r) {
o = a[0]
} else {
o = a
}
}
t = [v.canvasy, o];
if (p) {
if (l[0] === -1) {
s[v.canvasx] = [v.canvasy, d]
} else {
s[v.canvasx] = [v.canvasy, l[0]]
}
} else {
s[v.canvasx] = v.canvasy
}
} else {
t = [v.canvasy, d]
}
if (!isNaN(m)) {
w.moveTo(m, l[0]);
if (p) {
w.lineTo(v.canvasx, l[0])
} else {
w.lineTo(v.canvasx, t[0])
}
if (r && a) {
w.lineTo(v.canvasx, a[1])
} else {
w.lineTo(v.canvasx, t[1])
}
w.lineTo(m, l[1]);
w.closePath()
}
l = t;
m = v.canvasx
}
r = p;
w.fill()
}
};
"use strict";
var Dygraph = function (d, c, b, a) {
this.is_initial_draw_ = true;
this.readyFns_ = [];
if (a !== undefined) {
this.warn("Using deprecated four-argument dygraph constructor");
this.__old_init__(d, c, b, a)
} else {
this.__init__(d, c, b)
}
};
Dygraph.NAME = "Dygraph";
Dygraph.VERSION = "1.0.1";
Dygraph.__repr__ = function () {
return "[" + this.NAME + " " + this.VERSION + "]"
};
Dygraph.toString = function () {
return this.__repr__()
};
Dygraph.DEFAULT_ROLL_PERIOD = 1;
Dygraph.DEFAULT_WIDTH = 480;
Dygraph.DEFAULT_HEIGHT = 320;
Dygraph.ANIMATION_STEPS = 12;
Dygraph.ANIMATION_DURATION = 200;
Dygraph.KMB_LABELS = ["K", "M", "B", "T", "Q"];
Dygraph.KMG2_BIG_LABELS = ["k", "M", "G", "T", "P", "E", "Z", "Y"];
Dygraph.KMG2_SMALL_LABELS = ["m", "u", "n", "p", "f", "a", "z", "y"];
Dygraph.numberValueFormatter = function (s, a, u, l) {
var e = a("sigFigs");
if (e !== null) {
return Dygraph.floatFormat(s, e)
}
var c = a("digitsAfterDecimal");
var o = a("maxNumberWidth");
var b = a("labelsKMB");
var r = a("labelsKMG2");
var q;
if (s !== 0 && (Math.abs(s) >= Math.pow(10, o) || Math.abs(s) < Math.pow(10, -c))) {
q = s.toExponential(c)
} else {
q = "" + Dygraph.round_(s, c)
}
if (b || r) {
var f;
var t = [];
var m = [];
if (b) {
f = 1000;
t = Dygraph.KMB_LABELS
}
if (r) {
if (b) {
Dygraph.warn("Setting both labelsKMB and labelsKMG2. Pick one!")
}
f = 1024;
t = Dygraph.KMG2_BIG_LABELS;
m = Dygraph.KMG2_SMALL_LABELS
}
var p = Math.abs(s);
var d = Dygraph.pow(f, t.length);
for (var h = t.length - 1; h >= 0; h--, d /= f) {
if (p >= d) {
q = Dygraph.round_(s / d, c) + t[h];
break
}
}
if (r) {
var i = String(s.toExponential()).split("e-");
if (i.length === 2 && i[1] >= 3 && i[1] <= 24) {
if (i[1] % 3 > 0) {
q = Dygraph.round_(i[0] / Dygraph.pow(10, (i[1] % 3)), c)
} else {
q = Number(i[0]).toFixed(2)
}
q += m[Math.floor(i[1] / 3) - 1]
}
}
}
return q
};
Dygraph.numberAxisLabelFormatter = function (a, d, c, b) {
return Dygraph.numberValueFormatter(a, c, b)
};
Dygraph.dateString_ = function (e) {
var i = Dygraph.zeropad;
var h = new Date(e);
var f = "" + h.getFullYear();
var g = i(h.getMonth() + 1);
var a = i(h.getDate());
var c = "";
var b = h.getHours() * 3600 + h.getMinutes() * 60 + h.getSeconds();
if (b) {
c = " " + Dygraph.hmsString_(e)
}
return f + "/" + g + "/" + a + c
};
Dygraph.dateAxisFormatter = function (b, c) {
if (c >= Dygraph.DECADAL) {
return b.strftime("%Y")
} else {
if (c >= Dygraph.MONTHLY) {
return b.strftime("%b %y")
} else {
var a = b.getHours() * 3600 + b.getMinutes() * 60 + b.getSeconds() + b.getMilliseconds();
if (a === 0 || c >= Dygraph.DAILY) {
return new Date(b.getTime() + 3600 * 1000).strftime("%d%b")
} else {
return Dygraph.hmsString_(b.getTime())
}
}
}
};
Dygraph.Plotters = DygraphCanvasRenderer._Plotters;
Dygraph.DEFAULT_ATTRS = {
highlightCircleSize: 3,
highlightSeriesOpts: null,
highlightSeriesBackgroundAlpha: 0.5,
labelsDivWidth: 250,
labelsDivStyles: {},
labelsSeparateLines: false,
labelsShowZeroValues: true,
labelsKMB: false,
labelsKMG2: false,
showLabelsOnHighlight: true,
digitsAfterDecimal: 2,
maxNumberWidth: 6,
sigFigs: null,
strokeWidth: 1,
strokeBorderWidth: 0,
strokeBorderColor: "white",
axisTickSize: 3,
axisLabelFontSize: 14,
xAxisLabelWidth: 50,
yAxisLabelWidth: 50,
rightGap: 5,
showRoller: false,
xValueParser: Dygraph.dateParser,
delimiter: ",",
sigma: 2,
errorBars: false,
fractions: false,
wilsonInterval: true,
customBars: false,
fillGraph: false,
fillAlpha: 0.15,
connectSeparatedPoints: false,
stackedGraph: false,
stackedGraphNaNFill: "all",
hideOverlayOnMouseOut: true,
legend: "onmouseover",
stepPlot: false,
avoidMinZero: false,
xRangePad: 0,
yRangePad: null,
drawAxesAtZero: false,
titleHeight: 28,
xLabelHeight: 18,
yLabelWidth: 18,
drawXAxis: true,
drawYAxis: true,
axisLineColor: "black",
axisLineWidth: 0.3,
gridLineWidth: 0.3,
axisLabelColor: "black",
axisLabelFont: "Arial",
axisLabelWidth: 50,
drawYGrid: true,
drawXGrid: true,
gridLineColor: "rgb(128,128,128)",
interactionModel: null,
animatedZooms: false,
showRangeSelector: false,
rangeSelectorHeight: 40,
rangeSelectorPlotStrokeColor: "#808FAB",
rangeSelectorPlotFillColor: "#A7B1C4",
plotter: [Dygraph.Plotters.fillPlotter, Dygraph.Plotters.errorPlotter, Dygraph.Plotters.linePlotter],
plugins: [],
axes: {
x: {
pixelsPerLabel: 60,
axisLabelFormatter: Dygraph.dateAxisFormatter,
valueFormatter: Dygraph.dateString_,
drawGrid: true,
independentTicks: true,
ticker: null
},
y: {
pixelsPerLabel: 30,
valueFormatter: Dygraph.numberValueFormatter,
axisLabelFormatter: Dygraph.numberAxisLabelFormatter,
drawGrid: true,
independentTicks: true,
ticker: null
},
y2: {
pixelsPerLabel: 30,
valueFormatter: Dygraph.numberValueFormatter,
axisLabelFormatter: Dygraph.numberAxisLabelFormatter,
drawGrid: false,
independentTicks: false,
ticker: null
}
}
};
Dygraph.HORIZONTAL = 1;
Dygraph.VERTICAL = 2;
Dygraph.PLUGINS = [];
Dygraph.addedAnnotationCSS = false;
Dygraph.prototype.__old_init__ = function (f, d, e, b) {
if (e !== null) {
var a = ["Date"];
for (var c = 0; c < e.length; c++) {
a.push(e[c])
}
Dygraph.update(b, {labels: a})
}
this.__init__(f, d, b)
};
Dygraph.prototype.__init__ = function (a, c, l) {
if (/MSIE/.test(navigator.userAgent) && !window.opera && typeof(G_vmlCanvasManager) != "undefined" && document.readyState != "complete") {
var o = this;
setTimeout(function () {
o.__init__(a, c, l)
}, 100);
return
}
if (l === null || l === undefined) {
l = {}
}
l = Dygraph.mapLegacyOptions_(l);
if (typeof(a) == "string") {
a = document.getElementById(a)
}
if (!a) {
Dygraph.error("Constructing dygraph with a non-existent div!");
return
}
this.isUsingExcanvas_ = typeof(G_vmlCanvasManager) != "undefined";
this.maindiv_ = a;
this.file_ = c;
this.rollPeriod_ = l.rollPeriod || Dygraph.DEFAULT_ROLL_PERIOD;
this.previousVerticalX_ = -1;
this.fractions_ = l.fractions || false;
this.dateWindow_ = l.dateWindow || null;
this.annotations_ = [];
this.zoomed_x_ = false;
this.zoomed_y_ = false;
a.innerHTML = "";
if (a.style.width === "" && l.width) {
a.style.width = l.width + "px"
}
if (a.style.height === "" && l.height) {
a.style.height = l.height + "px"
}
if (a.style.height === "" && a.clientHeight === 0) {
a.style.height = Dygraph.DEFAULT_HEIGHT + "px";
if (a.style.width === "") {
a.style.width = Dygraph.DEFAULT_WIDTH + "px"
}
}
this.width_ = a.clientWidth || l.width || 0;
this.height_ = a.clientHeight || l.height || 0;
if (l.stackedGraph) {
l.fillGraph = true
}
this.user_attrs_ = {};
Dygraph.update(this.user_attrs_, l);
this.attrs_ = {};
Dygraph.updateDeep(this.attrs_, Dygraph.DEFAULT_ATTRS);
this.boundaryIds_ = [];
this.setIndexByName_ = {};
this.datasetIndex_ = [];
this.registeredEvents_ = [];
this.eventListeners_ = {};
this.attributes_ = new DygraphOptions(this);
this.createInterface_();
this.plugins_ = [];
var d = Dygraph.PLUGINS.concat(this.getOption("plugins"));
for (var g = 0; g < d.length; g++) {
var k = d[g];
var f = new k();
var j = {plugin: f, events: {}, options: {}, pluginOptions: {}};
var b = f.activate(this);
for (var h in b) {
j.events[h] = b[h]
}
this.plugins_.push(j)
}
for (var g = 0; g < this.plugins_.length; g++) {
var n = this.plugins_[g];
for (var h in n.events) {
if (!n.events.hasOwnProperty(h)) {
continue
}
var m = n.events[h];
var e = [n.plugin, m];
if (!(h in this.eventListeners_)) {
this.eventListeners_[h] = [e]
} else {
this.eventListeners_[h].push(e)
}
}
}
this.createDragInterface_();
this.start_()
};
Dygraph.prototype.cascadeEvents_ = function (c, b) {
if (!(c in this.eventListeners_)) {
return true
}
var g = {
dygraph: this, cancelable: false, defaultPrevented: false, preventDefault: function () {
if (!g.cancelable) {
throw"Cannot call preventDefault on non-cancelable event."
}
g.defaultPrevented = true
}, propagationStopped: false, stopPropagation: function () {
g.propagationStopped = true
}
};
Dygraph.update(g, b);
var a = this.eventListeners_[c];
if (a) {
for (var d = a.length - 1; d >= 0; d--) {
var f = a[d][0];
var h = a[d][1];
h.call(f, g);
if (g.propagationStopped) {
break
}
}
}
return g.defaultPrevented
};
Dygraph.prototype.isZoomed = function (a) {
if (a === null || a === undefined) {
return this.zoomed_x_ || this.zoomed_y_
}
if (a === "x") {
return this.zoomed_x_
}
if (a === "y") {
return this.zoomed_y_
}
throw"axis parameter is [" + a + "] must be null, 'x' or 'y'."
};
Dygraph.prototype.toString = function () {
var a = this.maindiv_;
var b = (a && a.id) ? a.id : a;
return "[Dygraph " + b + "]"
};
Dygraph.prototype.attr_ = function (b, a) {
return a ? this.attributes_.getForSeries(b, a) : this.attributes_.get(b)
};
Dygraph.prototype.getOption = function (a, b) {
return this.attr_(a, b)
};
Dygraph.prototype.getOptionForAxis = function (a, b) {
return this.attributes_.getForAxis(a, b)
};
Dygraph.prototype.optionsViewForAxis_ = function (b) {
var a = this;
return function (c) {
var d = a.user_attrs_.axes;
if (d && d[b] && d[b].hasOwnProperty(c)) {
return d[b][c]
}
if (typeof(a.user_attrs_[c]) != "undefined") {
return a.user_attrs_[c]
}
d = a.attrs_.axes;
if (d && d[b] && d[b].hasOwnProperty(c)) {
return d[b][c]
}
if (b == "y" && a.axes_[0].hasOwnProperty(c)) {
return a.axes_[0][c]
} else {
if (b == "y2" && a.axes_[1].hasOwnProperty(c)) {
return a.axes_[1][c]
}
}
return a.attr_(c)
}
};
Dygraph.prototype.rollPeriod = function () {
return this.rollPeriod_
};
Dygraph.prototype.xAxisRange = function () {
return this.dateWindow_ ? this.dateWindow_ : this.xAxisExtremes()
};
Dygraph.prototype.xAxisExtremes = function () {
var d = this.attr_("xRangePad") / this.plotter_.area.w;
if (this.numRows() === 0) {
return [0 - d, 1 + d]
}
var c = this.rawData_[0][0];
var b = this.rawData_[this.rawData_.length - 1][0];
if (d) {
var a = b - c;
c -= a * d;
b += a * d
}
return [c, b]
};
Dygraph.prototype.yAxisRange = function (a) {
if (typeof(a) == "undefined") {
a = 0
}
if (a < 0 || a >= this.axes_.length) {
return null
}
var b = this.axes_[a];
return [b.computedValueRange[0], b.computedValueRange[1]]
};
Dygraph.prototype.yAxisRanges = function () {
var a = [];
for (var b = 0; b < this.axes_.length; b++) {
a.push(this.yAxisRange(b))
}
return a
};
Dygraph.prototype.toDomCoords = function (a, c, b) {
return [this.toDomXCoord(a), this.toDomYCoord(c, b)]
};
Dygraph.prototype.toDomXCoord = function (b) {
if (b === null) {
return null
}
var c = this.plotter_.area;
var a = this.xAxisRange();
return c.x + (b - a[0]) / (a[1] - a[0]) * c.w
};
Dygraph.prototype.toDomYCoord = function (d, a) {
var c = this.toPercentYCoord(d, a);
if (c === null) {
return null
}
var b = this.plotter_.area;
return b.y + c * b.h
};
Dygraph.prototype.toDataCoords = function (a, c, b) {
return [this.toDataXCoord(a), this.toDataYCoord(c, b)]
};
Dygraph.prototype.toDataXCoord = function (b) {
if (b === null) {
return null
}
var c = this.plotter_.area;
var a = this.xAxisRange();
return a[0] + (b - c.x) / c.w * (a[1] - a[0])
};
Dygraph.prototype.toDataYCoord = function (h, b) {
if (h === null) {
return null
}
var c = this.plotter_.area;
var g = this.yAxisRange(b);
if (typeof(b) == "undefined") {
b = 0
}
if (!this.attributes_.getForAxis("logscale", b)) {
return g[0] + (c.y + c.h - h) / c.h * (g[1] - g[0])
} else {
var f = (h - c.y) / c.h;
var a = Dygraph.log10(g[1]);
var e = a - (f * (a - Dygraph.log10(g[0])));
var d = Math.pow(Dygraph.LOG_SCALE, e);
return d
}
};
Dygraph.prototype.toPercentYCoord = function (f, c) {
if (f === null) {
return null
}
if (typeof(c) == "undefined") {
c = 0
}
var e = this.yAxisRange(c);
var d;
var b = this.attributes_.getForAxis("logscale", c);
if (!b) {
d = (e[1] - f) / (e[1] - e[0])
} else {
var a = Dygraph.log10(e[1]);
d = (a - Dygraph.log10(f)) / (a - Dygraph.log10(e[0]))
}
return d
};
Dygraph.prototype.toPercentXCoord = function (b) {
if (b === null) {
return null
}
var a = this.xAxisRange();
return (b - a[0]) / (a[1] - a[0])
};
Dygraph.prototype.numColumns = function () {
if (!this.rawData_) {
return 0
}
return this.rawData_[0] ? this.rawData_[0].length : this.attr_("labels").length
};
Dygraph.prototype.numRows = function () {
if (!this.rawData_) {
return 0
}
return this.rawData_.length
};
Dygraph.prototype.getValue = function (b, a) {
if (b < 0 || b > this.rawData_.length) {
return null
}
if (a < 0 || a > this.rawData_[b].length) {
return null
}
return this.rawData_[b][a]
};
Dygraph.prototype.createInterface_ = function () {
var a = this.maindiv_;
this.graphDiv = document.createElement("div");
this.graphDiv.style.textAlign = "left";
a.appendChild(this.graphDiv);
this.canvas_ = Dygraph.createCanvas();
this.canvas_.style.position = "absolute";
this.hidden_ = this.createPlotKitCanvas_(this.canvas_);
this.resizeElements_();
this.canvas_ctx_ = Dygraph.getContext(this.canvas_);
this.hidden_ctx_ = Dygraph.getContext(this.hidden_);
this.graphDiv.appendChild(this.hidden_);
this.graphDiv.appendChild(this.canvas_);
this.mouseEventElement_ = this.createMouseEventElement_();
this.layout_ = new DygraphLayout(this);
var b = this;
this.mouseMoveHandler_ = function (c) {
b.mouseMove_(c)
};
this.mouseOutHandler_ = function (f) {
var d = f.target || f.fromElement;
var c = f.relatedTarget || f.toElement;
if (Dygraph.isNodeContainedBy(d, b.graphDiv) && !Dygraph.isNodeContainedBy(c, b.graphDiv)) {
b.mouseOut_(f)
}
};
this.addAndTrackEvent(window, "mouseout", this.mouseOutHandler_);
this.addAndTrackEvent(this.mouseEventElement_, "mousemove", this.mouseMoveHandler_);
if (!this.resizeHandler_) {
this.resizeHandler_ = function (c) {
b.resize()
};
this.addAndTrackEvent(window, "resize", this.resizeHandler_)
}
};
Dygraph.prototype.resizeElements_ = function () {
this.graphDiv.style.width = this.width_ + "px";
this.graphDiv.style.height = this.height_ + "px";
this.canvas_.width = this.width_;
this.canvas_.height = this.height_;
this.canvas_.style.width = this.width_ + "px";
this.canvas_.style.height = this.height_ + "px";
this.hidden_.width = this.width_;
this.hidden_.height = this.height_;
this.hidden_.style.width = this.width_ + "px";
this.hidden_.style.height = this.height_ + "px"
};
Dygraph.prototype.destroy = function () {
this.canvas_ctx_.restore();
this.hidden_ctx_.restore();
var a = function (c) {
while (c.hasChildNodes()) {
a(c.firstChild);
c.removeChild(c.firstChild)
}
};
this.removeTrackedEvents_();
Dygraph.removeEvent(window, "mouseout", this.mouseOutHandler_);
Dygraph.removeEvent(this.mouseEventElement_, "mousemove", this.mouseMoveHandler_);
Dygraph.removeEvent(window, "resize", this.resizeHandler_);
this.resizeHandler_ = null;
a(this.maindiv_);
var b = function (c) {
for (var d in c) {
if (typeof(c[d]) === "object") {
c[d] = null
}
}
};
b(this.layout_);
b(this.plotter_);
b(this)
};
Dygraph.prototype.createPlotKitCanvas_ = function (a) {
var b = Dygraph.createCanvas();
b.style.position = "absolute";
b.style.top = a.style.top;
b.style.left = a.style.left;
b.width = this.width_;
b.height = this.height_;
b.style.width = this.width_ + "px";
b.style.height = this.height_ + "px";
return b
};
Dygraph.prototype.createMouseEventElement_ = function () {
if (this.isUsingExcanvas_) {
var a = document.createElement("div");
a.style.position = "absolute";
a.style.backgroundColor = "white";
a.style.filter = "alpha(opacity=0)";
a.style.width = this.width_ + "px";
a.style.height = this.height_ + "px";
this.graphDiv.appendChild(a);
return a
} else {
return this.canvas_
}
};
Dygraph.prototype.setColors_ = function () {
var g = this.getLabels();
var e = g.length - 1;
this.colors_ = [];
this.colorsMap_ = {};
var a = this.attr_("colors");
var d;
if (!a) {
var c = this.attr_("colorSaturation") || 1;
var b = this.attr_("colorValue") || 0.5;
var k = Math.ceil(e / 2);
for (d = 1; d <= e; d++) {
if (!this.visibility()[d - 1]) {
continue
}
var h = d % 2 ? Math.ceil(d / 2) : (k + d / 2);
var f = (1 * h / (1 + e));
var j = Dygraph.hsvToRGB(f, c, b);
this.colors_.push(j);
this.colorsMap_[g[d]] = j
}
} else {
for (d = 0; d < e; d++) {
if (!this.visibility()[d]) {
continue
}
var j = a[d % a.length];
this.colors_.push(j);
this.colorsMap_[g[1 + d]] = j
}
}
};
Dygraph.prototype.getColors = function () {
return this.colors_
};
Dygraph.prototype.getPropertiesForSeries = function (c) {
var a = -1;
var d = this.getLabels();
for (var b = 1; b < d.length; b++) {
if (d[b] == c) {
a = b;
break
}
}
if (a == -1) {
return null
}
return {
name: c,
column: a,
visible: this.visibility()[a - 1],
color: this.colorsMap_[c],
axis: 1 + this.attributes_.axisForSeries(c)
}
};
Dygraph.prototype.createRollInterface_ = function () {
if (!this.roller_) {
this.roller_ = document.createElement("input");
this.roller_.type = "text";
this.roller_.style.display = "none";
this.graphDiv.appendChild(this.roller_)
}
var e = this.attr_("showRoller") ? "block" : "none";
var d = this.plotter_.area;
var b = {position: "absolute", zIndex: 10, top: (d.y + d.h - 25) + "px", left: (d.x + 1) + "px", display: e};
this.roller_.size = "2";
this.roller_.value = this.rollPeriod_;
for (var a in b) {
if (b.hasOwnProperty(a)) {
this.roller_.style[a] = b[a]
}
}
var c = this;
this.roller_.onchange = function () {
c.adjustRoll(c.roller_.value)
}
};
Dygraph.prototype.dragGetX_ = function (b, a) {
return Dygraph.pageX(b) - a.px
};
Dygraph.prototype.dragGetY_ = function (b, a) {
return Dygraph.pageY(b) - a.py
};
Dygraph.prototype.createDragInterface_ = function () {
var c = {
isZooming: false,
isPanning: false,
is2DPan: false,
dragStartX: null,
dragStartY: null,
dragEndX: null,
dragEndY: null,
dragDirection: null,
prevEndX: null,
prevEndY: null,
prevDragDirection: null,
cancelNextDblclick: false,
initialLeftmostDate: null,
xUnitsPerPixel: null,
dateRange: null,
px: 0,
py: 0,
boundedDates: null,
boundedValues: null,
tarp: new Dygraph.IFrameTarp(),
initializeMouseDown: function (j, i, h) {
if (j.preventDefault) {
j.preventDefault()
} else {
j.returnValue = false;
j.cancelBubble = true
}
h.px = Dygraph.findPosX(i.canvas_);
h.py = Dygraph.findPosY(i.canvas_);
h.dragStartX = i.dragGetX_(j, h);
h.dragStartY = i.dragGetY_(j, h);
h.cancelNextDblclick = false;
h.tarp.cover()
}
};
var f = this.attr_("interactionModel");
var b = this;
var e = function (g) {
return function (h) {
g(h, b, c)
}
};
for (var a in f) {
if (!f.hasOwnProperty(a)) {
continue
}
this.addAndTrackEvent(this.mouseEventElement_, a, e(f[a]))
}
var d = function (h) {
if (c.isZooming || c.isPanning) {
c.isZooming = false;
c.dragStartX = null;
c.dragStartY = null
}
if (c.isPanning) {
c.isPanning = false;
c.draggingDate = null;
c.dateRange = null;
for (var g = 0; g < b.axes_.length; g++) {
delete b.axes_[g].draggingValue;
delete b.axes_[g].dragValueRange
}
}
c.tarp.uncover()
};
this.addAndTrackEvent(document, "mouseup", d)
};
Dygraph.prototype.drawZoomRect_ = function (e, c, i, b, g, a, f, d) {
var h = this.canvas_ctx_;
if (a == Dygraph.HORIZONTAL) {
h.clearRect(Math.min(c, f), this.layout_.getPlotArea().y, Math.abs(c - f), this.layout_.getPlotArea().h)
} else {
if (a == Dygraph.VERTICAL) {
h.clearRect(this.layout_.getPlotArea().x, Math.min(b, d), this.layout_.getPlotArea().w, Math.abs(b - d))
}
}
if (e == Dygraph.HORIZONTAL) {
if (i && c) {
h.fillStyle = "rgba(128,128,128,0.33)";
h.fillRect(Math.min(c, i), this.layout_.getPlotArea().y, Math.abs(i - c), this.layout_.getPlotArea().h)
}
} else {
if (e == Dygraph.VERTICAL) {
if (g && b) {
h.fillStyle = "rgba(128,128,128,0.33)";
h.fillRect(this.layout_.getPlotArea().x, Math.min(b, g), this.layout_.getPlotArea().w, Math.abs(g - b))
}
}
}
if (this.isUsingExcanvas_) {
this.currentZoomRectArgs_ = [e, c, i, b, g, 0, 0, 0]
}
};
Dygraph.prototype.clearZoomRect_ = function () {
this.currentZoomRectArgs_ = null;
this.canvas_ctx_.clearRect(0, 0, this.canvas_.width, this.canvas_.height)
};
Dygraph.prototype.doZoomX_ = function (c, a) {
this.currentZoomRectArgs_ = null;
var b = this.toDataXCoord(c);
var d = this.toDataXCoord(a);
this.doZoomXDates_(b, d)
};
Dygraph.zoomAnimationFunction = function (c, b) {
var a = 1.5;
return (1 - Math.pow(a, -c)) / (1 - Math.pow(a, -b))
};
Dygraph.prototype.doZoomXDates_ = function (c, e) {
var a = this.xAxisRange();
var d = [c, e];
this.zoomed_x_ = true;
var b = this;
this.doAnimatedZoom(a, d, null, null, function () {
if (b.attr_("zoomCallback")) {
b.attr_("zoomCallback")(c, e, b.yAxisRanges())
}
})
};
Dygraph.prototype.doZoomY_ = function (h, f) {
this.currentZoomRectArgs_ = null;
var c = this.yAxisRanges();
var b = [];
for (var e = 0; e < this.axes_.length; e++) {
var d = this.toDataYCoord(h, e);
var a = this.toDataYCoord(f, e);
b.push([a, d])
}
this.zoomed_y_ = true;
var g = this;
this.doAnimatedZoom(null, null, c, b, function () {
if (g.attr_("zoomCallback")) {
var i = g.xAxisRange();
g.attr_("zoomCallback")(i[0], i[1], g.yAxisRanges())
}
})
};
Dygraph.prototype.resetZoom = function () {
var c = false, d = false, a = false;
if (this.dateWindow_ !== null) {
c = true;
d = true
}
for (var g = 0; g < this.axes_.length; g++) {
if (typeof(this.axes_[g].valueWindow) !== "undefined" && this.axes_[g].valueWindow !== null) {
c = true;
a = true
}
}
this.clearSelection();
if (c) {
this.zoomed_x_ = false;
this.zoomed_y_ = false;
var f = this.rawData_[0][0];
var b = this.rawData_[this.rawData_.length - 1][0];
if (!this.attr_("animatedZooms")) {
this.dateWindow_ = null;
for (g = 0; g < this.axes_.length; g++) {
if (this.axes_[g].valueWindow !== null) {
delete this.axes_[g].valueWindow
}
}
this.drawGraph_();
if (this.attr_("zoomCallback")) {
this.attr_("zoomCallback")(f, b, this.yAxisRanges())
}
return
}
var l = null, m = null, k = null, h = null;
if (d) {
l = this.xAxisRange();
m = [f, b]
}
if (a) {
k = this.yAxisRanges();
var n = this.gatherDatasets_(this.rolledSeries_, null);
var o = n.extremes;
this.computeYAxisRanges_(o);
h = [];
for (g = 0; g < this.axes_.length; g++) {
var e = this.axes_[g];
h.push((e.valueRange !== null && e.valueRange !== undefined) ? e.valueRange : e.extremeRange)
}
}
var j = this;
this.doAnimatedZoom(l, m, k, h, function () {
j.dateWindow_ = null;
for (var p = 0; p < j.axes_.length; p++) {
if (j.axes_[p].valueWindow !== null) {
delete j.axes_[p].valueWindow
}
}
if (j.attr_("zoomCallback")) {
j.attr_("zoomCallback")(f, b, j.yAxisRanges())
}
})
}
};
Dygraph.prototype.doAnimatedZoom = function (a, e, b, c, m) {
var i = this.attr_("animatedZooms") ? Dygraph.ANIMATION_STEPS : 1;
var l = [];
var k = [];
var f, d;
if (a !== null && e !== null) {
for (f = 1; f <= i; f++) {
d = Dygraph.zoomAnimationFunction(f, i);
l[f - 1] = [a[0] * (1 - d) + d * e[0], a[1] * (1 - d) + d * e[1]]
}
}
if (b !== null && c !== null) {
for (f = 1; f <= i; f++) {
d = Dygraph.zoomAnimationFunction(f, i);
var n = [];
for (var g = 0; g < this.axes_.length; g++) {
n.push([b[g][0] * (1 - d) + d * c[g][0], b[g][1] * (1 - d) + d * c[g][1]])
}
k[f - 1] = n
}
}
var h = this;
Dygraph.repeatAndCleanup(function (p) {
if (k.length) {
for (var o = 0; o < h.axes_.length; o++) {
var j = k[p][o];
h.axes_[o].valueWindow = [j[0], j[1]]
}
}
if (l.length) {
h.dateWindow_ = l[p]
}
h.drawGraph_()
}, i, Dygraph.ANIMATION_DURATION / i, m)
};
Dygraph.prototype.getArea = function () {
return this.plotter_.area
};
Dygraph.prototype.eventToDomCoords = function (c) {
if (c.offsetX && c.offsetY) {
return [c.offsetX, c.offsetY]
} else {
var b = Dygraph.pageX(c) - Dygraph.findPosX(this.mouseEventElement_);
var a = Dygraph.pageY(c) - Dygraph.findPosY(this.mouseEventElement_);
return [b, a]
}
};
Dygraph.prototype.findClosestRow = function (a) {
var g = Infinity;
var h = -1;
var e = this.layout_.points;
for (var c = 0; c < e.length; c++) {
var l = e[c];
var d = l.length;
for (var b = 0; b < d; b++) {
var k = l[b];
if (!Dygraph.isValidPoint(k, true)) {
continue
}
var f = Math.abs(k.canvasx - a);
if (f < g) {
g = f;
h = k.idx
}
}
}
return h
};
Dygraph.prototype.findClosestPoint = function (f, e) {
var k = Infinity;
var h, o, n, l, d, c, j;
for (var b = this.layout_.points.length - 1; b >= 0; --b) {
var m = this.layout_.points[b];
for (var g = 0; g < m.length; ++g) {
l = m[g];
if (!Dygraph.isValidPoint(l)) {
continue
}
o = l.canvasx - f;
n = l.canvasy - e;
h = o * o + n * n;
if (h < k) {
k = h;
d = l;
c = b;
j = l.idx
}
}
}
var a = this.layout_.setNames[c];
return {row: j, seriesName: a, point: d}
};
Dygraph.prototype.findStackedPoint = function (i, h) {
var p = this.findClosestRow(i);
var f, c;
for (var d = 0; d < this.layout_.points.length; ++d) {
var g = this.getLeftBoundary_(d);
var e = p - g;
var l = this.layout_.points[d];
if (e >= l.length) {
continue
}
var m = l[e];
if (!Dygraph.isValidPoint(m)) {
continue
}
var j = m.canvasy;
if (i > m.canvasx && e + 1 < l.length) {
var k = l[e + 1];
if (Dygraph.isValidPoint(k)) {
var o = k.canvasx - m.canvasx;
if (o > 0) {
var a = (i - m.canvasx) / o;
j += a * (k.canvasy - m.canvasy)
}
}
} else {
if (i < m.canvasx && e > 0) {
var n = l[e - 1];
if (Dygraph.isValidPoint(n)) {
var o = m.canvasx - n.canvasx;
if (o > 0) {
var a = (m.canvasx - i) / o;
j += a * (n.canvasy - m.canvasy)
}
}
}
}
if (d === 0 || j < h) {
f = m;
c = d
}
}
var b = this.layout_.setNames[c];
return {row: p, seriesName: b, point: f}
};
Dygraph.prototype.mouseMove_ = function (b) {
var h = this.layout_.points;
if (h === undefined || h === null) {
return
}
var e = this.eventToDomCoords(b);
var a = e[0];
var j = e[1];
var f = this.attr_("highlightSeriesOpts");
var d = false;
if (f && !this.isSeriesLocked()) {
var c;
if (this.attr_("stackedGraph")) {
c = this.findStackedPoint(a, j)
} else {
c = this.findClosestPoint(a, j)
}
d = this.setSelection(c.row, c.seriesName)
} else {
var g = this.findClosestRow(a);
d = this.setSelection(g)
}
var i = this.attr_("highlightCallback");
if (i && d) {
i(b, this.lastx_, this.selPoints_, this.lastRow_, this.highlightSet_)
}
};
Dygraph.prototype.getLeftBoundary_ = function (b) {
if (this.boundaryIds_[b]) {
return this.boundaryIds_[b][0]
} else {
for (var a = 0; a < this.boundaryIds_.length; a++) {
if (this.boundaryIds_[a] !== undefined) {
return this.boundaryIds_[a][0]
}
}
return 0
}
};
Dygraph.prototype.animateSelection_ = function (f) {
var e = 10;
var c = 30;
if (this.fadeLevel === undefined) {
this.fadeLevel = 0
}
if (this.animateId === undefined) {
this.animateId = 0
}
var g = this.fadeLevel;
var b = f < 0 ? g : e - g;
if (b <= 0) {
if (this.fadeLevel) {
this.updateSelection_(1)
}
return
}
var a = ++this.animateId;
var d = this;
Dygraph.repeatAndCleanup(function (h) {
if (d.animateId != a) {
return
}
d.fadeLevel += f;
if (d.fadeLevel === 0) {
d.clearSelection()
} else {
d.updateSelection_(d.fadeLevel / e)
}
}, b, c, function () {
})
};
Dygraph.prototype.updateSelection_ = function (d) {
this.cascadeEvents_("select", {selectedX: this.lastx_, selectedPoints: this.selPoints_});
var h;
var n = this.canvas_ctx_;
if (this.attr_("highlightSeriesOpts")) {
n.clearRect(0, 0, this.width_, this.height_);
var f = 1 - this.attr_("highlightSeriesBackgroundAlpha");
if (f) {
var g = true;
if (g) {
if (d === undefined) {
this.animateSelection_(1);
return
}
f *= d
}
n.fillStyle = "rgba(255,255,255," + f + ")";
n.fillRect(0, 0, this.width_, this.height_)
}
this.plotter_._renderLineChart(this.highlightSet_, n)
} else {
if (this.previousVerticalX_ >= 0) {
var j = 0;
var k = this.attr_("labels");
for (h = 1; h < k.length; h++) {
var c = this.attr_("highlightCircleSize", k[h]);
if (c > j) {
j = c
}
}
var l = this.previousVerticalX_;
n.clearRect(l - j - 1, 0, 2 * j + 2, this.height_)
}
}
if (this.isUsingExcanvas_ && this.currentZoomRectArgs_) {
Dygraph.prototype.drawZoomRect_.apply(this, this.currentZoomRectArgs_)
}
if (this.selPoints_.length > 0) {
var b = this.selPoints_[0].canvasx;
n.save();
for (h = 0; h < this.selPoints_.length; h++) {
var o = this.selPoints_[h];
if (!Dygraph.isOK(o.canvasy)) {
continue
}
var a = this.attr_("highlightCircleSize", o.name);
var m = this.attr_("drawHighlightPointCallback", o.name);
var e = this.plotter_.colors[o.name];
if (!m) {
m = Dygraph.Circles.DEFAULT
}
n.lineWidth = this.attr_("strokeWidth", o.name);
n.strokeStyle = e;
n.fillStyle = e;
m(this.g, o.name, n, b, o.canvasy, e, a, o.idx)
}
n.restore();
this.previousVerticalX_ = b
}
};
Dygraph.prototype.setSelection = function (f, h, g) {
this.selPoints_ = [];
var e = false;
if (f !== false && f >= 0) {
if (f != this.lastRow_) {
e = true
}
this.lastRow_ = f;
for (var d = 0; d < this.layout_.points.length; ++d) {
var b = this.layout_.points[d];
var c = f - this.getLeftBoundary_(d);
if (c < b.length) {
var a = b[c];
if (a.yval !== null) {
this.selPoints_.push(a)
}
}
}
} else {
if (this.lastRow_ >= 0) {
e = true
}
this.lastRow_ = -1
}
if (this.selPoints_.length) {
this.lastx_ = this.selPoints_[0].xval
} else {
this.lastx_ = -1
}
if (h !== undefined) {
if (this.highlightSet_ !== h) {
e = true
}
this.highlightSet_ = h
}
if (g !== undefined) {
this.lockedSet_ = g
}
if (e) {
this.updateSelection_(undefined)
}
return e
};
Dygraph.prototype.mouseOut_ = function (a) {
if (this.attr_("unhighlightCallback")) {
this.attr_("unhighlightCallback")(a)
}
if (this.attr_("hideOverlayOnMouseOut") && !this.lockedSet_) {
this.clearSelection()
}
};
Dygraph.prototype.clearSelection = function () {
this.cascadeEvents_("deselect", {});
this.lockedSet_ = false;
if (this.fadeLevel) {
this.animateSelection_(-1);
return
}
this.canvas_ctx_.clearRect(0, 0, this.width_, this.height_);
this.fadeLevel = 0;
this.selPoints_ = [];
this.lastx_ = -1;
this.lastRow_ = -1;
this.highlightSet_ = null
};
Dygraph.prototype.getSelection = function () {
if (!this.selPoints_ || this.selPoints_.length < 1) {
return -1
}
for (var c = 0; c < this.layout_.points.length; c++) {
var a = this.layout_.points[c];
for (var b = 0; b < a.length; b++) {
if (a[b].x == this.selPoints_[0].x) {
return a[b].idx
}
}
}
return -1
};
Dygraph.prototype.getHighlightSeries = function () {
return this.highlightSet_
};
Dygraph.prototype.isSeriesLocked = function () {
return this.lockedSet_
};
Dygraph.prototype.loadedEvent_ = function (a) {
this.rawData_ = this.parseCSV_(a);
this.predraw_()
};
Dygraph.prototype.addXTicks_ = function () {
var a;
if (this.dateWindow_) {
a = [this.dateWindow_[0], this.dateWindow_[1]]
} else {
a = this.xAxisExtremes()
}
var c = this.optionsViewForAxis_("x");
var b = c("ticker")(a[0], a[1], this.width_, c, this);
this.layout_.setXTicks(b)
};
Dygraph.prototype.extremeValues_ = function (d) {
var h = null, f = null, c, g;
var b = this.attr_("errorBars") || this.attr_("customBars");
if (b) {
for (c = 0; c < d.length; c++) {
g = d[c][1][0];
if (g === null || isNaN(g)) {
continue
}
var a = g - d[c][1][1];
var e = g + d[c][1][2];
if (a > g) {
a = g
}
if (e < g) {
e = g
}
if (f === null || e > f) {
f = e
}
if (h === null || a < h) {
h = a
}
}
} else {
for (c = 0; c < d.length; c++) {
g = d[c][1];
if (g === null || isNaN(g)) {
continue
}
if (f === null || g > f) {
f = g
}
if (h === null || g < h) {
h = g
}
}
}
return [h, f]
};
Dygraph.prototype.predraw_ = function () {
var e = new Date();
this.layout_.computePlotArea();
this.computeYAxes_();
if (this.plotter_) {
this.cascadeEvents_("clearChart");
this.plotter_.clear()
}
if (!this.is_initial_draw_) {
this.canvas_ctx_.restore();
this.hidden_ctx_.restore()
}
this.canvas_ctx_.save();
this.hidden_ctx_.save();
this.plotter_ = new DygraphCanvasRenderer(this, this.hidden_, this.hidden_ctx_, this.layout_);
this.createRollInterface_();
this.cascadeEvents_("predraw");
this.rolledSeries_ = [null];
for (var c = 1; c < this.numColumns(); c++) {
var d = this.attr_("logscale");
var b = this.extractSeries_(this.rawData_, c, d);
b = this.rollingAverage(b, this.rollPeriod_);
this.rolledSeries_.push(b)
}
this.drawGraph_();
var a = new Date();
this.drawingTimeMs_ = (a - e)
};
Dygraph.PointType = undefined;
Dygraph.seriesToPoints_ = function (b, j, d, f) {
var h = [];
for (var c = 0; c < b.length; ++c) {
var k = b[c];
var a = j ? k[1][0] : k[1];
var e = a === null ? null : DygraphLayout.parseFloat_(a);
var g = {x: NaN, y: NaN, xval: DygraphLayout.parseFloat_(k[0]), yval: e, name: d, idx: c + f};
if (j) {
g.y_top = NaN;
g.y_bottom = NaN;
g.yval_minus = DygraphLayout.parseFloat_(k[1][1]);
g.yval_plus = DygraphLayout.parseFloat_(k[1][2])
}
h.push(g)
}
return h
};
Dygraph.stackPoints_ = function (m, l, o, f) {
var h = null;
var d = null;
var g = null;
var c = -1;
var k = function (i) {
if (c >= i) {
return
}
for (var p = i; p < m.length; ++p) {
g = null;
if (!isNaN(m[p].yval) && m[p].yval !== null) {
c = p;
g = m[p];
break
}
}
};
for (var b = 0; b < m.length; ++b) {
var j = m[b];
var n = j.xval;
if (l[n] === undefined) {
l[n] = 0
}
var e = j.yval;
if (isNaN(e) || e === null) {
k(b);
if (d && g && f != "none") {
e = d.yval + (g.yval - d.yval) * ((n - d.xval) / (g.xval - d.xval))
} else {
if (d && f == "all") {
e = d.yval
} else {
if (g && f == "all") {
e = g.yval
} else {
e = 0
}
}
}
} else {
d = j
}
var a = l[n];
if (h != n) {
a += e;
l[n] = a
}
h = n;
j.yval_stacked = a;
if (a > o[1]) {
o[1] = a
}
if (a < o[0]) {
o[0] = a
}
}
};
Dygraph.prototype.gatherDatasets_ = function (w, f) {
var s = [];
var t = [];
var q = [];
var a = {};
var u, r;
var x = this.attr_("errorBars");
var h = this.attr_("customBars");
var p = x || h;
var b = function (i) {
if (!p) {
return i[1] === null
} else {
return h ? i[1][1] === null : x ? i[1][0] === null : false
}
};
var n = w.length - 1;
var l;
for (u = n; u >= 1; u--) {
if (!this.visibility()[u - 1]) {
continue
}
if (f) {
l = w[u];
var z = f[0];
var j = f[1];
var g = null, y = null;
for (r = 0; r < l.length; r++) {
if (l[r][0] >= z && g === null) {
g = r
}
if (l[r][0] <= j) {
y = r
}
}
if (g === null) {
g = 0
}
var e = g;
var d = true;
while (d && e > 0) {
e--;
d = b(l[e])
}
if (y === null) {
y = l.length - 1
}
var c = y;
d = true;
while (d && c < l.length - 1) {
c++;
d = b(l[c])
}
if (e !== g) {
g = e
}
if (c !== y) {
y = c
}
s[u - 1] = [g, y];
l = l.slice(g, y + 1)
} else {
l = w[u];
s[u - 1] = [0, l.length - 1]
}
var v = this.attr_("labels")[u];
var o = this.extremeValues_(l);
var m = Dygraph.seriesToPoints_(l, p, v, s[u - 1][0]);
if (this.attr_("stackedGraph")) {
Dygraph.stackPoints_(m, q, o, this.attr_("stackedGraphNaNFill"))
}
a[v] = o;
t[u] = m
}
return {points: t, extremes: a, boundaryIds: s}
};
Dygraph.prototype.drawGraph_ = function () {
var a = new Date();
var d = this.is_initial_draw_;
this.is_initial_draw_ = false;
this.layout_.removeAllDatasets();
this.setColors_();
this.attrs_.pointSize = 0.5 * this.attr_("highlightCircleSize");
var j = this.gatherDatasets_(this.rolledSeries_, this.dateWindow_);
var h = j.points;
var k = j.extremes;
this.boundaryIds_ = j.boundaryIds;
this.setIndexByName_ = {};
var g = this.attr_("labels");
if (g.length > 0) {
this.setIndexByName_[g[0]] = 0
}
var e = 0;
for (var f = 1; f < h.length; f++) {
this.setIndexByName_[g[f]] = f;
if (!this.visibility()[f - 1]) {
continue
}
this.layout_.addDataset(g[f], h[f]);
this.datasetIndex_[f] = e++
}
this.computeYAxisRanges_(k);
this.layout_.setYAxes(this.axes_);
this.addXTicks_();
var b = this.zoomed_x_;
this.zoomed_x_ = b;
this.layout_.evaluate();
this.renderGraph_(d);
if (this.attr_("timingName")) {
var c = new Date();
Dygraph.info(this.attr_("timingName") + " - drawGraph: " + (c - a) + "ms")
}
};
Dygraph.prototype.renderGraph_ = function (b) {
this.cascadeEvents_("clearChart");
this.plotter_.clear();
if (this.attr_("underlayCallback")) {
this.attr_("underlayCallback")(this.hidden_ctx_, this.layout_.getPlotArea(), this, this)
}
var c = {canvas: this.hidden_, drawingContext: this.hidden_ctx_};
this.cascadeEvents_("willDrawChart", c);
this.plotter_.render();
this.cascadeEvents_("didDrawChart", c);
this.lastRow_ = -1;
this.canvas_.getContext("2d").clearRect(0, 0, this.canvas_.width, this.canvas_.height);
if (this.attr_("drawCallback") !== null) {
this.attr_("drawCallback")(this, b)
}
if (b) {
this.readyFired_ = true;
while (this.readyFns_.length > 0) {
var a = this.readyFns_.pop();
a(this)
}
}
};
Dygraph.prototype.computeYAxes_ = function () {
var b, d, c, f, a;
if (this.axes_ !== undefined && this.user_attrs_.hasOwnProperty("valueRange") === false) {
b = [];
for (c = 0; c < this.axes_.length; c++) {
b.push(this.axes_[c].valueWindow)
}
}
this.axes_ = [];
for (d = 0; d < this.attributes_.numAxes(); d++) {
f = {g: this};
Dygraph.update(f, this.attributes_.axisOptions(d));
this.axes_[d] = f
}
a = this.attr_("valueRange");
if (a) {
this.axes_[0].valueRange = a
}
if (b !== undefined) {
var e = Math.min(b.length, this.axes_.length);
for (c = 0; c < e; c++) {
this.axes_[c].valueWindow = b[c]
}
}
for (d = 0; d < this.axes_.length; d++) {
if (d === 0) {
f = this.optionsViewForAxis_("y" + (d ? "2" : ""));
a = f("valueRange");
if (a) {
this.axes_[d].valueRange = a
}
} else {
var g = this.user_attrs_.axes;
if (g && g.y2) {
a = g.y2.valueRange;
if (a) {
this.axes_[d].valueRange = a
}
}
}
}
};
Dygraph.prototype.numAxes = function () {
return this.attributes_.numAxes()
};
Dygraph.prototype.axisPropertiesForSeries = function (a) {
return this.axes_[this.attributes_.axisForSeries(a)]
};
Dygraph.prototype.computeYAxisRanges_ = function (a) {
var g = function (i) {
return isNaN(parseFloat(i))
};
var q = this.attributes_.numAxes();
var b, x, o, B;
var p;
for (var y = 0; y < q; y++) {
var c = this.axes_[y];
var C = this.attributes_.getForAxis("logscale", y);
var G = this.attributes_.getForAxis("includeZero", y);
var l = this.attributes_.getForAxis("independentTicks", y);
o = this.attributes_.seriesForAxis(y);
b = true;
B = 0.1;
if (this.attr_("yRangePad") !== null) {
b = false;
B = this.attr_("yRangePad") / this.plotter_.area.h
}
if (o.length === 0) {
c.extremeRange = [0, 1]
} else {
var D = Infinity;
var A = -Infinity;
var t, s;
for (var w = 0; w < o.length; w++) {
if (!a.hasOwnProperty(o[w])) {
continue
}
t = a[o[w]][0];
if (t !== null) {
D = Math.min(t, D)
}
s = a[o[w]][1];
if (s !== null) {
A = Math.max(s, A)
}
}
if (G && !C) {
if (D > 0) {
D = 0
}
if (A < 0) {
A = 0
}
}
if (D == Infinity) {
D = 0
}
if (A == -Infinity) {
A = 1
}
x = A - D;
if (x === 0) {
if (A !== 0) {
x = Math.abs(A)
} else {
A = 1;
x = 1
}
}
var h, H;
if (C) {
if (b) {
h = A + B * x;
H = D
} else {
var E = Math.exp(Math.log(x) * B);
h = A * E;
H = D / E
}
} else {
h = A + B * x;
H = D - B * x;
if (b && !this.attr_("avoidMinZero")) {
if (H < 0 && D >= 0) {
H = 0
}
if (h > 0 && A <= 0) {
h = 0
}
}
}
c.extremeRange = [H, h]
}
if (c.valueWindow) {
c.computedValueRange = [c.valueWindow[0], c.valueWindow[1]]
} else {
if (c.valueRange) {
var e = g(c.valueRange[0]) ? c.extremeRange[0] : c.valueRange[0];
var d = g(c.valueRange[1]) ? c.extremeRange[1] : c.valueRange[1];
if (!b) {
if (c.logscale) {
var E = Math.exp(Math.log(x) * B);
e *= E;
d /= E
} else {
x = d - e;
e -= x * B;
d += x * B
}
}
c.computedValueRange = [e, d]
} else {
c.computedValueRange = c.extremeRange
}
}
if (l) {
c.independentTicks = l;
var r = this.optionsViewForAxis_("y" + (y ? "2" : ""));
var F = r("ticker");
c.ticks = F(c.computedValueRange[0], c.computedValueRange[1], this.height_, r, this);
if (!p) {
p = c
}
}
}
if (p === undefined) {
throw ('Configuration Error: At least one axis has to have the "independentTicks" option activated.')
}
for (var y = 0; y < q; y++) {
var c = this.axes_[y];
if (!c.independentTicks) {
var r = this.optionsViewForAxis_("y" + (y ? "2" : ""));
var F = r("ticker");
var m = p.ticks;
var n = p.computedValueRange[1] - p.computedValueRange[0];
var I = c.computedValueRange[1] - c.computedValueRange[0];
var f = [];
for (var v = 0; v < m.length; v++) {
var u = (m[v].v - p.computedValueRange[0]) / n;
var z = c.computedValueRange[0] + u * I;
f.push(z)
}
c.ticks = F(c.computedValueRange[0], c.computedValueRange[1], this.height_, r, this, f)
}
}
};
Dygraph.prototype.extractSeries_ = function (a, f, c) {
var g = [];
var h = this.attr_("errorBars");
var e = this.attr_("customBars");
for (var d = 0; d < a.length; d++) {
var l = a[d][0];
var m = a[d][f];
if (c) {
if (h || e) {
for (var b = 0; b < m.length; b++) {
if (m[b] <= 0) {
m = null;
break
}
}
} else {
if (m <= 0) {
m = null
}
}
}
if (m !== null) {
g.push([l, m])
} else {
g.push([l, h ? [null, null] : e ? [null, null, null] : m])
}
}
return g
};
Dygraph.prototype.rollingAverage = function (l, d) {
d = Math.min(d, l.length);
var b = [];
var t = this.attr_("sigma");
var G, o, z, x, m, c, F, A;
if (this.fractions_) {
var k = 0;
var h = 0;
var e = 100;
for (z = 0; z < l.length; z++) {
k += l[z][1][0];
h += l[z][1][1];
if (z - d >= 0) {
k -= l[z - d][1][0];
h -= l[z - d][1][1]
}
var C = l[z][0];
var w = h ? k / h : 0;
if (this.attr_("errorBars")) {
if (this.attr_("wilsonInterval")) {
if (h) {
var s = w < 0 ? 0 : w, u = h;
var B = t * Math.sqrt(s * (1 - s) / u + t * t / (4 * u * u));
var a = 1 + t * t / h;
G = (s + t * t / (2 * h) - B) / a;
o = (s + t * t / (2 * h) + B) / a;
b[z] = [C, [s * e, (s - G) * e, (o - s) * e]]
} else {
b[z] = [C, [0, 0, 0]]
}
} else {
A = h ? t * Math.sqrt(w * (1 - w) / h) : 1;
b[z] = [C, [e * w, e * A, e * A]]
}
} else {
b[z] = [C, e * w]
}
}
} else {
if (this.attr_("customBars")) {
G = 0;
var D = 0;
o = 0;
var g = 0;
for (z = 0; z < l.length; z++) {
var E = l[z][1];
m = E[1];
b[z] = [l[z][0], [m, m - E[0], E[2] - m]];
if (m !== null && !isNaN(m)) {
G += E[0];
D += m;
o += E[2];
g += 1
}
if (z - d >= 0) {
var r = l[z - d];
if (r[1][1] !== null && !isNaN(r[1][1])) {
G -= r[1][0];
D -= r[1][1];
o -= r[1][2];
g -= 1
}
}
if (g) {
b[z] = [l[z][0], [1 * D / g, 1 * (D - G) / g, 1 * (o - D) / g]]
} else {
b[z] = [l[z][0], [null, null, null]]
}
}
} else {
if (!this.attr_("errorBars")) {
if (d == 1) {
return l
}
for (z = 0; z < l.length; z++) {
c = 0;
F = 0;
for (x = Math.max(0, z - d + 1); x < z + 1; x++) {
m = l[x][1];
if (m === null || isNaN(m)) {
continue
}
F++;
c += l[x][1]
}
if (F) {
b[z] = [l[z][0], c / F]
} else {
b[z] = [l[z][0], null]
}
}
} else {
for (z = 0; z < l.length; z++) {
c = 0;
var f = 0;
F = 0;
for (x = Math.max(0, z - d + 1); x < z + 1; x++) {
m = l[x][1][0];
if (m === null || isNaN(m)) {
continue
}
F++;
c += l[x][1][0];
f += Math.pow(l[x][1][1], 2)
}
if (F) {
A = Math.sqrt(f) / F;
b[z] = [l[z][0], [c / F, t * A, t * A]]
} else {
var q = (d == 1) ? l[z][1][0] : null;
b[z] = [l[z][0], [q, q, q]]
}
}
}
}
}
return b
};
Dygraph.prototype.detectTypeFromString_ = function (b) {
var a = false;
var c = b.indexOf("-");
if ((c > 0 && (b[c - 1] != "e" && b[c - 1] != "E")) || b.indexOf("/") >= 0 || isNaN(parseFloat(b))) {
a = true
} else {
if (b.length == 8 && b > "19700101" && b < "20371231") {
a = true
}
}
this.setXAxisOptions_(a)
};
Dygraph.prototype.setXAxisOptions_ = function (a) {
if (a) {
this.attrs_.xValueParser = Dygraph.dateParser;
this.attrs_.axes.x.valueFormatter = Dygraph.dateString_;
this.attrs_.axes.x.ticker = Dygraph.dateTicker;
this.attrs_.axes.x.axisLabelFormatter = Dygraph.dateAxisFormatter
} else {
this.attrs_.xValueParser = function (b) {
return parseFloat(b)
};
this.attrs_.axes.x.valueFormatter = function (b) {
return b
};
this.attrs_.axes.x.ticker = Dygraph.numericLinearTicks;
this.attrs_.axes.x.axisLabelFormatter = this.attrs_.axes.x.valueFormatter
}
};
Dygraph.prototype.parseFloat_ = function (a, c, b) {
var e = parseFloat(a);
if (!isNaN(e)) {
return e
}
if (/^ *$/.test(a)) {
return null
}
if (/^ *nan *$/i.test(a)) {
return NaN
}
var d = "Unable to parse '" + a + "' as a number";
if (b !== null && c !== null) {
d += " on line " + (1 + c) + " ('" + b + "') of CSV."
}
this.error(d);
return null
};
Dygraph.prototype.parseCSV_ = function (t) {
var r = [];
var s = Dygraph.detectLineDelimiter(t);
var a = t.split(s || "\n");
var g, k;
var p = this.attr_("delimiter");
if (a[0].indexOf(p) == -1 && a[0].indexOf("\t") >= 0) {
p = "\t"
}
var b = 0;
if (!("labels" in this.user_attrs_)) {
b = 1;
this.attrs_.labels = a[0].split(p);
this.attributes_.reparseSeries()
}
var o = 0;
var m;
var q = false;
var c = this.attr_("labels").length;
var f = false;
for (var l = b; l < a.length; l++) {
var e = a[l];
o = l;
if (e.length === 0) {
continue
}
if (e[0] == "#") {
continue
}
var d = e.split(p);
if (d.length < 2) {
continue
}
var h = [];
if (!q) {
this.detectTypeFromString_(d[0]);
m = this.attr_("xValueParser");
q = true
}
h[0] = m(d[0], this);
if (this.fractions_) {
for (k = 1; k < d.length; k++) {
g = d[k].split("/");
if (g.length != 2) {
this.error('Expected fractional "num/den" values in CSV data but found a value \'' + d[k] + "' on line " + (1 + l) + " ('" + e + "') which is not of this form.");
h[k] = [0, 0]
} else {
h[k] = [this.parseFloat_(g[0], l, e), this.parseFloat_(g[1], l, e)]
}
}
} else {
if (this.attr_("errorBars")) {
if (d.length % 2 != 1) {
this.error("Expected alternating (value, stdev.) pairs in CSV data but line " + (1 + l) + " has an odd number of values (" + (d.length - 1) + "): '" + e + "'")
}
for (k = 1; k < d.length; k += 2) {
h[(k + 1) / 2] = [this.parseFloat_(d[k], l, e), this.parseFloat_(d[k + 1], l, e)]
}
} else {
if (this.attr_("customBars")) {
for (k = 1; k < d.length; k++) {
var u = d[k];
if (/^ *$/.test(u)) {
h[k] = [null, null, null]
} else {
g = u.split(";");
if (g.length == 3) {
h[k] = [this.parseFloat_(g[0], l, e), this.parseFloat_(g[1], l, e), this.parseFloat_(g[2], l, e)]
} else {
this.warn('When using customBars, values must be either blank or "low;center;high" tuples (got "' + u + '" on line ' + (1 + l))
}
}
}
} else {
for (k = 1; k < d.length; k++) {
h[k] = this.parseFloat_(d[k], l, e)
}
}
}
}
if (r.length > 0 && h[0] < r[r.length - 1][0]) {
f = true
}
if (h.length != c) {
this.error("Number of columns in line " + l + " (" + h.length + ") does not agree with number of labels (" + c + ") " + e)
}
if (l === 0 && this.attr_("labels")) {
var n = true;
for (k = 0; n && k < h.length; k++) {
if (h[k]) {
n = false
}
}
if (n) {
this.warn("The dygraphs 'labels' option is set, but the first row of CSV data ('" + e + "') appears to also contain labels. Will drop the CSV labels and use the option labels.");
continue
}
}
r.push(h)
}
if (f) {
this.warn("CSV is out of order; order it correctly to speed loading.");
r.sort(function (j, i) {
return j[0] - i[0]
})
}
return r
};
Dygraph.prototype.parseArray_ = function (c) {
if (c.length === 0) {
this.error("Can't plot empty data set");
return null
}
if (c[0].length === 0) {
this.error("Data set cannot contain an empty row");
return null
}
var a;
if (this.attr_("labels") === null) {
this.warn("Using default labels. Set labels explicitly via 'labels' in the options parameter");
this.attrs_.labels = ["X"];
for (a = 1; a < c[0].length; a++) {
this.attrs_.labels.push("Y" + a)
}
this.attributes_.reparseSeries()
} else {
var b = this.attr_("labels");
if (b.length != c[0].length) {
this.error("Mismatch between number of labels (" + b + ") and number of columns in array (" + c[0].length + ")");
return null
}
}
if (Dygraph.isDateLike(c[0][0])) {
this.attrs_.axes.x.valueFormatter = Dygraph.dateString_;
this.attrs_.axes.x.ticker = Dygraph.dateTicker;
this.attrs_.axes.x.axisLabelFormatter = Dygraph.dateAxisFormatter;
var d = Dygraph.clone(c);
for (a = 0; a < c.length; a++) {
if (d[a].length === 0) {
this.error("Row " + (1 + a) + " of data is empty");
return null
}
if (d[a][0] === null || typeof(d[a][0].getTime) != "function" || isNaN(d[a][0].getTime())) {
this.error("x value in row " + (1 + a) + " is not a Date");
return null
}
d[a][0] = d[a][0].getTime()
}
return d
} else {
this.attrs_.axes.x.valueFormatter = function (e) {
return e
};
this.attrs_.axes.x.ticker = Dygraph.numericLinearTicks;
this.attrs_.axes.x.axisLabelFormatter = Dygraph.numberAxisLabelFormatter;
return c
}
};
Dygraph.prototype.parseDataTable_ = function (w) {
var d = function (i) {
var j = String.fromCharCode(65 + i % 26);
i = Math.floor(i / 26);
while (i > 0) {
j = String.fromCharCode(65 + (i - 1) % 26) + j.toLowerCase();
i = Math.floor((i - 1) / 26)
}
return j
};
var h = w.getNumberOfColumns();
var g = w.getNumberOfRows();
var f = w.getColumnType(0);
if (f == "date" || f == "datetime") {
this.attrs_.xValueParser = Dygraph.dateParser;
this.attrs_.axes.x.valueFormatter = Dygraph.dateString_;
this.attrs_.axes.x.ticker = Dygraph.dateTicker;
this.attrs_.axes.x.axisLabelFormatter = Dygraph.dateAxisFormatter
} else {
if (f == "number") {
this.attrs_.xValueParser = function (i) {
return parseFloat(i)
};
this.attrs_.axes.x.valueFormatter = function (i) {
return i
};
this.attrs_.axes.x.ticker = Dygraph.numericLinearTicks;
this.attrs_.axes.x.axisLabelFormatter = this.attrs_.axes.x.valueFormatter
} else {
this.error("only 'date', 'datetime' and 'number' types are supported for column 1 of DataTable input (Got '" + f + "')");
return null
}
}
var m = [];
var t = {};
var s = false;
var q, o;
for (q = 1; q < h; q++) {
var b = w.getColumnType(q);
if (b == "number") {
m.push(q)
} else {
if (b == "string" && this.attr_("displayAnnotations")) {
var r = m[m.length - 1];
if (!t.hasOwnProperty(r)) {
t[r] = [q]
} else {
t[r].push(q)
}
s = true
} else {
this.error("Only 'number' is supported as a dependent type with Gviz. 'string' is only supported if displayAnnotations is true")
}
}
}
var u = [w.getColumnLabel(0)];
for (q = 0; q < m.length; q++) {
u.push(w.getColumnLabel(m[q]));
if (this.attr_("errorBars")) {
q += 1
}
}
this.attrs_.labels = u;
h = u.length;
var v = [];
var l = false;
var a = [];
for (q = 0; q < g; q++) {
var e = [];
if (typeof(w.getValue(q, 0)) === "undefined" || w.getValue(q, 0) === null) {
this.warn("Ignoring row " + q + " of DataTable because of undefined or null first column.");
continue
}
if (f == "date" || f == "datetime") {
e.push(w.getValue(q, 0).getTime())
} else {
e.push(w.getValue(q, 0))
}
if (!this.attr_("errorBars")) {
for (o = 0; o < m.length; o++) {
var c = m[o];
e.push(w.getValue(q, c));
if (s && t.hasOwnProperty(c) && w.getValue(q, t[c][0]) !== null) {
var p = {};
p.series = w.getColumnLabel(c);
p.xval = e[0];
p.shortText = d(a.length);
p.text = "";
for (var n = 0; n < t[c].length; n++) {
if (n) {
p.text += "\n"
}
p.text += w.getValue(q, t[c][n])
}
a.push(p)
}
}
for (o = 0; o < e.length; o++) {
if (!isFinite(e[o])) {
e[o] = null
}
}
} else {
for (o = 0; o < h - 1; o++) {
e.push([w.getValue(q, 1 + 2 * o), w.getValue(q, 2 + 2 * o)])
}
}
if (v.length > 0 && e[0] < v[v.length - 1][0]) {
l = true
}
v.push(e)
}
if (l) {
this.warn("DataTable is out of order; order it correctly to speed loading.");
v.sort(function (j, i) {
return j[0] - i[0]
})
}
this.rawData_ = v;
if (a.length > 0) {
this.setAnnotations(a, true)
}
this.attributes_.reparseSeries()
};
Dygraph.prototype.start_ = function () {
var d = this.file_;
if (typeof d == "function") {
d = d()
}
if (Dygraph.isArrayLike(d)) {
this.rawData_ = this.parseArray_(d);
this.predraw_()
} else {
if (typeof d == "object" && typeof d.getColumnRange == "function") {
this.parseDataTable_(d);
this.predraw_()
} else {
if (typeof d == "string") {
var c = Dygraph.detectLineDelimiter(d);
if (c) {
this.loadedEvent_(d)
} else {
var b;
if (window.XMLHttpRequest) {
b = new XMLHttpRequest()
} else {
b = new ActiveXObject("Microsoft.XMLHTTP")
}
var a = this;
b.onreadystatechange = function () {
if (b.readyState == 4) {
if (b.status === 200 || b.status === 0) {
a.loadedEvent_(b.responseText)
}
}
};
b.open("GET", d, true);
b.send(null)
}
} else {
this.error("Unknown data format: " + (typeof d))
}
}
}
};
Dygraph.prototype.updateOptions = function (e, b) {
if (typeof(b) == "undefined") {
b = false
}
var d = e.file;
var c = Dygraph.mapLegacyOptions_(e);
if ("rollPeriod" in c) {
this.rollPeriod_ = c.rollPeriod
}
if ("dateWindow" in c) {
this.dateWindow_ = c.dateWindow;
if (!("isZoomedIgnoreProgrammaticZoom" in c)) {
this.zoomed_x_ = (c.dateWindow !== null)
}
}
if ("valueRange" in c && !("isZoomedIgnoreProgrammaticZoom" in c)) {
this.zoomed_y_ = (c.valueRange !== null)
}
var a = Dygraph.isPixelChangingOptionList(this.attr_("labels"), c);
Dygraph.updateDeep(this.user_attrs_, c);
this.attributes_.reparseSeries();
if (d) {
this.file_ = d;
if (!b) {
this.start_()
}
} else {
if (!b) {
if (a) {
this.predraw_()
} else {
this.renderGraph_(false)
}
}
}
};
Dygraph.mapLegacyOptions_ = function (c) {
var a = {};
for (var b in c) {
if (b == "file") {
continue
}
if (c.hasOwnProperty(b)) {
a[b] = c[b]
}
}
var e = function (g, f, h) {
if (!a.axes) {
a.axes = {}
}
if (!a.axes[g]) {
a.axes[g] = {}
}
a.axes[g][f] = h
};
var d = function (f, g, h) {
if (typeof(c[f]) != "undefined") {
Dygraph.warn("Option " + f + " is deprecated. Use the " + h + " option for the " + g + " axis instead. (e.g. { axes : { " + g + " : { " + h + " : ... } } } (see http://dygraphs.com/per-axis.html for more information.");
e(g, h, c[f]);
delete a[f]
}
};
d("xValueFormatter", "x", "valueFormatter");
d("pixelsPerXLabel", "x", "pixelsPerLabel");
d("xAxisLabelFormatter", "x", "axisLabelFormatter");
d("xTicker", "x", "ticker");
d("yValueFormatter", "y", "valueFormatter");
d("pixelsPerYLabel", "y", "pixelsPerLabel");
d("yAxisLabelFormatter", "y", "axisLabelFormatter");
d("yTicker", "y", "ticker");
return a
};
Dygraph.prototype.resize = function (d, b) {
if (this.resize_lock) {
return
}
this.resize_lock = true;
if ((d === null) != (b === null)) {
this.warn("Dygraph.resize() should be called with zero parameters or two non-NULL parameters. Pretending it was zero.");
d = b = null
}
var a = this.width_;
var c = this.height_;
if (d) {
this.maindiv_.style.width = d + "px";
this.maindiv_.style.height = b + "px";
this.width_ = d;
this.height_ = b
} else {
this.width_ = this.maindiv_.clientWidth;
this.height_ = this.maindiv_.clientHeight
}
if (a != this.width_ || c != this.height_) {
this.resizeElements_();
this.predraw_()
}
this.resize_lock = false
};
Dygraph.prototype.adjustRoll = function (a) {
this.rollPeriod_ = a;
this.predraw_()
};
Dygraph.prototype.visibility = function () {
if (!this.attr_("visibility")) {
this.attrs_.visibility = []
}
while (this.attr_("visibility").length < this.numColumns() - 1) {
this.attrs_.visibility.push(true)
}
return this.attr_("visibility")
};
Dygraph.prototype.setVisibility = function (b, c) {
var a = this.visibility();
if (b < 0 || b >= a.length) {
this.warn("invalid series number in setVisibility: " + b)
} else {
a[b] = c;
this.predraw_()
}
};
Dygraph.prototype.size = function () {
return {width: this.width_, height: this.height_}
};
Dygraph.prototype.setAnnotations = function (b, a) {
Dygraph.addAnnotationRule();
this.annotations_ = b;
if (!this.layout_) {
this.warn("Tried to setAnnotations before dygraph was ready. Try setting them in a ready() block. See dygraphs.com/tests/annotation.html");
return
}
this.layout_.setAnnotations(this.annotations_);
if (!a) {
this.predraw_()
}
};
Dygraph.prototype.annotations = function () {
return this.annotations_
};
Dygraph.prototype.getLabels = function () {
var a = this.attr_("labels");
return a ? a.slice() : null
};
Dygraph.prototype.indexFromSetName = function (a) {
return this.setIndexByName_[a]
};
Dygraph.prototype.ready = function (a) {
if (this.is_initial_draw_) {
this.readyFns_.push(a)
} else {
a(this)
}
};
Dygraph.addAnnotationRule = function () {
if (Dygraph.addedAnnotationCSS) {
return
}
var f = "border: 1px solid black; background-color: white; text-align: center;";
var e = document.createElement("style");
e.type = "text/css";
document.getElementsByTagName("head")[0].appendChild(e);
for (var b = 0; b < document.styleSheets.length; b++) {
if (document.styleSheets[b].disabled) {
continue
}
var d = document.styleSheets[b];
try {
if (d.insertRule) {
var a = d.cssRules ? d.cssRules.length : 0;
d.insertRule(".dygraphDefaultAnnotation { " + f + " }", a)
} else {
if (d.addRule) {
d.addRule(".dygraphDefaultAnnotation", f)
}
}
Dygraph.addedAnnotationCSS = true;
return
} catch (c) {
}
}
this.warn("Unable to add default annotation CSS rule; display may be off.")
};
var DateGraph = Dygraph;
"use strict";
Dygraph.LOG_SCALE = 10;
Dygraph.LN_TEN = Math.log(Dygraph.LOG_SCALE);
Dygraph.log10 = function (a) {
return Math.log(a) / Dygraph.LN_TEN
};
Dygraph.DEBUG = 1;
Dygraph.INFO = 2;
Dygraph.WARNING = 3;
Dygraph.ERROR = 3;
Dygraph.LOG_STACK_TRACES = false;
Dygraph.DOTTED_LINE = [2, 2];
Dygraph.DASHED_LINE = [7, 3];
Dygraph.DOT_DASH_LINE = [7, 2, 2, 2];
Dygraph.log = function (c, g) {
var b;
if (typeof(printStackTrace) != "undefined") {
try {
b = printStackTrace({guess: false});
while (b[0].indexOf("stacktrace") != -1) {
b.splice(0, 1)
}
b.splice(0, 2);
for (var d = 0; d < b.length; d++) {
b[d] = b[d].replace(/\([^)]*\/(.*)\)/, "@$1").replace(/\@.*\/([^\/]*)/, "@$1").replace("[object Object].", "")
}
var j = b.splice(0, 1)[0];
g += " (" + j.replace(/^.*@ ?/, "") + ")"
} catch (h) {
}
}
if (typeof(window.console) != "undefined") {
var a = window.console;
var f = function (e, k, i) {
if (k && typeof(k) == "function") {
k.call(e, i)
} else {
e.log(i)
}
};
switch (c) {
case Dygraph.DEBUG:
f(a, a.debug, "dygraphs: " + g);
break;
case Dygraph.INFO:
f(a, a.info, "dygraphs: " + g);
break;
case Dygraph.WARNING:
f(a, a.warn, "dygraphs: " + g);
break;
case Dygraph.ERROR:
f(a, a.error, "dygraphs: " + g);
break
}
}
if (Dygraph.LOG_STACK_TRACES) {
window.console.log(b.join("\n"))
}
};
Dygraph.info = function (a) {
Dygraph.log(Dygraph.INFO, a)
};
Dygraph.prototype.info = Dygraph.info;
Dygraph.warn = function (a) {
Dygraph.log(Dygraph.WARNING, a)
};
Dygraph.prototype.warn = Dygraph.warn;
Dygraph.error = function (a) {
Dygraph.log(Dygraph.ERROR, a)
};
Dygraph.prototype.error = Dygraph.error;
Dygraph.getContext = function (a) {
return (a.getContext("2d"))
};
Dygraph.addEvent = function addEvent(c, b, a) {
if (c.addEventListener) {
c.addEventListener(b, a, false)
} else {
c[b + a] = function () {
a(window.event)
};
c.attachEvent("on" + b, c[b + a])
}
};
Dygraph.prototype.addAndTrackEvent = function (c, b, a) {
Dygraph.addEvent(c, b, a);
this.registeredEvents_.push({elem: c, type: b, fn: a})
};
Dygraph.removeEvent = function (c, b, a) {
if (c.removeEventListener) {
c.removeEventListener(b, a, false)
} else {
try {
c.detachEvent("on" + b, c[b + a])
} catch (d) {
}
c[b + a] = null
}
};
Dygraph.prototype.removeTrackedEvents_ = function () {
if (this.registeredEvents_) {
for (var a = 0; a < this.registeredEvents_.length; a++) {
var b = this.registeredEvents_[a];
Dygraph.removeEvent(b.elem, b.type, b.fn)
}
}
this.registeredEvents_ = []
};
Dygraph.cancelEvent = function (a) {
a = a ? a : window.event;
if (a.stopPropagation) {
a.stopPropagation()
}
if (a.preventDefault) {
a.preventDefault()
}
a.cancelBubble = true;
a.cancel = true;
a.returnValue = false;
return false
};
Dygraph.hsvToRGB = function (h, g, k) {
var c;
var d;
var l;
if (g === 0) {
c = k;
d = k;
l = k
} else {
var e = Math.floor(h * 6);
var j = (h * 6) - e;
var b = k * (1 - g);
var a = k * (1 - (g * j));
var m = k * (1 - (g * (1 - j)));
switch (e) {
case 1:
c = a;
d = k;
l = b;
break;
case 2:
c = b;
d = k;
l = m;
break;
case 3:
c = b;
d = a;
l = k;
break;
case 4:
c = m;
d = b;
l = k;
break;
case 5:
c = k;
d = b;
l = a;
break;
case 6:
case 0:
c = k;
d = m;
l = b;
break
}
}
c = Math.floor(255 * c + 0.5);
d = Math.floor(255 * d + 0.5);
l = Math.floor(255 * l + 0.5);
return "rgb(" + c + "," + d + "," + l + ")"
};
Dygraph.findPosX = function (c) {
var d = 0;
if (c.offsetParent) {
var a = c;
while (1) {
var b = "0";
if (window.getComputedStyle) {
b = window.getComputedStyle(a, null).borderLeft || "0"
}
d += parseInt(b, 10);
d += a.offsetLeft;
if (!a.offsetParent) {
break
}
a = a.offsetParent
}
} else {
if (c.x) {
d += c.x
}
}
while (c && c != document.body) {
d -= c.scrollLeft;
c = c.parentNode
}
return d
};
Dygraph.findPosY = function (c) {
var b = 0;
if (c.offsetParent) {
var a = c;
while (1) {
var d = "0";
if (window.getComputedStyle) {
d = window.getComputedStyle(a, null).borderTop || "0"
}
b += parseInt(d, 10);
b += a.offsetTop;
if (!a.offsetParent) {
break
}
a = a.offsetParent
}
} else {
if (c.y) {
b += c.y
}
}
while (c && c != document.body) {
b -= c.scrollTop;
c = c.parentNode
}
return b
};
Dygraph.pageX = function (c) {
if (c.pageX) {
return (!c.pageX || c.pageX < 0) ? 0 : c.pageX
} else {
var d = document.documentElement;
var a = document.body;
return c.clientX + (d.scrollLeft || a.scrollLeft) - (d.clientLeft || 0)
}
};
Dygraph.pageY = function (c) {
if (c.pageY) {
return (!c.pageY || c.pageY < 0) ? 0 : c.pageY
} else {
var d = document.documentElement;
var a = document.body;
return c.clientY + (d.scrollTop || a.scrollTop) - (d.clientTop || 0)
}
};
Dygraph.isOK = function (a) {
return !!a && !isNaN(a)
};
Dygraph.isValidPoint = function (b, a) {
if (!b) {
return false
}
if (b.yval === null) {
return false
}
if (b.x === null || b.x === undefined) {
return false
}
if (b.y === null || b.y === undefined) {
return false
}
if (isNaN(b.x) || (!a && isNaN(b.y))) {
return false
}
return true
};
Dygraph.floatFormat = function (a, b) {
var c = Math.min(Math.max(1, b || 2), 21);
return (Math.abs(a) < 0.001 && a !== 0) ? a.toExponential(c - 1) : a.toPrecision(c)
};
Dygraph.zeropad = function (a) {
if (a < 10) {
return "0" + a
} else {
return "" + a
}
};
Dygraph.hmsString_ = function (a) {
var c = Dygraph.zeropad;
var b = new Date(a);
if (b.getSeconds()) {
return c(b.getHours()) + ":" + c(b.getMinutes()) + ":" + c(b.getSeconds())
} else {
return c(b.getHours()) + ":" + c(b.getMinutes())
}
};
Dygraph.round_ = function (c, b) {
var a = Math.pow(10, b);
return Math.round(c * a) / a
};
Dygraph.binarySearch = function (a, d, i, e, b) {
if (e === null || e === undefined || b === null || b === undefined) {
e = 0;
b = d.length - 1
}
if (e > b) {
return -1
}
if (i === null || i === undefined) {
i = 0
}
var h = function (j) {
return j >= 0 && j < d.length
};
var g = parseInt((e + b) / 2, 10);
var c = d[g];
var f;
if (c == a) {
return g
} else {
if (c > a) {
if (i > 0) {
f = g - 1;
if (h(f) && d[f] < a) {
return g
}
}
return Dygraph.binarySearch(a, d, i, e, g - 1)
} else {
if (c < a) {
if (i < 0) {
f = g + 1;
if (h(f) && d[f] > a) {
return g
}
}
return Dygraph.binarySearch(a, d, i, g + 1, b)
}
}
}
return -1
};
Dygraph.dateParser = function (a) {
var b;
var c;
if (a.search("-") == -1 || a.search("T") != -1 || a.search("Z") != -1) {
c = Dygraph.dateStrToMillis(a);
if (c && !isNaN(c)) {
return c
}
}
if (a.search("-") != -1) {
b = a.replace("-", "/", "g");
while (b.search("-") != -1) {
b = b.replace("-", "/")
}
c = Dygraph.dateStrToMillis(b)
} else {
if (a.length == 8) {
b = a.substr(0, 4) + "/" + a.substr(4, 2) + "/" + a.substr(6, 2);
c = Dygraph.dateStrToMillis(b)
} else {
c = Dygraph.dateStrToMillis(a)
}
}
if (!c || isNaN(c)) {
Dygraph.error("Couldn't parse " + a + " as a date")
}
return c
};
Dygraph.dateStrToMillis = function (a) {
return new Date(a).getTime()
};
Dygraph.update = function (b, c) {
if (typeof(c) != "undefined" && c !== null) {
for (var a in c) {
if (c.hasOwnProperty(a)) {
b[a] = c[a]
}
}
}
return b
};
Dygraph.updateDeep = function (b, d) {
function c(e) {
return (typeof Node === "object" ? e instanceof Node : typeof e === "object" && typeof e.nodeType === "number" && typeof e.nodeName === "string")
}
if (typeof(d) != "undefined" && d !== null) {
for (var a in d) {
if (d.hasOwnProperty(a)) {
if (d[a] === null) {
b[a] = null
} else {
if (Dygraph.isArrayLike(d[a])) {
b[a] = d[a].slice()
} else {
if (c(d[a])) {
b[a] = d[a]
} else {
if (typeof(d[a]) == "object") {
if (typeof(b[a]) != "object" || b[a] === null) {
b[a] = {}
}
Dygraph.updateDeep(b[a], d[a])
} else {
b[a] = d[a]
}
}
}
}
}
}
}
return b
};
Dygraph.isArrayLike = function (b) {
var a = typeof(b);
if ((a != "object" && !(a == "function" && typeof(b.item) == "function")) || b === null || typeof(b.length) != "number" || b.nodeType === 3) {
return false
}
return true
};
Dygraph.isDateLike = function (a) {
if (typeof(a) != "object" || a === null || typeof(a.getTime) != "function") {
return false
}
return true
};
Dygraph.clone = function (c) {
var b = [];
for (var a = 0; a < c.length; a++) {
if (Dygraph.isArrayLike(c[a])) {
b.push(Dygraph.clone(c[a]))
} else {
b.push(c[a])
}
}
return b
};
Dygraph.createCanvas = function () {
var a = document.createElement("canvas");
var b = (/MSIE/.test(navigator.userAgent) && !window.opera);
if (b && (typeof(G_vmlCanvasManager) != "undefined")) {
a = G_vmlCanvasManager.initElement((a))
}
return a
};
Dygraph.isAndroid = function () {
return (/Android/).test(navigator.userAgent)
};
Dygraph.Iterator = function (d, c, b, a) {
c = c || 0;
b = b || d.length;
this.hasNext = true;
this.peek = null;
this.start_ = c;
this.array_ = d;
this.predicate_ = a;
this.end_ = Math.min(d.length, c + b);
this.nextIdx_ = c - 1;
this.next()
};
Dygraph.Iterator.prototype.next = function () {
if (!this.hasNext) {
return null
}
var c = this.peek;
var b = this.nextIdx_ + 1;
var a = false;
while (b < this.end_) {
if (!this.predicate_ || this.predicate_(this.array_, b)) {
this.peek = this.array_[b];
a = true;
break
}
b++
}
this.nextIdx_ = b;
if (!a) {
this.hasNext = false;
this.peek = null
}
return c
};
Dygraph.createIterator = function (d, c, b, a) {
return new Dygraph.Iterator(d, c, b, a)
};
Dygraph.requestAnimFrame = (function () {
return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (a) {
window.setTimeout(a, 1000 / 60)
}
})();
Dygraph.repeatAndCleanup = function (h, g, f, a) {
var i = 0;
var d;
var b = new Date().getTime();
h(i);
if (g == 1) {
a();
return
}
var e = g - 1;
(function c() {
if (i >= g) {
return
}
Dygraph.requestAnimFrame.call(window, function () {
var l = new Date().getTime();
var j = l - b;
d = i;
i = Math.floor(j / f);
var k = i - d;
var m = (i + k) > e;
if (m || (i >= e)) {
h(e);
a()
} else {
if (k !== 0) {
h(i)
}
c()
}
})
})()
};
Dygraph.isPixelChangingOptionList = function (h, e) {
var d = {
annotationClickHandler: true,
annotationDblClickHandler: true,
annotationMouseOutHandler: true,
annotationMouseOverHandler: true,
axisLabelColor: true,
axisLineColor: true,
axisLineWidth: true,
clickCallback: true,
digitsAfterDecimal: true,
drawCallback: true,
drawHighlightPointCallback: true,
drawPoints: true,
drawPointCallback: true,
drawXGrid: true,
drawYGrid: true,
fillAlpha: true,
gridLineColor: true,
gridLineWidth: true,
hideOverlayOnMouseOut: true,
highlightCallback: true,
highlightCircleSize: true,
interactionModel: true,
isZoomedIgnoreProgrammaticZoom: true,
labelsDiv: true,
labelsDivStyles: true,
labelsDivWidth: true,
labelsKMB: true,
labelsKMG2: true,
labelsSeparateLines: true,
labelsShowZeroValues: true,
legend: true,
maxNumberWidth: true,
panEdgeFraction: true,
pixelsPerYLabel: true,
pointClickCallback: true,
pointSize: true,
rangeSelectorPlotFillColor: true,
rangeSelectorPlotStrokeColor: true,
showLabelsOnHighlight: true,
showRoller: true,
sigFigs: true,
strokeWidth: true,
underlayCallback: true,
unhighlightCallback: true,
xAxisLabelFormatter: true,
xTicker: true,
xValueFormatter: true,
yAxisLabelFormatter: true,
yValueFormatter: true,
zoomCallback: true
};
var a = false;
var b = {};
if (h) {
for (var f = 1; f < h.length; f++) {
b[h[f]] = true
}
}
for (var g in e) {
if (a) {
break
}
if (e.hasOwnProperty(g)) {
if (b[g]) {
for (var c in e[g]) {
if (a) {
break
}
if (e[g].hasOwnProperty(c) && !d[c]) {
a = true
}
}
} else {
if (!d[g]) {
a = true
}
}
}
}
return a
};
Dygraph.compareArrays = function (c, b) {
if (!Dygraph.isArrayLike(c) || !Dygraph.isArrayLike(b)) {
return false
}
if (c.length !== b.length) {
return false
}
for (var a = 0; a < c.length; a++) {
if (c[a] !== b[a]) {
return false
}
}
return true
};
Dygraph.regularShape_ = function (o, c, i, f, e, a, n) {
a = a || 0;
n = n || Math.PI * 2 / c;
o.beginPath();
var g = a;
var d = g;
var h = function () {
var p = f + (Math.sin(d) * i);
var q = e + (-Math.cos(d) * i);
return [p, q]
};
var b = h();
var l = b[0];
var j = b[1];
o.moveTo(l, j);
for (var m = 0; m < c; m++) {
d = (m == c - 1) ? g : (d + n);
var k = h();
o.lineTo(k[0], k[1])
}
o.fill();
o.stroke()
};
Dygraph.shapeFunction_ = function (b, a, c) {
return function (j, i, f, e, k, h, d) {
f.strokeStyle = h;
f.fillStyle = "white";
Dygraph.regularShape_(f, b, d, e, k, a, c)
}
};
Dygraph.Circles = {
DEFAULT: function (h, f, b, e, d, c, a) {
b.beginPath();
b.fillStyle = c;
b.arc(e, d, a, 0, 2 * Math.PI, false);
b.fill()
},
TRIANGLE: Dygraph.shapeFunction_(3),
SQUARE: Dygraph.shapeFunction_(4, Math.PI / 4),
DIAMOND: Dygraph.shapeFunction_(4),
PENTAGON: Dygraph.shapeFunction_(5),
HEXAGON: Dygraph.shapeFunction_(6),
CIRCLE: function (f, e, c, b, h, d, a) {
c.beginPath();
c.strokeStyle = d;
c.fillStyle = "white";
c.arc(b, h, a, 0, 2 * Math.PI, false);
c.fill();
c.stroke()
},
STAR: Dygraph.shapeFunction_(5, 0, 4 * Math.PI / 5),
PLUS: function (f, e, c, b, h, d, a) {
c.strokeStyle = d;
c.beginPath();
c.moveTo(b + a, h);
c.lineTo(b - a, h);
c.closePath();
c.stroke();
c.beginPath();
c.moveTo(b, h + a);
c.lineTo(b, h - a);
c.closePath();
c.stroke()
},
EX: function (f, e, c, b, h, d, a) {
c.strokeStyle = d;
c.beginPath();
c.moveTo(b + a, h + a);
c.lineTo(b - a, h - a);
c.closePath();
c.stroke();
c.beginPath();
c.moveTo(b + a, h - a);
c.lineTo(b - a, h + a);
c.closePath();
c.stroke()
}
};
Dygraph.IFrameTarp = function () {
this.tarps = []
};
Dygraph.IFrameTarp.prototype.cover = function () {
var f = document.getElementsByTagName("iframe");
for (var c = 0; c < f.length; c++) {
var e = f[c];
var b = Dygraph.findPosX(e), h = Dygraph.findPosY(e), d = e.offsetWidth, a = e.offsetHeight;
var g = document.createElement("div");
g.style.position = "absolute";
g.style.left = b + "px";
g.style.top = h + "px";
g.style.width = d + "px";
g.style.height = a + "px";
g.style.zIndex = 999;
document.body.appendChild(g);
this.tarps.push(g)
}
};
Dygraph.IFrameTarp.prototype.uncover = function () {
for (var a = 0; a < this.tarps.length; a++) {
this.tarps[a].parentNode.removeChild(this.tarps[a])
}
this.tarps = []
};
Dygraph.detectLineDelimiter = function (c) {
for (var a = 0; a < c.length; a++) {
var b = c.charAt(a);
if (b === "\r") {
if (((a + 1) < c.length) && (c.charAt(a + 1) === "\n")) {
return "\r\n"
}
return b
}
if (b === "\n") {
if (((a + 1) < c.length) && (c.charAt(a + 1) === "\r")) {
return "\n\r"
}
return b
}
}
return null
};
Dygraph.isNodeContainedBy = function (b, a) {
if (a === null || b === null) {
return false
}
var c = (b);
while (c && c !== a) {
c = c.parentNode
}
return (c === a)
};
Dygraph.pow = function (a, b) {
if (b < 0) {
return 1 / Math.pow(a, -b)
}
return Math.pow(a, b)
};
Dygraph.dateSetters = {
ms: Date.prototype.setMilliseconds,
s: Date.prototype.setSeconds,
m: Date.prototype.setMinutes,
h: Date.prototype.setHours
};
Dygraph.setDateSameTZ = function (c, b) {
var f = c.getTimezoneOffset();
for (var a in b) {
if (!b.hasOwnProperty(a)) {
continue
}
var e = Dygraph.dateSetters[a];
if (!e) {
throw"Invalid setter: " + a
}
e.call(c, b[a]);
if (c.getTimezoneOffset() != f) {
c.setTime(c.getTime() + (f - c.getTimezoneOffset()) * 60 * 1000)
}
}
};
"use strict";
Dygraph.GVizChart = function (a) {
this.container = a
};
Dygraph.GVizChart.prototype.draw = function (b, a) {
this.container.innerHTML = "";
if (typeof(this.date_graph) != "undefined") {
this.date_graph.destroy()
}
this.date_graph = new Dygraph(this.container, b, a)
};
Dygraph.GVizChart.prototype.setSelection = function (b) {
var a = false;
if (b.length) {
a = b[0].row
}
this.date_graph.setSelection(a)
};
Dygraph.GVizChart.prototype.getSelection = function () {
var b = [];
var d = this.date_graph.getSelection();
if (d < 0) {
return b
}
var a = this.date_graph.layout_.points;
for (var c = 0; c < a.length; ++c) {
b.push({row: d, column: c + 1})
}
return b
};
"use strict";
Dygraph.Interaction = {};
Dygraph.Interaction.startPan = function (o, t, c) {
var r, b;
c.isPanning = true;
var k = t.xAxisRange();
c.dateRange = k[1] - k[0];
c.initialLeftmostDate = k[0];
c.xUnitsPerPixel = c.dateRange / (t.plotter_.area.w - 1);
if (t.attr_("panEdgeFraction")) {
var x = t.width_ * t.attr_("panEdgeFraction");
var d = t.xAxisExtremes();
var j = t.toDomXCoord(d[0]) - x;
var l = t.toDomXCoord(d[1]) + x;
var u = t.toDataXCoord(j);
var w = t.toDataXCoord(l);
c.boundedDates = [u, w];
var f = [];
var a = t.height_ * t.attr_("panEdgeFraction");
for (r = 0; r < t.axes_.length; r++) {
b = t.axes_[r];
var p = b.extremeRange;
var q = t.toDomYCoord(p[0], r) + a;
var s = t.toDomYCoord(p[1], r) - a;
var n = t.toDataYCoord(q, r);
var e = t.toDataYCoord(s, r);
f[r] = [n, e]
}
c.boundedValues = f
}
c.is2DPan = false;
c.axes = [];
for (r = 0; r < t.axes_.length; r++) {
b = t.axes_[r];
var h = {};
var m = t.yAxisRange(r);
var v = t.attributes_.getForAxis("logscale", r);
if (v) {
h.initialTopValue = Dygraph.log10(m[1]);
h.dragValueRange = Dygraph.log10(m[1]) - Dygraph.log10(m[0])
} else {
h.initialTopValue = m[1];
h.dragValueRange = m[1] - m[0]
}
h.unitsPerPixel = h.dragValueRange / (t.plotter_.area.h - 1);
c.axes.push(h);
if (b.valueWindow || b.valueRange) {
c.is2DPan = true
}
}
};
Dygraph.Interaction.movePan = function (b, k, c) {
c.dragEndX = k.dragGetX_(b, c);
c.dragEndY = k.dragGetY_(b, c);
var h = c.initialLeftmostDate - (c.dragEndX - c.dragStartX) * c.xUnitsPerPixel;
if (c.boundedDates) {
h = Math.max(h, c.boundedDates[0])
}
var a = h + c.dateRange;
if (c.boundedDates) {
if (a > c.boundedDates[1]) {
h = h - (a - c.boundedDates[1]);
a = h + c.dateRange
}
}
k.dateWindow_ = [h, a];
if (c.is2DPan) {
var d = c.dragEndY - c.dragStartY;
for (var j = 0; j < k.axes_.length; j++) {
var e = k.axes_[j];
var o = c.axes[j];
var p = d * o.unitsPerPixel;
var f = c.boundedValues ? c.boundedValues[j] : null;
var l = o.initialTopValue + p;
if (f) {
l = Math.min(l, f[1])
}
var n = l - o.dragValueRange;
if (f) {
if (n < f[0]) {
l = l - (n - f[0]);
n = l - o.dragValueRange
}
}
var m = k.attributes_.getForAxis("logscale", j);
if (m) {
e.valueWindow = [Math.pow(Dygraph.LOG_SCALE, n), Math.pow(Dygraph.LOG_SCALE, l)]
} else {
e.valueWindow = [n, l]
}
}
}
k.drawGraph_(false)
};
Dygraph.Interaction.endPan = function (c, b, a) {
a.dragEndX = b.dragGetX_(c, a);
a.dragEndY = b.dragGetY_(c, a);
var e = Math.abs(a.dragEndX - a.dragStartX);
var d = Math.abs(a.dragEndY - a.dragStartY);
if (e < 2 && d < 2 && b.lastx_ !== undefined && b.lastx_ != -1) {
Dygraph.Interaction.treatMouseOpAsClick(b, c, a)
}
a.isPanning = false;
a.is2DPan = false;
a.initialLeftmostDate = null;
a.dateRange = null;
a.valueRange = null;
a.boundedDates = null;
a.boundedValues = null;
a.axes = null
};
Dygraph.Interaction.startZoom = function (c, b, a) {
a.isZooming = true;
a.zoomMoved = false
};
Dygraph.Interaction.moveZoom = function (c, b, a) {
a.zoomMoved = true;
a.dragEndX = b.dragGetX_(c, a);
a.dragEndY = b.dragGetY_(c, a);
var e = Math.abs(a.dragStartX - a.dragEndX);
var d = Math.abs(a.dragStartY - a.dragEndY);
a.dragDirection = (e < d / 2) ? Dygraph.VERTICAL : Dygraph.HORIZONTAL;
b.drawZoomRect_(a.dragDirection, a.dragStartX, a.dragEndX, a.dragStartY, a.dragEndY, a.prevDragDirection, a.prevEndX, a.prevEndY);
a.prevEndX = a.dragEndX;
a.prevEndY = a.dragEndY;
a.prevDragDirection = a.dragDirection
};
Dygraph.Interaction.treatMouseOpAsClick = function (f, b, d) {
var k = f.attr_("clickCallback");
var n = f.attr_("pointClickCallback");
var j = null;
if (n) {
var l = -1;
var m = Number.MAX_VALUE;
for (var e = 0; e < f.selPoints_.length; e++) {
var c = f.selPoints_[e];
var a = Math.pow(c.canvasx - d.dragEndX, 2) + Math.pow(c.canvasy - d.dragEndY, 2);
if (!isNaN(a) && (l == -1 || a < m)) {
m = a;
l = e
}
}
var h = f.attr_("highlightCircleSize") + 2;
if (m <= h * h) {
j = f.selPoints_[l]
}
}
if (j) {
n(b, j)
}
if (k) {
k(b, f.lastx_, f.selPoints_)
}
};
Dygraph.Interaction.endZoom = function (c, i, e) {
e.isZooming = false;
e.dragEndX = i.dragGetX_(c, e);
e.dragEndY = i.dragGetY_(c, e);
var h = Math.abs(e.dragEndX - e.dragStartX);
var d = Math.abs(e.dragEndY - e.dragStartY);
if (h < 2 && d < 2 && i.lastx_ !== undefined && i.lastx_ != -1) {
Dygraph.Interaction.treatMouseOpAsClick(i, c, e)
}
var b = i.getArea();
if (h >= 10 && e.dragDirection == Dygraph.HORIZONTAL) {
var f = Math.min(e.dragStartX, e.dragEndX), k = Math.max(e.dragStartX, e.dragEndX);
f = Math.max(f, b.x);
k = Math.min(k, b.x + b.w);
if (f < k) {
i.doZoomX_(f, k)
}
e.cancelNextDblclick = true
} else {
if (d >= 10 && e.dragDirection == Dygraph.VERTICAL) {
var j = Math.min(e.dragStartY, e.dragEndY), a = Math.max(e.dragStartY, e.dragEndY);
j = Math.max(j, b.y);
a = Math.min(a, b.y + b.h);
if (j < a) {
i.doZoomY_(j, a)
}
e.cancelNextDblclick = true
} else {
if (e.zoomMoved) {
i.clearZoomRect_()
}
}
}
e.dragStartX = null;
e.dragStartY = null
};
Dygraph.Interaction.startTouch = function (f, e, d) {
f.preventDefault();
if (f.touches.length > 1) {
d.startTimeForDoubleTapMs = null
}
var h = [];
for (var c = 0; c < f.touches.length; c++) {
var b = f.touches[c];
h.push({pageX: b.pageX, pageY: b.pageY, dataX: e.toDataXCoord(b.pageX), dataY: e.toDataYCoord(b.pageY)})
}
d.initialTouches = h;
if (h.length == 1) {
d.initialPinchCenter = h[0];
d.touchDirections = {x: true, y: true}
} else {
if (h.length >= 2) {
d.initialPinchCenter = {
pageX: 0.5 * (h[0].pageX + h[1].pageX),
pageY: 0.5 * (h[0].pageY + h[1].pageY),
dataX: 0.5 * (h[0].dataX + h[1].dataX),
dataY: 0.5 * (h[0].dataY + h[1].dataY)
};
var a = 180 / Math.PI * Math.atan2(d.initialPinchCenter.pageY - h[0].pageY, h[0].pageX - d.initialPinchCenter.pageX);
a = Math.abs(a);
if (a > 90) {
a = 90 - a
}
d.touchDirections = {x: (a < (90 - 45 / 2)), y: (a > 45 / 2)}
}
}
d.initialRange = {x: e.xAxisRange(), y: e.yAxisRange()}
};
Dygraph.Interaction.moveTouch = function (n, q, d) {
d.startTimeForDoubleTapMs = null;
var p, l = [];
for (p = 0; p < n.touches.length; p++) {
var k = n.touches[p];
l.push({pageX: k.pageX, pageY: k.pageY})
}
var a = d.initialTouches;
var h;
var j = d.initialPinchCenter;
if (l.length == 1) {
h = l[0]
} else {
h = {pageX: 0.5 * (l[0].pageX + l[1].pageX), pageY: 0.5 * (l[0].pageY + l[1].pageY)}
}
var m = {pageX: h.pageX - j.pageX, pageY: h.pageY - j.pageY};
var f = d.initialRange.x[1] - d.initialRange.x[0];
var o = d.initialRange.y[0] - d.initialRange.y[1];
m.dataX = (m.pageX / q.plotter_.area.w) * f;
m.dataY = (m.pageY / q.plotter_.area.h) * o;
var w, c;
if (l.length == 1) {
w = 1;
c = 1
} else {
if (l.length >= 2) {
var e = (a[1].pageX - j.pageX);
w = (l[1].pageX - h.pageX) / e;
var v = (a[1].pageY - j.pageY);
c = (l[1].pageY - h.pageY) / v
}
}
w = Math.min(8, Math.max(0.125, w));
c = Math.min(8, Math.max(0.125, c));
var u = false;
if (d.touchDirections.x) {
q.dateWindow_ = [j.dataX - m.dataX + (d.initialRange.x[0] - j.dataX) / w, j.dataX - m.dataX + (d.initialRange.x[1] - j.dataX) / w];
u = true
}
if (d.touchDirections.y) {
for (p = 0; p < 1; p++) {
var b = q.axes_[p];
var s = q.attributes_.getForAxis("logscale", p);
if (s) {
} else {
b.valueWindow = [j.dataY - m.dataY + (d.initialRange.y[0] - j.dataY) / c, j.dataY - m.dataY + (d.initialRange.y[1] - j.dataY) / c];
u = true
}
}
}
q.drawGraph_(false);
if (u && l.length > 1 && q.attr_("zoomCallback")) {
var r = q.xAxisRange();
q.attr_("zoomCallback")(r[0], r[1], q.yAxisRanges())
}
};
Dygraph.Interaction.endTouch = function (e, d, c) {
if (e.touches.length !== 0) {
Dygraph.Interaction.startTouch(e, d, c)
} else {
if (e.changedTouches.length == 1) {
var a = new Date().getTime();
var b = e.changedTouches[0];
if (c.startTimeForDoubleTapMs && a - c.startTimeForDoubleTapMs < 500 && c.doubleTapX && Math.abs(c.doubleTapX - b.screenX) < 50 && c.doubleTapY && Math.abs(c.doubleTapY - b.screenY) < 50) {
d.resetZoom()
} else {
c.startTimeForDoubleTapMs = a;
c.doubleTapX = b.screenX;
c.doubleTapY = b.screenY
}
}
}
};
Dygraph.Interaction.defaultModel = {
mousedown: function (c, b, a) {
if (c.button && c.button == 2) {
return
}
a.initializeMouseDown(c, b, a);
if (c.altKey || c.shiftKey) {
Dygraph.startPan(c, b, a)
} else {
Dygraph.startZoom(c, b, a)
}
}, mousemove: function (c, b, a) {
if (a.isZooming) {
Dygraph.moveZoom(c, b, a)
} else {
if (a.isPanning) {
Dygraph.movePan(c, b, a)
}
}
}, mouseup: function (c, b, a) {
if (a.isZooming) {
Dygraph.endZoom(c, b, a)
} else {
if (a.isPanning) {
Dygraph.endPan(c, b, a)
}
}
}, touchstart: function (c, b, a) {
Dygraph.Interaction.startTouch(c, b, a)
}, touchmove: function (c, b, a) {
Dygraph.Interaction.moveTouch(c, b, a)
}, touchend: function (c, b, a) {
Dygraph.Interaction.endTouch(c, b, a)
}, mouseout: function (c, b, a) {
if (a.isZooming) {
a.dragEndX = null;
a.dragEndY = null;
b.clearZoomRect_()
}
}, dblclick: function (c, b, a) {
if (a.cancelNextDblclick) {
a.cancelNextDblclick = false;
return
}
if (c.altKey || c.shiftKey) {
return
}
b.resetZoom()
}
};
Dygraph.DEFAULT_ATTRS.interactionModel = Dygraph.Interaction.defaultModel;
Dygraph.defaultInteractionModel = Dygraph.Interaction.defaultModel;
Dygraph.endZoom = Dygraph.Interaction.endZoom;
Dygraph.moveZoom = Dygraph.Interaction.moveZoom;
Dygraph.startZoom = Dygraph.Interaction.startZoom;
Dygraph.endPan = Dygraph.Interaction.endPan;
Dygraph.movePan = Dygraph.Interaction.movePan;
Dygraph.startPan = Dygraph.Interaction.startPan;
Dygraph.Interaction.nonInteractiveModel_ = {
mousedown: function (c, b, a) {
a.initializeMouseDown(c, b, a)
}, mouseup: function (c, b, a) {
a.dragEndX = b.dragGetX_(c, a);
a.dragEndY = b.dragGetY_(c, a);
var e = Math.abs(a.dragEndX - a.dragStartX);
var d = Math.abs(a.dragEndY - a.dragStartY);
if (e < 2 && d < 2 && b.lastx_ !== undefined && b.lastx_ != -1) {
Dygraph.Interaction.treatMouseOpAsClick(b, c, a)
}
}
};
Dygraph.Interaction.dragIsPanInteractionModel = {
mousedown: function (c, b, a) {
a.initializeMouseDown(c, b, a);
Dygraph.startPan(c, b, a)
}, mousemove: function (c, b, a) {
if (a.isPanning) {
Dygraph.movePan(c, b, a)
}
}, mouseup: function (c, b, a) {
if (a.isPanning) {
Dygraph.endPan(c, b, a)
}
}
};
"use strict";
Dygraph.TickList = undefined;
Dygraph.Ticker = undefined;
Dygraph.numericLinearTicks = function (d, c, i, g, f, h) {
var e = function (a) {
if (a === "logscale") {
return false
}
return g(a)
};
return Dygraph.numericTicks(d, c, i, e, f, h)
};
Dygraph.numericTicks = function (F, E, u, p, d, q) {
var z = (p("pixelsPerLabel"));
var G = [];
var C, A, t, y;
if (q) {
for (C = 0; C < q.length; C++) {
G.push({v: q[C]})
}
} else {
if (p("logscale")) {
y = Math.floor(u / z);
var l = Dygraph.binarySearch(F, Dygraph.PREFERRED_LOG_TICK_VALUES, 1);
var H = Dygraph.binarySearch(E, Dygraph.PREFERRED_LOG_TICK_VALUES, -1);
if (l == -1) {
l = 0
}
if (H == -1) {
H = Dygraph.PREFERRED_LOG_TICK_VALUES.length - 1
}
var s = null;
if (H - l >= y / 4) {
for (var r = H; r >= l; r--) {
var m = Dygraph.PREFERRED_LOG_TICK_VALUES[r];
var k = Math.log(m / F) / Math.log(E / F) * u;
var D = {v: m};
if (s === null) {
s = {tickValue: m, pixel_coord: k}
} else {
if (Math.abs(k - s.pixel_coord) >= z) {
s = {tickValue: m, pixel_coord: k}
} else {
D.label = ""
}
}
G.push(D)
}
G.reverse()
}
}
if (G.length === 0) {
var g = p("labelsKMG2");
var n, h;
if (g) {
n = [1, 2, 4, 8, 16, 32, 64, 128, 256];
h = 16
} else {
n = [1, 2, 5, 10, 20, 50, 100];
h = 10
}
var w = Math.ceil(u / z);
var o = Math.abs(E - F) / w;
var v = Math.floor(Math.log(o) / Math.log(h));
var f = Math.pow(h, v);
var I, x, c, e;
for (A = 0; A < n.length; A++) {
I = f * n[A];
x = Math.floor(F / I) * I;
c = Math.ceil(E / I) * I;
y = Math.abs(c - x) / I;
e = u / y;
if (e > z) {
break
}
}
if (x > c) {
I *= -1
}
for (C = 0; C < y; C++) {
t = x + C * I;
G.push({v: t})
}
}
}
var B = (p("axisLabelFormatter"));
for (C = 0; C < G.length; C++) {
if (G[C].label !== undefined) {
continue
}
G[C].label = B(G[C].v, 0, p, d)
}
return G
};
Dygraph.dateTicker = function (e, c, i, g, f, h) {
var d = Dygraph.pickDateTickGranularity(e, c, i, g);
if (d >= 0) {
return Dygraph.getDateAxis(e, c, d, g, f)
} else {
return []
}
};
Dygraph.SECONDLY = 0;
Dygraph.TWO_SECONDLY = 1;
Dygraph.FIVE_SECONDLY = 2;
Dygraph.TEN_SECONDLY = 3;
Dygraph.THIRTY_SECONDLY = 4;
Dygraph.MINUTELY = 5;
Dygraph.TWO_MINUTELY = 6;
Dygraph.FIVE_MINUTELY = 7;
Dygraph.TEN_MINUTELY = 8;
Dygraph.THIRTY_MINUTELY = 9;
Dygraph.HOURLY = 10;
Dygraph.TWO_HOURLY = 11;
Dygraph.SIX_HOURLY = 12;
Dygraph.DAILY = 13;
Dygraph.WEEKLY = 14;
Dygraph.MONTHLY = 15;
Dygraph.QUARTERLY = 16;
Dygraph.BIANNUAL = 17;
Dygraph.ANNUAL = 18;
Dygraph.DECADAL = 19;
Dygraph.CENTENNIAL = 20;
Dygraph.NUM_GRANULARITIES = 21;
Dygraph.SHORT_SPACINGS = [];
Dygraph.SHORT_SPACINGS[Dygraph.SECONDLY] = 1000 * 1;
Dygraph.SHORT_SPACINGS[Dygraph.TWO_SECONDLY] = 1000 * 2;
Dygraph.SHORT_SPACINGS[Dygraph.FIVE_SECONDLY] = 1000 * 5;
Dygraph.SHORT_SPACINGS[Dygraph.TEN_SECONDLY] = 1000 * 10;
Dygraph.SHORT_SPACINGS[Dygraph.THIRTY_SECONDLY] = 1000 * 30;
Dygraph.SHORT_SPACINGS[Dygraph.MINUTELY] = 1000 * 60;
Dygraph.SHORT_SPACINGS[Dygraph.TWO_MINUTELY] = 1000 * 60 * 2;
Dygraph.SHORT_SPACINGS[Dygraph.FIVE_MINUTELY] = 1000 * 60 * 5;
Dygraph.SHORT_SPACINGS[Dygraph.TEN_MINUTELY] = 1000 * 60 * 10;
Dygraph.SHORT_SPACINGS[Dygraph.THIRTY_MINUTELY] = 1000 * 60 * 30;
Dygraph.SHORT_SPACINGS[Dygraph.HOURLY] = 1000 * 3600;
Dygraph.SHORT_SPACINGS[Dygraph.TWO_HOURLY] = 1000 * 3600 * 2;
Dygraph.SHORT_SPACINGS[Dygraph.SIX_HOURLY] = 1000 * 3600 * 6;
Dygraph.SHORT_SPACINGS[Dygraph.DAILY] = 1000 * 86400;
Dygraph.SHORT_SPACINGS[Dygraph.WEEKLY] = 1000 * 604800;
Dygraph.LONG_TICK_PLACEMENTS = [];
Dygraph.LONG_TICK_PLACEMENTS[Dygraph.MONTHLY] = {months: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], year_mod: 1};
Dygraph.LONG_TICK_PLACEMENTS[Dygraph.QUARTERLY] = {months: [0, 3, 6, 9], year_mod: 1};
Dygraph.LONG_TICK_PLACEMENTS[Dygraph.BIANNUAL] = {months: [0, 6], year_mod: 1};
Dygraph.LONG_TICK_PLACEMENTS[Dygraph.ANNUAL] = {months: [0], year_mod: 1};
Dygraph.LONG_TICK_PLACEMENTS[Dygraph.DECADAL] = {months: [0], year_mod: 10};
Dygraph.LONG_TICK_PLACEMENTS[Dygraph.CENTENNIAL] = {months: [0], year_mod: 100};
Dygraph.PREFERRED_LOG_TICK_VALUES = function () {
var c = [];
for (var b = -39; b <= 39; b++) {
var a = Math.pow(10, b);
for (var d = 1; d <= 9; d++) {
var e = a * d;
c.push(e)
}
}
return c
}();
Dygraph.pickDateTickGranularity = function (d, c, j, h) {
var g = (h("pixelsPerLabel"));
for (var f = 0; f < Dygraph.NUM_GRANULARITIES; f++) {
var e = Dygraph.numDateTicks(d, c, f);
if (j / e >= g) {
return f
}
}
return -1
};
Dygraph.numDateTicks = function (e, b, f) {
if (f < Dygraph.MONTHLY) {
var g = Dygraph.SHORT_SPACINGS[f];
return Math.floor(0.5 + 1 * (b - e) / g)
} else {
var d = Dygraph.LONG_TICK_PLACEMENTS[f];
var c = 365.2524 * 24 * 3600 * 1000;
var a = 1 * (b - e) / c;
return Math.floor(0.5 + 1 * a * d.months.length / d.year_mod)
}
};
Dygraph.getDateAxis = function (p, l, a, n, z) {
var w = (n("axisLabelFormatter"));
var C = [];
var m;
if (a < Dygraph.MONTHLY) {
var c = Dygraph.SHORT_SPACINGS[a];
var y = c / 1000;
var A = new Date(p);
Dygraph.setDateSameTZ(A, {ms: 0});
var h;
if (y <= 60) {
h = A.getSeconds();
Dygraph.setDateSameTZ(A, {s: h - h % y})
} else {
Dygraph.setDateSameTZ(A, {s: 0});
y /= 60;
if (y <= 60) {
h = A.getMinutes();
Dygraph.setDateSameTZ(A, {m: h - h % y})
} else {
Dygraph.setDateSameTZ(A, {m: 0});
y /= 60;
if (y <= 24) {
h = A.getHours();
A.setHours(h - h % y)
} else {
A.setHours(0);
y /= 24;
if (y == 7) {
A.setDate(A.getDate() - A.getDay())
}
}
}
}
p = A.getTime();
var B = new Date(p).getTimezoneOffset();
var e = (c >= Dygraph.SHORT_SPACINGS[Dygraph.TWO_HOURLY]);
for (m = p; m <= l; m += c) {
A = new Date(m);
if (e && A.getTimezoneOffset() != B) {
var k = A.getTimezoneOffset() - B;
m += k * 60 * 1000;
A = new Date(m);
B = A.getTimezoneOffset();
if (new Date(m + c).getTimezoneOffset() != B) {
m += c;
A = new Date(m);
B = A.getTimezoneOffset()
}
}
C.push({v: m, label: w(A, a, n, z)})
}
} else {
var f;
var r = 1;
if (a < Dygraph.NUM_GRANULARITIES) {
f = Dygraph.LONG_TICK_PLACEMENTS[a].months;
r = Dygraph.LONG_TICK_PLACEMENTS[a].year_mod
} else {
Dygraph.warn("Span of dates is too long")
}
var v = new Date(p).getFullYear();
var q = new Date(l).getFullYear();
var b = Dygraph.zeropad;
for (var u = v; u <= q; u++) {
if (u % r !== 0) {
continue
}
for (var s = 0; s < f.length; s++) {
var o = u + "/" + b(1 + f[s]) + "/01";
m = Dygraph.dateStrToMillis(o);
if (m < p || m > l) {
continue
}
C.push({v: m, label: w(new Date(m), a, n, z)})
}
}
}
return C
};
if (Dygraph && Dygraph.DEFAULT_ATTRS && Dygraph.DEFAULT_ATTRS.axes && Dygraph.DEFAULT_ATTRS.axes["x"] && Dygraph.DEFAULT_ATTRS.axes["y"] && Dygraph.DEFAULT_ATTRS.axes["y2"]) {
Dygraph.DEFAULT_ATTRS.axes["x"]["ticker"] = Dygraph.dateTicker;
Dygraph.DEFAULT_ATTRS.axes["y"]["ticker"] = Dygraph.numericTicks;
Dygraph.DEFAULT_ATTRS.axes["y2"]["ticker"] = Dygraph.numericTicks
}
Dygraph.Plugins = {};
Dygraph.Plugins.Annotations = (function () {
var a = function () {
this.annotations_ = []
};
a.prototype.toString = function () {
return "Annotations Plugin"
};
a.prototype.activate = function (b) {
return {clearChart: this.clearChart, didDrawChart: this.didDrawChart}
};
a.prototype.detachLabels = function () {
for (var c = 0; c < this.annotations_.length; c++) {
var b = this.annotations_[c];
if (b.parentNode) {
b.parentNode.removeChild(b)
}
this.annotations_[c] = null
}
this.annotations_ = []
};
a.prototype.clearChart = function (b) {
this.detachLabels()
};
a.prototype.didDrawChart = function (v) {
var t = v.dygraph;
var r = t.layout_.annotated_points;
if (!r || r.length === 0) {
return
}
var h = v.canvas.parentNode;
var x = {
position: "absolute",
fontSize: t.getOption("axisLabelFontSize") + "px",
zIndex: 10,
overflow: "hidden"
};
var b = function (e, g, i) {
return function (y) {
var p = i.annotation;
if (p.hasOwnProperty(e)) {
p[e](p, i, t, y)
} else {
if (t.getOption(g)) {
t.getOption(g)(p, i, t, y)
}
}
}
};
var u = v.dygraph.plotter_.area;
var q = {};
for (var s = 0; s < r.length; s++) {
var l = r[s];
if (l.canvasx < u.x || l.canvasx > u.x + u.w || l.canvasy < u.y || l.canvasy > u.y + u.h) {
continue
}
var w = l.annotation;
var n = 6;
if (w.hasOwnProperty("tickHeight")) {
n = w.tickHeight
}
var j = document.createElement("div");
for (var A in x) {
if (x.hasOwnProperty(A)) {
j.style[A] = x[A]
}
}
if (!w.hasOwnProperty("icon")) {
j.className = "dygraphDefaultAnnotation"
}
if (w.hasOwnProperty("cssClass")) {
j.className += " " + w.cssClass
}
var m = w.hasOwnProperty("width") ? w.width : 16;
var k = w.hasOwnProperty("height") ? w.height : 16;
if (w.hasOwnProperty("icon")) {
var z = document.createElement("img");
z.src = w.icon;
z.width = m;
z.height = k;
j.appendChild(z)
} else {
if (l.annotation.hasOwnProperty("shortText")) {
j.appendChild(document.createTextNode(l.annotation.shortText))
}
}
var c = l.canvasx - m / 2;
j.style.left = c + "px";
var f = 0;
if (w.attachAtBottom) {
var d = (u.y + u.h - k - n);
if (q[c]) {
d -= q[c]
} else {
q[c] = 0
}
q[c] += (n + k);
f = d
} else {
f = l.canvasy - k - n
}
j.style.top = f + "px";
j.style.width = m + "px";
j.style.height = k + "px";
j.title = l.annotation.text;
j.style.color = t.colorsMap_[l.name];
j.style.borderColor = t.colorsMap_[l.name];
w.div = j;
t.addAndTrackEvent(j, "click", b("clickHandler", "annotationClickHandler", l, this));
t.addAndTrackEvent(j, "mouseover", b("mouseOverHandler", "annotationMouseOverHandler", l, this));
t.addAndTrackEvent(j, "mouseout", b("mouseOutHandler", "annotationMouseOutHandler", l, this));
t.addAndTrackEvent(j, "dblclick", b("dblClickHandler", "annotationDblClickHandler", l, this));
h.appendChild(j);
this.annotations_.push(j);
var o = v.drawingContext;
o.save();
o.strokeStyle = t.colorsMap_[l.name];
o.beginPath();
if (!w.attachAtBottom) {
o.moveTo(l.canvasx, l.canvasy);
o.lineTo(l.canvasx, l.canvasy - 2 - n)
} else {
var d = f + k;
o.moveTo(l.canvasx, d);
o.lineTo(l.canvasx, d + n)
}
o.closePath();
o.stroke();
o.restore()
}
};
a.prototype.destroy = function () {
this.detachLabels()
};
return a
})();
Dygraph.Plugins.Axes = (function () {
var a = function () {
this.xlabels_ = [];
this.ylabels_ = []
};
a.prototype.toString = function () {
return "Axes Plugin"
};
a.prototype.activate = function (b) {
return {layout: this.layout, clearChart: this.clearChart, willDrawChart: this.willDrawChart}
};
a.prototype.layout = function (f) {
var d = f.dygraph;
if (d.getOption("drawYAxis")) {
var b = d.getOption("yAxisLabelWidth") + 2 * d.getOption("axisTickSize");
f.reserveSpaceLeft(b)
}
if (d.getOption("drawXAxis")) {
var c;
if (d.getOption("xAxisHeight")) {
c = d.getOption("xAxisHeight")
} else {
c = d.getOptionForAxis("axisLabelFontSize", "x") + 2 * d.getOption("axisTickSize")
}
f.reserveSpaceBottom(c)
}
if (d.numAxes() == 2) {
if (d.getOption("drawYAxis")) {
var b = d.getOption("yAxisLabelWidth") + 2 * d.getOption("axisTickSize");
f.reserveSpaceRight(b)
}
} else {
if (d.numAxes() > 2) {
d.error("Only two y-axes are supported at this time. (Trying to use " + d.numAxes() + ")")
}
}
};
a.prototype.detachLabels = function () {
function b(d) {
for (var c = 0; c < d.length; c++) {
var e = d[c];
if (e.parentNode) {
e.parentNode.removeChild(e)
}
}
}
b(this.xlabels_);
b(this.ylabels_);
this.xlabels_ = [];
this.ylabels_ = []
};
a.prototype.clearChart = function (b) {
this.detachLabels()
};
a.prototype.willDrawChart = function (H) {
var F = H.dygraph;
if (!F.getOption("drawXAxis") && !F.getOption("drawYAxis")) {
return
}
function B(e) {
return Math.round(e) + 0.5
}
function A(e) {
return Math.round(e) - 0.5
}
var j = H.drawingContext;
var v = H.canvas.parentNode;
var J = H.canvas.width;
var d = H.canvas.height;
var s, u, t, E, D;
var C = function (e) {
return {
position: "absolute",
fontSize: F.getOptionForAxis("axisLabelFontSize", e) + "px",
zIndex: 10,
color: F.getOptionForAxis("axisLabelColor", e),
width: F.getOption("axisLabelWidth") + "px",
lineHeight: "normal",
overflow: "hidden"
}
};
var p = {x: C("x"), y: C("y"), y2: C("y2")};
var m = function (g, x, y) {
var K = document.createElement("div");
var e = p[y == "y2" ? "y2" : x];
for (var r in e) {
if (e.hasOwnProperty(r)) {
K.style[r] = e[r]
}
}
var i = document.createElement("div");
i.className = "dygraph-axis-label dygraph-axis-label-" + x + (y ? " dygraph-axis-label-" + y : "");
i.innerHTML = g;
K.appendChild(i);
return K
};
j.save();
var I = F.layout_;
var G = H.dygraph.plotter_.area;
if (F.getOption("drawYAxis")) {
if (I.yticks && I.yticks.length > 0) {
var h = F.numAxes();
for (D = 0; D < I.yticks.length; D++) {
E = I.yticks[D];
if (typeof(E) == "function") {
return
}
u = G.x;
var o = 1;
var f = "y1";
if (E[0] == 1) {
u = G.x + G.w;
o = -1;
f = "y2"
}
var k = F.getOptionForAxis("axisLabelFontSize", f);
t = G.y + E[1] * G.h;
s = m(E[2], "y", h == 2 ? f : null);
var z = (t - k / 2);
if (z < 0) {
z = 0
}
if (z + k + 3 > d) {
s.style.bottom = "0px"
} else {
s.style.top = z + "px"
}
if (E[0] === 0) {
s.style.left = (G.x - F.getOption("yAxisLabelWidth") - F.getOption("axisTickSize")) + "px";
s.style.textAlign = "right"
} else {
if (E[0] == 1) {
s.style.left = (G.x + G.w + F.getOption("axisTickSize")) + "px";
s.style.textAlign = "left"
}
}
s.style.width = F.getOption("yAxisLabelWidth") + "px";
v.appendChild(s);
this.ylabels_.push(s)
}
var n = this.ylabels_[0];
var k = F.getOptionForAxis("axisLabelFontSize", "y");
var q = parseInt(n.style.top, 10) + k;
if (q > d - k) {
n.style.top = (parseInt(n.style.top, 10) - k / 2) + "px"
}
}
var c;
if (F.getOption("drawAxesAtZero")) {
var w = F.toPercentXCoord(0);
if (w > 1 || w < 0 || isNaN(w)) {
w = 0
}
c = B(G.x + w * G.w)
} else {
c = B(G.x)
}
j.strokeStyle = F.getOptionForAxis("axisLineColor", "y");
j.lineWidth = F.getOptionForAxis("axisLineWidth", "y");
j.beginPath();
j.moveTo(c, A(G.y));
j.lineTo(c, A(G.y + G.h));
j.closePath();
j.stroke();
if (F.numAxes() == 2) {
j.strokeStyle = F.getOptionForAxis("axisLineColor", "y2");
j.lineWidth = F.getOptionForAxis("axisLineWidth", "y2");
j.beginPath();
j.moveTo(A(G.x + G.w), A(G.y));
j.lineTo(A(G.x + G.w), A(G.y + G.h));
j.closePath();
j.stroke()
}
}
if (F.getOption("drawXAxis")) {
if (I.xticks) {
for (D = 0; D < I.xticks.length; D++) {
E = I.xticks[D];
u = G.x + E[0] * G.w;
t = G.y + G.h;
s = m(E[1], "x");
s.style.textAlign = "center";
s.style.top = (t + F.getOption("axisTickSize")) + "px";
var l = (u - F.getOption("axisLabelWidth") / 2);
if (l + F.getOption("axisLabelWidth") > J) {
l = J - F.getOption("xAxisLabelWidth");
s.style.textAlign = "right"
}
if (l < 0) {
l = 0;
s.style.textAlign = "left"
}
s.style.left = l + "px";
s.style.width = F.getOption("xAxisLabelWidth") + "px";
v.appendChild(s);
this.xlabels_.push(s)
}
}
j.strokeStyle = F.getOptionForAxis("axisLineColor", "x");
j.lineWidth = F.getOptionForAxis("axisLineWidth", "x");
j.beginPath();
var b;
if (F.getOption("drawAxesAtZero")) {
var w = F.toPercentYCoord(0, 0);
if (w > 1 || w < 0) {
w = 1
}
b = A(G.y + w * G.h)
} else {
b = A(G.y + G.h)
}
j.moveTo(B(G.x), b);
j.lineTo(B(G.x + G.w), b);
j.closePath();
j.stroke()
}
j.restore()
};
return a
})();
Dygraph.Plugins.ChartLabels = (function () {
var c = function () {
this.title_div_ = null;
this.xlabel_div_ = null;
this.ylabel_div_ = null;
this.y2label_div_ = null
};
c.prototype.toString = function () {
return "ChartLabels Plugin"
};
c.prototype.activate = function (d) {
return {layout: this.layout, didDrawChart: this.didDrawChart}
};
var b = function (d) {
var e = document.createElement("div");
e.style.position = "absolute";
e.style.left = d.x + "px";
e.style.top = d.y + "px";
e.style.width = d.w + "px";
e.style.height = d.h + "px";
return e
};
c.prototype.detachLabels_ = function () {
var e = [this.title_div_, this.xlabel_div_, this.ylabel_div_, this.y2label_div_];
for (var d = 0; d < e.length; d++) {
var f = e[d];
if (!f) {
continue
}
if (f.parentNode) {
f.parentNode.removeChild(f)
}
}
this.title_div_ = null;
this.xlabel_div_ = null;
this.ylabel_div_ = null;
this.y2label_div_ = null
};
var a = function (l, i, f, h, j) {
var d = document.createElement("div");
d.style.position = "absolute";
if (f == 1) {
d.style.left = "0px"
} else {
d.style.left = i.x + "px"
}
d.style.top = i.y + "px";
d.style.width = i.w + "px";
d.style.height = i.h + "px";
d.style.fontSize = (l.getOption("yLabelWidth") - 2) + "px";
var m = document.createElement("div");
m.style.position = "absolute";
m.style.width = i.h + "px";
m.style.height = i.w + "px";
m.style.top = (i.h / 2 - i.w / 2) + "px";
m.style.left = (i.w / 2 - i.h / 2) + "px";
m.style.textAlign = "center";
var e = "rotate(" + (f == 1 ? "-" : "") + "90deg)";
m.style.transform = e;
m.style.WebkitTransform = e;
m.style.MozTransform = e;
m.style.OTransform = e;
m.style.msTransform = e;
if (typeof(document.documentMode) !== "undefined" && document.documentMode < 9) {
m.style.filter = "progid:DXImageTransform.Microsoft.BasicImage(rotation=" + (f == 1 ? "3" : "1") + ")";
m.style.left = "0px";
m.style.top = "0px"
}
var k = document.createElement("div");
k.className = h;
k.innerHTML = j;
m.appendChild(k);
d.appendChild(m);
return d
};
c.prototype.layout = function (k) {
this.detachLabels_();
var i = k.dygraph;
var m = k.chart_div;
if (i.getOption("title")) {
var d = k.reserveSpaceTop(i.getOption("titleHeight"));
this.title_div_ = b(d);
this.title_div_.style.textAlign = "center";
this.title_div_.style.fontSize = (i.getOption("titleHeight") - 8) + "px";
this.title_div_.style.fontWeight = "bold";
this.title_div_.style.zIndex = 10;
var f = document.createElement("div");
f.className = "dygraph-label dygraph-title";
f.innerHTML = i.getOption("title");
this.title_div_.appendChild(f);
m.appendChild(this.title_div_)
}
if (i.getOption("xlabel")) {
var j = k.reserveSpaceBottom(i.getOption("xLabelHeight"));
this.xlabel_div_ = b(j);
this.xlabel_div_.style.textAlign = "center";
this.xlabel_div_.style.fontSize = (i.getOption("xLabelHeight") - 2) + "px";
var f = document.createElement("div");
f.className = "dygraph-label dygraph-xlabel";
f.innerHTML = i.getOption("xlabel");
this.xlabel_div_.appendChild(f);
m.appendChild(this.xlabel_div_)
}
if (i.getOption("ylabel")) {
var h = k.reserveSpaceLeft(0);
this.ylabel_div_ = a(i, h, 1, "dygraph-label dygraph-ylabel", i.getOption("ylabel"));
m.appendChild(this.ylabel_div_)
}
if (i.getOption("y2label") && i.numAxes() == 2) {
var l = k.reserveSpaceRight(0);
this.y2label_div_ = a(i, l, 2, "dygraph-label dygraph-y2label", i.getOption("y2label"));
m.appendChild(this.y2label_div_)
}
};
c.prototype.didDrawChart = function (f) {
var d = f.dygraph;
if (this.title_div_) {
this.title_div_.children[0].innerHTML = d.getOption("title")
}
if (this.xlabel_div_) {
this.xlabel_div_.children[0].innerHTML = d.getOption("xlabel")
}
if (this.ylabel_div_) {
this.ylabel_div_.children[0].children[0].innerHTML = d.getOption("ylabel")
}
if (this.y2label_div_) {
this.y2label_div_.children[0].children[0].innerHTML = d.getOption("y2label")
}
};
c.prototype.clearChart = function () {
};
c.prototype.destroy = function () {
this.detachLabels_()
};
return c
})();
Dygraph.Plugins.Grid = (function () {
var a = function () {
};
a.prototype.toString = function () {
return "Gridline Plugin"
};
a.prototype.activate = function (b) {
return {willDrawChart: this.willDrawChart}
};
a.prototype.willDrawChart = function (s) {
var q = s.dygraph;
var l = s.drawingContext;
var t = q.layout_;
var r = s.dygraph.plotter_.area;
function k(e) {
return Math.round(e) + 0.5
}
function j(e) {
return Math.round(e) - 0.5
}
var h, f, p, u;
if (q.getOption("drawYGrid")) {
var o = ["y", "y2"];
var m = [], v = [], b = [], n = [], d = [];
for (var p = 0; p < o.length; p++) {
b[p] = q.getOptionForAxis("drawGrid", o[p]);
if (b[p]) {
m[p] = q.getOptionForAxis("gridLineColor", o[p]);
v[p] = q.getOptionForAxis("gridLineWidth", o[p]);
d[p] = q.getOptionForAxis("gridLinePattern", o[p]);
n[p] = d[p] && (d[p].length >= 2)
}
}
u = t.yticks;
l.save();
for (p = 0; p < u.length; p++) {
var c = u[p][0];
if (b[c]) {
if (n[c]) {
l.installPattern(d[c])
}
l.strokeStyle = m[c];
l.lineWidth = v[c];
h = k(r.x);
f = j(r.y + u[p][1] * r.h);
l.beginPath();
l.moveTo(h, f);
l.lineTo(h + r.w, f);
l.closePath();
l.stroke();
if (n[c]) {
l.uninstallPattern()
}
}
}
l.restore()
}
if (q.getOption("drawXGrid") && q.getOptionForAxis("drawGrid", "x")) {
u = t.xticks;
l.save();
var d = q.getOptionForAxis("gridLinePattern", "x");
var n = d && (d.length >= 2);
if (n) {
l.installPattern(d)
}
l.strokeStyle = q.getOptionForAxis("gridLineColor", "x");
l.lineWidth = q.getOptionForAxis("gridLineWidth", "x");
for (p = 0; p < u.length; p++) {
h = k(r.x + u[p][0] * r.w);
f = j(r.y + r.h);
l.beginPath();
l.moveTo(h, f);
l.lineTo(h, r.y);
l.closePath();
l.stroke()
}
if (n) {
l.uninstallPattern()
}
l.restore()
}
};
a.prototype.destroy = function () {
};
return a
})();
Dygraph.Plugins.Legend = (function () {
var c = function () {
this.legend_div_ = null;
this.is_generated_div_ = false
};
c.prototype.toString = function () {
return "Legend Plugin"
};
var a, d;
c.prototype.activate = function (j) {
var m;
var f = j.getOption("labelsDivWidth");
var l = j.getOption("labelsDiv");
if (l && null !== l) {
if (typeof(l) == "string" || l instanceof String) {
m = document.getElementById(l)
} else {
m = l
}
} else {
var i = {
position: "absolute",
fontSize: "14px",
zIndex: 10,
width: f + "px",
top: "0px",
left: (j.size().width - f - 2) + "px",
background: "white",
lineHeight: "normal",
textAlign: "left",
overflow: "hidden"
};
Dygraph.update(i, j.getOption("labelsDivStyles"));
m = document.createElement("div");
m.className = "dygraph-legend";
for (var h in i) {
if (!i.hasOwnProperty(h)) {
continue
}
try {
m.style[h] = i[h]
} catch (k) {
this.warn("You are using unsupported css properties for your browser in labelsDivStyles")
}
}
j.graphDiv.appendChild(m);
this.is_generated_div_ = true
}
this.legend_div_ = m;
this.one_em_width_ = 10;
return {select: this.select, deselect: this.deselect, predraw: this.predraw, didDrawChart: this.didDrawChart}
};
var b = function (g) {
var f = document.createElement("span");
f.setAttribute("style", "margin: 0; padding: 0 0 0 1em; border: 0;");
g.appendChild(f);
var e = f.offsetWidth;
g.removeChild(f);
return e
};
c.prototype.select = function (i) {
var h = i.selectedX;
var g = i.selectedPoints;
var f = a(i.dygraph, h, g, this.one_em_width_);
this.legend_div_.innerHTML = f
};
c.prototype.deselect = function (h) {
var f = b(this.legend_div_);
this.one_em_width_ = f;
var g = a(h.dygraph, undefined, undefined, f);
this.legend_div_.innerHTML = g
};
c.prototype.didDrawChart = function (f) {
this.deselect(f)
};
c.prototype.predraw = function (h) {
if (!this.is_generated_div_) {
return
}
h.dygraph.graphDiv.appendChild(this.legend_div_);
var g = h.dygraph.plotter_.area;
var f = h.dygraph.getOption("labelsDivWidth");
this.legend_div_.style.left = g.x + g.w - f - 1 + "px";
this.legend_div_.style.top = g.y + "px";
this.legend_div_.style.width = f + "px"
};
c.prototype.destroy = function () {
this.legend_div_ = null
};
a = function (w, p, l, f) {
if (w.getOption("showLabelsOnHighlight") !== true) {
return ""
}
var r, C, u, s, m;
var z = w.getLabels();
if (typeof(p) === "undefined") {
if (w.getOption("legend") != "always") {
return ""
}
C = w.getOption("labelsSeparateLines");
r = "";
for (u = 1; u < z.length; u++) {
var q = w.getPropertiesForSeries(z[u]);
if (!q.visible) {
continue
}
if (r !== "") {
r += (C ? " " : " ")
}
m = w.getOption("strokePattern", z[u]);
s = d(m, q.color, f);
r += "" + s + " " + z[u] + ""
}
return r
}
var A = w.optionsViewForAxis_("x");
var o = A("valueFormatter");
r = o(p, A, z[0], w);
if (r !== "") {
r += ","
}
var v = [];
var j = w.numAxes();
for (u = 0; u < j; u++) {
v[u] = w.optionsViewForAxis_("y" + (u ? 1 + u : ""))
}
var k = w.getOption("labelsShowZeroValues");
C = w.getOption("labelsSeparateLines");
var B = w.getHighlightSeries();
for (u = 0; u < l.length; u++) {
var t = l[u];
if (t.yval === 0 && !k) {
continue
}
if (!Dygraph.isOK(t.canvasy)) {
continue
}
if (C) {
r += " "
}
var q = w.getPropertiesForSeries(t.name);
var n = v[q.axis - 1];
var y = n("valueFormatter");
var e = y(t.yval, n, t.name, w);
var h = (t.name == B) ? " class='highlight'" : "";
r += "" + t.name + ": " + e + ""
}
return r
};
d = function (s, h, r) {
var e = (/MSIE/.test(navigator.userAgent) && !window.opera);
if (e) {
return "—"
}
if (!s || s.length <= 1) {
return ''
}
var l, k, f, o;
var g = 0, q = 0;
var p = [];
var n;
for (l = 0; l <= s.length; l++) {
g += s[l % s.length]
}
n = Math.floor(r / (g - s[0]));
if (n > 1) {
for (l = 0; l < s.length; l++) {
p[l] = s[l] / r
}
q = p.length
} else {
n = 1;
for (l = 0; l < s.length; l++) {
p[l] = s[l] / g
}
q = p.length + 1
}
var m = "";
for (k = 0; k < n; k++) {
for (l = 0; l < q; l += 2) {
f = p[l % p.length];
if (l < s.length) {
o = p[(l + 1) % p.length]
} else {
o = 0
}
m += ''
}
}
return m
};
return c
})();
Dygraph.Plugins.RangeSelector = (function () {
var a = function () {
this.isIE_ = /MSIE/.test(navigator.userAgent) && !window.opera;
this.hasTouchInterface_ = typeof(TouchEvent) != "undefined";
this.isMobileDevice_ = /mobile|android/gi.test(navigator.appVersion);
this.interfaceCreated_ = false
};
a.prototype.toString = function () {
return "RangeSelector Plugin"
};
a.prototype.activate = function (b) {
this.dygraph_ = b;
this.isUsingExcanvas_ = b.isUsingExcanvas_;
if (this.getOption_("showRangeSelector")) {
this.createInterface_()
}
return {
layout: this.reserveSpace_,
predraw: this.renderStaticLayer_,
didDrawChart: this.renderInteractiveLayer_
}
};
a.prototype.destroy = function () {
this.bgcanvas_ = null;
this.fgcanvas_ = null;
this.leftZoomHandle_ = null;
this.rightZoomHandle_ = null;
this.iePanOverlay_ = null
};
a.prototype.getOption_ = function (b) {
return this.dygraph_.getOption(b)
};
a.prototype.setDefaultOption_ = function (b, c) {
return this.dygraph_.attrs_[b] = c
};
a.prototype.createInterface_ = function () {
this.createCanvases_();
if (this.isUsingExcanvas_) {
this.createIEPanOverlay_()
}
this.createZoomHandles_();
this.initInteraction_();
if (this.getOption_("animatedZooms")) {
this.dygraph_.warn("Animated zooms and range selector are not compatible; disabling animatedZooms.");
this.dygraph_.updateOptions({animatedZooms: false}, true)
}
this.interfaceCreated_ = true;
this.addToGraph_()
};
a.prototype.addToGraph_ = function () {
var b = this.graphDiv_ = this.dygraph_.graphDiv;
b.appendChild(this.bgcanvas_);
b.appendChild(this.fgcanvas_);
b.appendChild(this.leftZoomHandle_);
b.appendChild(this.rightZoomHandle_)
};
a.prototype.removeFromGraph_ = function () {
var b = this.graphDiv_;
b.removeChild(this.bgcanvas_);
b.removeChild(this.fgcanvas_);
b.removeChild(this.leftZoomHandle_);
b.removeChild(this.rightZoomHandle_);
this.graphDiv_ = null
};
a.prototype.reserveSpace_ = function (b) {
if (this.getOption_("showRangeSelector")) {
b.reserveSpaceBottom(this.getOption_("rangeSelectorHeight") + 4)
}
};
a.prototype.renderStaticLayer_ = function () {
if (!this.updateVisibility_()) {
return
}
this.resize_();
this.drawStaticLayer_()
};
a.prototype.renderInteractiveLayer_ = function () {
if (!this.updateVisibility_() || this.isChangingRange_) {
return
}
this.placeZoomHandles_();
this.drawInteractiveLayer_()
};
a.prototype.updateVisibility_ = function () {
var b = this.getOption_("showRangeSelector");
if (b) {
if (!this.interfaceCreated_) {
this.createInterface_()
} else {
if (!this.graphDiv_ || !this.graphDiv_.parentNode) {
this.addToGraph_()
}
}
} else {
if (this.graphDiv_) {
this.removeFromGraph_();
var c = this.dygraph_;
setTimeout(function () {
c.width_ = 0;
c.resize()
}, 1)
}
}
return b
};
a.prototype.resize_ = function () {
function d(e, f) {
e.style.top = f.y + "px";
e.style.left = f.x + "px";
e.width = f.w;
e.height = f.h;
e.style.width = e.width + "px";
e.style.height = e.height + "px"
}
var c = this.dygraph_.layout_.getPlotArea();
var b = 0;
if (this.getOption_("drawXAxis")) {
b = this.getOption_("xAxisHeight") || (this.getOption_("axisLabelFontSize") + 2 * this.getOption_("axisTickSize"))
}
this.canvasRect_ = {x: c.x, y: c.y + c.h + b + 4, w: c.w, h: this.getOption_("rangeSelectorHeight")};
d(this.bgcanvas_, this.canvasRect_);
d(this.fgcanvas_, this.canvasRect_)
};
a.prototype.createCanvases_ = function () {
this.bgcanvas_ = Dygraph.createCanvas();
this.bgcanvas_.className = "dygraph-rangesel-bgcanvas";
this.bgcanvas_.style.position = "absolute";
this.bgcanvas_.style.zIndex = 9;
this.bgcanvas_ctx_ = Dygraph.getContext(this.bgcanvas_);
this.fgcanvas_ = Dygraph.createCanvas();
this.fgcanvas_.className = "dygraph-rangesel-fgcanvas";
this.fgcanvas_.style.position = "absolute";
this.fgcanvas_.style.zIndex = 9;
this.fgcanvas_.style.cursor = "default";
this.fgcanvas_ctx_ = Dygraph.getContext(this.fgcanvas_)
};
a.prototype.createIEPanOverlay_ = function () {
this.iePanOverlay_ = document.createElement("div");
this.iePanOverlay_.style.position = "absolute";
this.iePanOverlay_.style.backgroundColor = "white";
this.iePanOverlay_.style.filter = "alpha(opacity=0)";
this.iePanOverlay_.style.display = "none";
this.iePanOverlay_.style.cursor = "move";
this.fgcanvas_.appendChild(this.iePanOverlay_)
};
a.prototype.createZoomHandles_ = function () {
var b = new Image();
b.className = "dygraph-rangesel-zoomhandle";
b.style.position = "absolute";
b.style.zIndex = 10;
b.style.visibility = "hidden";
b.style.cursor = "col-resize";
if (/MSIE 7/.test(navigator.userAgent)) {
b.width = 7;
b.height = 14;
b.style.backgroundColor = "white";
b.style.border = "1px solid #333333"
} else {
b.width = 9;
b.height = 16;
b.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAQCAYAAADESFVDAAAAAXNSR0IArs4c6QAAAAZiS0dEANAAzwDP4Z7KegAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB9sHGw0cMqdt1UwAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAaElEQVQoz+3SsRFAQBCF4Z9WJM8KCDVwownl6YXsTmCUsyKGkZzcl7zkz3YLkypgAnreFmDEpHkIwVOMfpdi9CEEN2nGpFdwD03yEqDtOgCaun7sqSTDH32I1pQA2Pb9sZecAxc5r3IAb21d6878xsAAAAAASUVORK5CYII="
}
if (this.isMobileDevice_) {
b.width *= 2;
b.height *= 2
}
this.leftZoomHandle_ = b;
this.rightZoomHandle_ = b.cloneNode(false)
};
a.prototype.initInteraction_ = function () {
var o = this;
var i = this.isIE_ ? document : window;
var u = 0;
var v = null;
var s = false;
var d = false;
var g = !this.isMobileDevice_ && !this.isUsingExcanvas_;
var k = new Dygraph.IFrameTarp();
var p, f, r, j, w, h, x, t, q, c, l;
var e, n, m;
p = function (C) {
var B = o.dygraph_.xAxisExtremes();
var z = (B[1] - B[0]) / o.canvasRect_.w;
var A = B[0] + (C.leftHandlePos - o.canvasRect_.x) * z;
var y = B[0] + (C.rightHandlePos - o.canvasRect_.x) * z;
return [A, y]
};
f = function (y) {
Dygraph.cancelEvent(y);
s = true;
u = y.clientX;
v = y.target ? y.target : y.srcElement;
if (y.type === "mousedown" || y.type === "dragstart") {
Dygraph.addEvent(i, "mousemove", r);
Dygraph.addEvent(i, "mouseup", j)
}
o.fgcanvas_.style.cursor = "col-resize";
k.cover();
return true
};
r = function (C) {
if (!s) {
return false
}
Dygraph.cancelEvent(C);
var z = C.clientX - u;
if (Math.abs(z) < 4) {
return true
}
u = C.clientX;
var B = o.getZoomHandleStatus_();
var y;
if (v == o.leftZoomHandle_) {
y = B.leftHandlePos + z;
y = Math.min(y, B.rightHandlePos - v.width - 3);
y = Math.max(y, o.canvasRect_.x)
} else {
y = B.rightHandlePos + z;
y = Math.min(y, o.canvasRect_.x + o.canvasRect_.w);
y = Math.max(y, B.leftHandlePos + v.width + 3)
}
var A = v.width / 2;
v.style.left = (y - A) + "px";
o.drawInteractiveLayer_();
if (g) {
w()
}
return true
};
j = function (y) {
if (!s) {
return false
}
s = false;
k.uncover();
Dygraph.removeEvent(i, "mousemove", r);
Dygraph.removeEvent(i, "mouseup", j);
o.fgcanvas_.style.cursor = "default";
if (!g) {
w()
}
return true
};
w = function () {
try {
var z = o.getZoomHandleStatus_();
o.isChangingRange_ = true;
if (!z.isZoomed) {
o.dygraph_.resetZoom()
} else {
var y = p(z);
o.dygraph_.doZoomXDates_(y[0], y[1])
}
} finally {
o.isChangingRange_ = false
}
};
h = function (A) {
if (o.isUsingExcanvas_) {
return A.srcElement == o.iePanOverlay_
} else {
var z = o.leftZoomHandle_.getBoundingClientRect();
var y = z.left + z.width / 2;
z = o.rightZoomHandle_.getBoundingClientRect();
var B = z.left + z.width / 2;
return (A.clientX > y && A.clientX < B)
}
};
x = function (y) {
if (!d && h(y) && o.getZoomHandleStatus_().isZoomed) {
Dygraph.cancelEvent(y);
d = true;
u = y.clientX;
if (y.type === "mousedown") {
Dygraph.addEvent(i, "mousemove", t);
Dygraph.addEvent(i, "mouseup", q)
}
return true
}
return false
};
t = function (C) {
if (!d) {
return false
}
Dygraph.cancelEvent(C);
var z = C.clientX - u;
if (Math.abs(z) < 4) {
return true
}
u = C.clientX;
var B = o.getZoomHandleStatus_();
var E = B.leftHandlePos;
var y = B.rightHandlePos;
var D = y - E;
if (E + z <= o.canvasRect_.x) {
E = o.canvasRect_.x;
y = E + D
} else {
if (y + z >= o.canvasRect_.x + o.canvasRect_.w) {
y = o.canvasRect_.x + o.canvasRect_.w;
E = y - D
} else {
E += z;
y += z
}
}
var A = o.leftZoomHandle_.width / 2;
o.leftZoomHandle_.style.left = (E - A) + "px";
o.rightZoomHandle_.style.left = (y - A) + "px";
o.drawInteractiveLayer_();
if (g) {
c()
}
return true
};
q = function (y) {
if (!d) {
return false
}
d = false;
Dygraph.removeEvent(i, "mousemove", t);
Dygraph.removeEvent(i, "mouseup", q);
if (!g) {
c()
}
return true
};
c = function () {
try {
o.isChangingRange_ = true;
o.dygraph_.dateWindow_ = p(o.getZoomHandleStatus_());
o.dygraph_.drawGraph_(false)
} finally {
o.isChangingRange_ = false
}
};
l = function (y) {
if (s || d) {
return
}
var z = h(y) ? "move" : "default";
if (z != o.fgcanvas_.style.cursor) {
o.fgcanvas_.style.cursor = z
}
};
e = function (y) {
if (y.type == "touchstart" && y.targetTouches.length == 1) {
if (f(y.targetTouches[0])) {
Dygraph.cancelEvent(y)
}
} else {
if (y.type == "touchmove" && y.targetTouches.length == 1) {
if (r(y.targetTouches[0])) {
Dygraph.cancelEvent(y)
}
} else {
j(y)
}
}
};
n = function (y) {
if (y.type == "touchstart" && y.targetTouches.length == 1) {
if (x(y.targetTouches[0])) {
Dygraph.cancelEvent(y)
}
} else {
if (y.type == "touchmove" && y.targetTouches.length == 1) {
if (t(y.targetTouches[0])) {
Dygraph.cancelEvent(y)
}
} else {
q(y)
}
}
};
m = function (B, A) {
var z = ["touchstart", "touchend", "touchmove", "touchcancel"];
for (var y = 0; y < z.length; y++) {
o.dygraph_.addAndTrackEvent(B, z[y], A)
}
};
this.setDefaultOption_("interactionModel", Dygraph.Interaction.dragIsPanInteractionModel);
this.setDefaultOption_("panEdgeFraction", 0.0001);
var b = window.opera ? "mousedown" : "dragstart";
this.dygraph_.addAndTrackEvent(this.leftZoomHandle_, b, f);
this.dygraph_.addAndTrackEvent(this.rightZoomHandle_, b, f);
if (this.isUsingExcanvas_) {
this.dygraph_.addAndTrackEvent(this.iePanOverlay_, "mousedown", x)
} else {
this.dygraph_.addAndTrackEvent(this.fgcanvas_, "mousedown", x);
this.dygraph_.addAndTrackEvent(this.fgcanvas_, "mousemove", l)
}
if (this.hasTouchInterface_) {
m(this.leftZoomHandle_, e);
m(this.rightZoomHandle_, e);
m(this.fgcanvas_, n)
}
};
a.prototype.drawStaticLayer_ = function () {
var b = this.bgcanvas_ctx_;
b.clearRect(0, 0, this.canvasRect_.w, this.canvasRect_.h);
try {
this.drawMiniPlot_()
} catch (c) {
Dygraph.warn(c)
}
var d = 0.5;
this.bgcanvas_ctx_.lineWidth = 1;
b.strokeStyle = "gray";
b.beginPath();
b.moveTo(d, d);
b.lineTo(d, this.canvasRect_.h - d);
b.lineTo(this.canvasRect_.w - d, this.canvasRect_.h - d);
b.lineTo(this.canvasRect_.w - d, d);
b.stroke()
};
a.prototype.drawMiniPlot_ = function () {
var f = this.getOption_("rangeSelectorPlotFillColor");
var r = this.getOption_("rangeSelectorPlotStrokeColor");
if (!f && !r) {
return
}
var j = this.getOption_("stepPlot");
var v = this.computeCombinedSeriesAndLimits_();
var q = v.yMax - v.yMin;
var p = this.bgcanvas_ctx_;
var n = 0.5;
var e = this.dygraph_.xAxisExtremes();
var o = Math.max(e[1] - e[0], 1e-30);
var g = (this.canvasRect_.w - n) / o;
var u = (this.canvasRect_.h - n) / q;
var t = this.canvasRect_.w - n;
var b = this.canvasRect_.h - n;
var d = null, c = null;
p.beginPath();
p.moveTo(n, b);
for (var s = 0; s < v.data.length; s++) {
var h = v.data[s];
var l = ((h[0] !== null) ? ((h[0] - e[0]) * g) : NaN);
var k = ((h[1] !== null) ? (b - (h[1] - v.yMin) * u) : NaN);
if (isFinite(l) && isFinite(k)) {
if (d === null) {
p.lineTo(l, b)
} else {
if (j) {
p.lineTo(l, c)
}
}
p.lineTo(l, k);
d = l;
c = k
} else {
if (d !== null) {
if (j) {
p.lineTo(l, c);
p.lineTo(l, b)
} else {
p.lineTo(d, b)
}
}
d = c = null
}
}
p.lineTo(t, b);
p.closePath();
if (f) {
var m = this.bgcanvas_ctx_.createLinearGradient(0, 0, 0, b);
m.addColorStop(0, "white");
m.addColorStop(1, f);
this.bgcanvas_ctx_.fillStyle = m;
p.fill()
}
if (r) {
this.bgcanvas_ctx_.strokeStyle = r;
this.bgcanvas_ctx_.lineWidth = 1.5;
p.stroke()
}
};
a.prototype.computeCombinedSeriesAndLimits_ = function () {
var v = this.dygraph_.rawData_;
var u = this.getOption_("logscale");
var q = [];
var d;
var h;
var m;
var t, s, r;
var e, g;
for (t = 0; t < v.length; t++) {
if (v[t].length > 1 && v[t][1] !== null) {
m = typeof v[t][1] != "number";
if (m) {
d = [];
h = [];
for (r = 0; r < v[t][1].length; r++) {
d.push(0);
h.push(0)
}
}
break
}
}
for (t = 0; t < v.length; t++) {
var l = v[t];
e = l[0];
if (m) {
for (r = 0; r < d.length; r++) {
d[r] = h[r] = 0
}
} else {
d = h = 0
}
for (s = 1; s < l.length; s++) {
if (this.dygraph_.visibility()[s - 1]) {
var n;
if (m) {
for (r = 0; r < d.length; r++) {
n = l[s][r];
if (n === null || isNaN(n)) {
continue
}
d[r] += n;
h[r]++
}
} else {
n = l[s];
if (n === null || isNaN(n)) {
continue
}
d += n;
h++
}
}
}
if (m) {
for (r = 0; r < d.length; r++) {
d[r] /= h[r]
}
g = d.slice(0)
} else {
g = d / h
}
q.push([e, g])
}
q = this.dygraph_.rollingAverage(q, this.dygraph_.rollPeriod_);
if (typeof q[0][1] != "number") {
for (t = 0; t < q.length; t++) {
g = q[t][1];
q[t][1] = g[0]
}
}
var b = Number.MAX_VALUE;
var c = -Number.MAX_VALUE;
for (t = 0; t < q.length; t++) {
g = q[t][1];
if (g !== null && isFinite(g) && (!u || g > 0)) {
b = Math.min(b, g);
c = Math.max(c, g)
}
}
var o = 0.25;
if (u) {
c = Dygraph.log10(c);
c += c * o;
b = Dygraph.log10(b);
for (t = 0; t < q.length; t++) {
q[t][1] = Dygraph.log10(q[t][1])
}
} else {
var f;
var p = c - b;
if (p <= Number.MIN_VALUE) {
f = c * o
} else {
f = p * o
}
c += f;
b -= f
}
return {data: q, yMin: b, yMax: c}
};
a.prototype.placeZoomHandles_ = function () {
var h = this.dygraph_.xAxisExtremes();
var b = this.dygraph_.xAxisRange();
var c = h[1] - h[0];
var j = Math.max(0, (b[0] - h[0]) / c);
var f = Math.max(0, (h[1] - b[1]) / c);
var i = this.canvasRect_.x + this.canvasRect_.w * j;
var e = this.canvasRect_.x + this.canvasRect_.w * (1 - f);
var d = Math.max(this.canvasRect_.y, this.canvasRect_.y + (this.canvasRect_.h - this.leftZoomHandle_.height) / 2);
var g = this.leftZoomHandle_.width / 2;
this.leftZoomHandle_.style.left = (i - g) + "px";
this.leftZoomHandle_.style.top = d + "px";
this.rightZoomHandle_.style.left = (e - g) + "px";
this.rightZoomHandle_.style.top = this.leftZoomHandle_.style.top;
this.leftZoomHandle_.style.visibility = "visible";
this.rightZoomHandle_.style.visibility = "visible"
};
a.prototype.drawInteractiveLayer_ = function () {
var c = this.fgcanvas_ctx_;
c.clearRect(0, 0, this.canvasRect_.w, this.canvasRect_.h);
var f = 1;
var e = this.canvasRect_.w - f;
var b = this.canvasRect_.h - f;
var h = this.getZoomHandleStatus_();
c.strokeStyle = "black";
if (!h.isZoomed) {
c.beginPath();
c.moveTo(f, f);
c.lineTo(f, b);
c.lineTo(e, b);
c.lineTo(e, f);
c.stroke();
if (this.iePanOverlay_) {
this.iePanOverlay_.style.display = "none"
}
} else {
var g = Math.max(f, h.leftHandlePos - this.canvasRect_.x);
var d = Math.min(e, h.rightHandlePos - this.canvasRect_.x);
c.fillStyle = "rgba(240, 240, 240, 0.6)";
c.fillRect(0, 0, g, this.canvasRect_.h);
c.fillRect(d, 0, this.canvasRect_.w - d, this.canvasRect_.h);
c.beginPath();
c.moveTo(f, f);
c.lineTo(g, f);
c.lineTo(g, b);
c.lineTo(d, b);
c.lineTo(d, f);
c.lineTo(e, f);
c.stroke();
if (this.isUsingExcanvas_) {
this.iePanOverlay_.style.width = (d - g) + "px";
this.iePanOverlay_.style.left = g + "px";
this.iePanOverlay_.style.height = b + "px";
this.iePanOverlay_.style.display = "inline"
}
}
};
a.prototype.getZoomHandleStatus_ = function () {
var c = this.leftZoomHandle_.width / 2;
var d = parseFloat(this.leftZoomHandle_.style.left) + c;
var b = parseFloat(this.rightZoomHandle_.style.left) + c;
return {
leftHandlePos: d,
rightHandlePos: b,
isZoomed: (d - 1 > this.canvasRect_.x || b + 1 < this.canvasRect_.x + this.canvasRect_.w)
}
};
return a
})();
Dygraph.PLUGINS.push(Dygraph.Plugins.Legend, Dygraph.Plugins.Axes, Dygraph.Plugins.RangeSelector, Dygraph.Plugins.ChartLabels, Dygraph.Plugins.Annotations, Dygraph.Plugins.Grid);
MintPy-1.6.2/src/mintpy/data/plate_boundary/ 0000775 0000000 0000000 00000000000 15032632755 0021000 5 ustar 00root root 0000000 0000000 MintPy-1.6.2/src/mintpy/data/plate_boundary/GSRM/ 0000775 0000000 0000000 00000000000 15032632755 0021550 5 ustar 00root root 0000000 0000000 MintPy-1.6.2/src/mintpy/data/plate_boundary/GSRM/plate_outlines.lola 0000664 0000000 0000000 00000600213 15032632755 0025452 0 ustar 00root root 0000000 0000000 > BG
177.54000 52.57690
176.71300 52.78910
175.66600 52.95460
174.46900 53.19500
173.11200 53.54800
171.78100 53.88690
171.13300 54.17160
170.47600 54.45270
169.78400 54.74340
169.08200 55.03010
168.37900 55.34140
167.66400 55.64870
166.82400 55.95870
165.97100 56.26290
165.24200 56.47950
164.50400 56.69180
165.02243 58.86533
165.30637 58.98111
165.63556 59.07279
165.96212 59.16996
166.12559 59.25483
166.28845 59.34078
166.42832 59.39761
166.57184 59.44492
166.73237 59.49625
166.88996 59.55555
167.03000 59.62433
167.17072 59.69202
167.51516 59.81287
167.86106 59.92961
168.01680 59.99634
169.02700 60.29320
169.57842 60.76857
170.18807 61.02790
170.86888 61.35786
171.54738 61.69301
172.23655 62.00294
172.94012 62.27851
173.66449 62.50024
174.40264 62.67192
175.16028 62.82626
175.91437 62.99686
176.62366 63.20524
177.33202 63.41765
178.80080 63.72583
-179.71230 63.93453
-178.19307 64.13019
-176.67431 64.33010
-175.15245 64.51713
-173.62594 64.66122
-172.09704 64.73963
-170.56652 64.78292
-167.47831 64.85630
-167.09300 64.25600
-165.97700 63.55770
-163.52500 62.84800
-162.33200 62.12770
-161.19500 61.39760
-160.50690 60.66270
-159.99400 59.91870
-159.66000 59.16640
-159.54900 58.50590
-158.77300 57.83610
-158.60500 56.38470
-157.21000 55.99040
-159.34400 55.70550
-160.12900 55.59080
-160.91000 55.47090
-161.66400 55.34640
-162.41300 55.21720
-163.17700 55.03000
-163.93400 54.83790
-164.66500 54.66830
-165.39000 54.49430
-166.10800 54.30270
-166.81900 54.10680
-167.99000 53.85070
-168.97200 53.59000
-169.37800 53.48220
-170.15900 53.28950
-170.89700 53.15610
-171.63400 53.02060
-172.48400 52.91930
-173.32800 52.81360
-174.11900 52.74630
-174.90700 52.67580
-175.62900 52.59470
-176.22300 52.43830
-177.08800 52.34600
-177.75800 52.33420
-178.48000 52.34030
-179.20200 52.34650
179.68800 52.35550
178.49800 52.46890
> AF
-0.03883 -54.67720
0.44318 -54.45120
0.96453 -54.83220
1.69481 -54.39900
2.35975 -54.03740
3.02542 -53.65070
3.36894 -53.83410
3.95638 -54.12670
4.41458 -54.43030
4.82661 -54.16160
5.08372 -54.30930
5.49469 -54.54290
6.18373 -54.11450
6.62540 -53.81420
7.23729 -54.10120
7.77235 -54.39600
8.28834 -54.03260
8.79876 -53.66800
9.42869 -53.23260
9.99306 -52.79230
10.54240 -53.06550
10.97480 -53.33200
11.70840 -52.78290
12.29890 -52.37500
12.89510 -51.96290
13.20420 -52.14100
13.78760 -52.47690
14.46330 -51.99710
15.11240 -52.30750
15.42800 -52.08360
15.82230 -51.78700
16.90720 -52.16930
17.80630 -52.46690
18.53740 -52.73430
18.71250 -52.55290
19.99380 -52.81670
21.25040 -52.90880
22.50420 -53.05120
23.07530 -53.09770
23.02140 -53.20040
23.88620 -53.30860
24.68510 -53.42150
24.87260 -53.34530
25.17970 -53.44410
25.64750 -53.41000
25.86140 -53.47990
25.98690 -53.58180
26.18090 -53.42880
26.33820 -53.06500
26.51290 -52.62010
26.71310 -52.37800
27.32210 -52.54720
27.37040 -52.67300
27.47950 -52.77080
28.11080 -52.90370
28.31220 -52.54000
28.40270 -52.27710
28.60540 -51.77160
28.96880 -51.13730
29.34310 -50.50700
29.71150 -49.93350
30.00600 -49.61080
30.36170 -49.21550
30.70460 -49.01060
31.00810 -48.58710
31.30650 -48.16270
31.58850 -47.68220
31.86540 -47.20110
32.12580 -46.99980
32.12520 -46.99750
32.66260 -46.19110
33.17060 -45.38180
33.67750 -44.56070
34.15680 -43.74670
34.63600 -42.93070
35.08980 -42.10320
35.52800 -41.25370
35.95500 -40.40260
36.37130 -39.55000
36.77740 -38.69590
37.17400 -37.84040
37.56150 -36.98370
36.14000 -25.99361
33.15086 -21.73694
33.28180 -19.68060
33.61310 -19.35030
33.94300 -19.01940
34.27160 -18.68790
34.48062 -18.30438
34.57710 -17.57258
34.57021 -16.83211
33.74395 -15.87664
32.00000 -10.00000
29.50000 -9.00000
28.42498 -6.56777
28.71750 -5.93082
28.72106 -5.18161
28.55333 -4.44671
28.36212 -3.73471
28.25067 -3.00724
28.29790 -2.29188
28.51352 -1.60824
28.87590 -0.97287
29.22138 -0.33016
29.46895 0.36381
29.79636 1.02096
30.21855 1.59849
30.61872 2.19104
30.85542 2.70705
30.47830 2.81209
30.47480 3.52370
30.47130 4.23531
31.00000 6.00000
35.95212 5.56120
36.30847 6.13448
36.61646 6.30883
36.94743 6.43849
37.26595 6.60208
37.55324 6.81611
37.80925 7.06368
38.06018 7.31675
38.32106 7.55821
38.58228 7.79928
38.83840 8.05837
39.07770 8.33310
39.17912 8.45580
39.28747 8.57224
39.35780 8.64318
39.41636 8.72387
39.47501 8.86174
39.52781 9.00216
39.59914 9.14366
39.67074 9.28520
39.77774 9.62364
39.81217 9.97759
39.82250 10.31092
39.76416 10.63411
39.69801 10.77913
39.65682 10.93240
39.64962 11.09595
39.64846 11.25977
39.64475 11.61844
39.64931 11.97706
39.68215 12.35952
39.75484 12.73656
39.84733 13.11403
39.92810 13.49409
39.97297 13.86680
39.98968 14.24191
39.92160 14.59129
39.78683 14.92574
39.66537 15.27892
39.55949 15.63704
39.67070 15.77160
40.17160 16.30400
40.25120 16.78510
40.33130 17.26620
39.98670 17.94940
39.58990 18.41930
39.29780 19.02980
38.82610 19.44750
38.39570 19.90750
38.07450 20.38910
37.97470 21.02130
37.82530 21.84340
37.53980 22.49450
37.04250 23.22590
36.57110 23.63920
36.40730 24.13270
36.24220 24.62600
36.06610 25.05530
35.88880 25.48440
35.54560 25.91910
35.19990 26.35300
34.87480 26.80780
33.00000 28.00000
32.50000 29.25000
30.50000 29.25000
30.50000 30.25000
32.00000 31.50000
31.99235 34.01461
31.66204 34.02687
31.33745 34.09755
30.66127 34.29495
29.96962 34.41301
29.61169 34.37947
29.26869 34.27139
28.97427 34.10474
28.71053 33.89226
28.59526 33.79547
28.46931 33.71350
28.33755 33.63993
28.23327 33.53289
28.16692 33.40865
28.08759 33.29221
27.95196 33.18398
27.79576 33.10746
27.45779 32.99702
27.12991 32.86210
26.99054 32.77007
26.85198 32.67638
26.68464 32.58114
26.51056 32.49882
26.15244 32.38664
25.77864 32.36409
25.44454 32.45063
25.13411 32.60474
24.98472 32.67982
24.82848 32.73897
24.65247 32.77084
24.47352 32.77811
24.31806 32.78670
24.16917 32.82902
24.02972 32.92929
23.89413 33.03775
23.24410 33.26300
22.55044 33.29028
22.22864 33.26915
21.90645 33.25740
21.55250 33.29082
21.20529 33.36749
21.04819 33.39472
20.88816 33.39371
20.73223 33.38555
20.57808 33.40497
20.51623 33.43127
20.46196 33.47092
20.41650 33.52872
20.37097 33.58566
20.25028 33.66264
20.11756 33.71873
19.98469 33.78279
19.86841 33.87296
19.76017 34.00390
19.64660 34.12993
19.38054 34.26245
19.13030 34.01670
18.43480 33.38290
17.74930 32.74520
17.07370 32.10390
16.72314 31.72656
16.76213 31.62320
16.84101 31.52081
16.94220 31.43860
17.02073 31.33335
17.04332 31.20210
17.03551 31.05092
17.02007 30.90029
17.00274 30.87136
16.96123 30.87178
16.91915 30.87182
16.87714 30.87368
16.79482 30.88258
16.71343 30.89782
16.37848 31.01441
16.05834 31.16960
15.75040 30.81070
14.81140 31.30670
13.86250 31.79580
12.90350 32.27780
11.93440 32.75240
10.95500 33.21950
9.96522 33.67890
8.96486 34.13030
8.80201 34.13944
8.45193 34.18400
8.11655 34.29174
7.80794 34.45362
7.49902 34.61501
7.19389 34.73941
6.88934 34.86622
6.58618 35.01232
6.28624 35.16492
5.62874 35.50769
4.94866 35.80133
4.60910 35.90330
4.26761 35.99900
4.09675 36.05564
3.92983 36.12294
3.78817 36.19223
3.64211 36.25029
3.32027 36.24147
3.01196 36.13223
2.72579 36.00357
2.44944 35.85503
2.16195 35.70207
1.85724 35.58750
1.50209 35.49860
1.14706 35.40909
-0.24119 34.97147
-1.58975 34.42515
-1.71301 34.07050
-1.87336 33.62647
-2.07071 33.14543
-2.34206 32.68906
-2.51474 32.28204
-2.78609 31.73933
-3.04511 31.25829
-3.43981 30.85126
-3.73583 30.53057
-4.20453 30.24689
-4.53756 30.08654
-5.00626 30.13588
-5.31461 30.43190
-5.58597 30.87593
-5.80798 31.41864
-5.95599 31.89967
-6.12867 32.36838
-6.36302 32.89875
-6.54804 33.42912
-6.70838 33.84848
-6.90573 34.36652
-7.14871 34.75218
-7.81502 34.69458
-8.48087 34.65129
-8.65703 34.67791
-8.83106 34.71640
-8.99338 34.75968
-9.14722 34.82513
-9.39874 35.08392
-9.57064 35.40661
-9.60503 35.47292
-9.66921 35.49025
-9.73798 35.47071
-9.80483 35.44499
-9.95917 35.37876
-10.11220 35.30937
-10.27691 35.23595
-10.44758 35.17862
-10.61059 35.15765
-10.77542 35.14972
-11.47314 35.14465
-12.15969 35.26233
-12.85629 35.50147
-13.56770 35.68529
-14.31502 35.61864
-15.01792 35.33869
-15.36889 35.18496
-15.73325 35.06760
-16.08251 35.01677
-16.43569 35.02017
-17.13446 35.20349
-17.77737 35.54115
-18.37850 35.98728
-18.94257 36.48254
-19.54107 36.91385
-19.68230 37.02510
-20.24030 36.95430
-20.79730 36.88090
-21.50720 36.81970
-22.21600 36.75430
-22.89330 36.70200
-23.56970 36.64590
-24.04560 36.75480
-24.14610 36.78850
-24.25540 36.78100
-24.31110 36.79250
-24.38460 36.86330
-24.43370 36.91050
-24.50020 36.97070
-24.55410 37.01720
-24.63450 37.09460
-24.68050 37.12670
-24.74950 37.21740
-24.73790 37.27330
-24.70220 37.35190
-24.66690 37.41100
-24.73320 37.46730
-24.77480 37.50010
-24.81640 37.53280
-24.84510 37.55190
-24.89150 37.58390
-24.93150 37.60910
-24.98350 37.64410
-25.10130 37.64630
-25.26710 37.76920
-25.35470 37.66330
-25.42650 37.71850
-25.46380 37.75170
-25.53840 37.81810
-25.63320 37.72250
-25.69840 37.79020
-25.73410 37.81590
-25.80810 37.87830
-25.91620 37.83860
-26.04320 37.93550
-26.07520 37.96550
-26.17140 38.03600
-26.30210 38.04680
-26.37870 38.11640
-26.41660 38.14930
-26.49430 38.22250
-26.53230 38.25540
-26.61410 38.32400
-26.64740 38.35760
-26.71800 38.42020
-26.82990 38.27820
-26.90060 38.36010
-26.94080 38.40030
-27.00680 38.46350
-27.02890 38.49110
-27.08950 38.57060
-27.12900 38.60700
-27.17430 38.66580
-27.20330 38.69990
-27.23940 38.77960
-27.48440 38.78240
-27.55880 38.83630
-27.60916 38.81109
-27.89703 38.76993
-28.22441 38.72235
-28.57244 38.67416
-28.91915 38.61721
-29.57800 38.48523
-30.23688 38.35471
-30.43010 38.38830
-30.60550 38.40250
-31.07060 37.68020
-31.37130 37.70490
-31.51640 37.28230
-32.28260 37.39150
-32.39460 37.13690
-32.64560 37.17630
-32.70770 37.03330
-32.94310 37.06540
-33.00490 36.91590
-33.22460 36.94080
-33.31350 36.69100
-33.59470 36.74220
-33.77170 36.18500
-33.98160 36.22120
-34.05680 36.07130
-34.14240 36.07940
-34.33540 35.61600
-34.45950 35.62460
-34.74640 35.01020
-35.55840 35.14770
-36.37310 35.27980
-36.62310 34.69290
-36.78460 34.71220
-36.86180 34.55420
-37.04610 34.56690
-37.24460 34.12380
-37.33640 34.13620
-37.53280 33.70520
-37.67760 33.73620
-37.79750 33.50120
-38.59720 33.63700
-39.39930 33.76760
-39.58600 33.06730
-39.69990 33.08410
-40.12930 32.44400
-40.55260 31.80250
-40.71000 31.81730
-41.18360 31.19410
-41.43040 31.23700
-41.78570 30.60560
-42.13640 29.97330
-42.72860 30.06970
-43.03730 29.47140
-43.08820 29.46910
-43.48280 28.80210
-43.56320 28.81080
-43.94230 28.10490
-44.02170 28.10690
-44.20310 27.67130
-44.38310 27.23550
-44.50590 27.25380
-44.68700 26.76680
-44.86660 26.27960
-44.81630 26.27000
-44.89890 26.05540
-45.09170 26.08140
-45.29600 25.63670
-45.49880 25.19180
-45.79150 25.25420
-46.11880 24.59040
-46.19610 24.59740
-46.47580 23.91740
-45.69930 23.78360
-44.92450 23.64590
-45.02390 22.96320
-45.06580 22.97310
-45.15740 22.38980
-45.24830 21.80640
-45.38530 21.82230
-45.51520 21.24650
-45.41870 21.22170
-45.55700 20.59580
-45.77370 20.61800
-45.93980 19.80220
-46.00150 19.82270
-46.09320 19.37730
-46.18440 18.93190
-46.22430 18.93510
-46.31820 18.42150
-46.39070 18.42200
-46.52020 17.58830
-46.40720 17.56630
-46.49820 17.08650
-46.58900 16.60700
-46.52900 16.58700
-46.64800 16.01900
-46.76600 15.45100
-45.94700 15.36000
-45.13000 15.26700
-45.13600 14.64700
-45.14200 14.02600
-45.06140 13.99170
-45.04930 13.33580
-45.03730 12.67990
-44.26200 12.62560
-44.27750 12.10080
-43.88450 12.08540
-43.90260 11.50620
-43.92060 10.92700
-43.44820 10.90550
-42.97580 10.88320
-42.50350 10.86020
-42.03130 10.83650
-41.55920 10.81210
-41.08710 10.78690
-41.08290 9.97939
-40.86150 9.97269
-40.86480 9.38937
-40.64020 9.37285
-40.65220 8.84060
-40.11960 8.81526
-40.14080 8.21537
-39.66080 8.19726
-39.18080 8.17858
-38.70090 8.15934
-38.22100 8.13953
-38.20650 7.70334
-37.53560 7.67935
-36.86480 7.65432
-36.85140 7.40089
-36.05770 7.36342
-36.04690 7.02322
-35.36650 6.93495
-35.36290 6.61393
-34.49370 6.61577
-33.62440 6.61760
-33.62030 6.10421
-33.51360 6.07619
-33.50680 5.64946
-32.97800 5.64716
-32.91980 4.80377
-32.86170 3.96038
-32.38700 3.98590
-31.91220 4.01114
-31.43740 4.03611
-30.96250 4.06081
-30.88680 3.25477
-30.81130 2.44874
-30.73580 1.64269
-30.02690 1.60709
-29.92030 0.79740
-29.20960 0.84891
-28.34650 0.95303
-27.83090 1.00748
-27.31530 1.06184
-26.47400 1.15918
-26.28870 0.49814
-25.65910 0.55617
-25.02940 0.61413
-24.82060 -0.24459
-24.61170 -1.10331
-24.05070 -1.03387
-23.48970 -0.96432
-22.93550 -0.88040
-22.38130 -0.79639
-21.54370 -0.68022
-21.01680 -0.58849
-20.48990 -0.49671
-19.67470 -0.33338
-18.84970 -0.17611
-18.36930 -0.07275
-17.88890 0.03061
-17.32290 0.14961
-16.75690 0.26859
-16.49820 0.29895
-16.25220 -0.55620
-16.03720 -0.51963
-15.84060 -1.14320
-15.56520 -1.07324
-15.41030 -1.49342
-14.65940 -1.30094
-13.90870 -1.10824
-13.15800 -0.91535
-12.92980 -1.50722
-12.70140 -2.09908
-12.16410 -1.94545
-11.99890 -2.40025
-11.83360 -2.85504
-12.02930 -3.01345
-11.89750 -3.49273
-11.76550 -3.97199
-12.09680 -4.10303
-12.03860 -4.58743
-12.14450 -4.60882
-12.01850 -5.02557
-11.60440 -4.94231
-11.51610 -5.41504
-11.16690 -5.37706
-11.02220 -5.93021
-11.26710 -6.02023
-11.18050 -6.75542
-11.99330 -6.96082
-12.80680 -7.16482
-13.62100 -7.36740
-13.48940 -7.88908
-13.35740 -8.41071
-13.19110 -8.37401
-13.02300 -9.22523
-13.24820 -9.27648
-13.16630 -9.79444
-13.31510 -9.82468
-13.17360 -10.62310
-13.03130 -11.42150
-13.52430 -11.53870
-14.01770 -11.65510
-14.51150 -11.77060
-15.00580 -11.88530
-14.90770 -12.33900
-14.86110 -12.31960
-14.79100 -12.65620
-14.55010 -12.57700
-14.41020 -13.21810
-14.59960 -13.26550
-14.53910 -13.73660
-14.47840 -14.20770
-13.64280 -14.03550
-13.43520 -14.84940
-13.22610 -15.66320
-13.38350 -15.68820
-13.23860 -16.21170
-13.77020 -16.32290
-14.30240 -16.43270
-14.23810 -16.76450
-14.36880 -16.77700
-14.22420 -17.38590
-14.07860 -17.99460
-13.51890 -17.89300
-12.95980 -17.78980
-12.85980 -18.28720
-12.75930 -18.78450
-12.47720 -18.74650
-12.37030 -19.34090
-12.26260 -19.93530
-11.94460 -19.82480
-11.85220 -20.27840
-11.97080 -20.29910
-11.76320 -21.17590
-12.00660 -21.20910
-11.84950 -21.73510
-11.93590 -21.75220
-11.81920 -22.15340
-12.36430 -22.26710
-12.91020 -22.37900
-12.85110 -22.62980
-13.33980 -22.73020
-13.82930 -22.82920
-13.66370 -23.54420
-13.57030 -23.51430
-13.42590 -24.14580
-13.28010 -24.77710
-13.81060 -24.88740
-13.66320 -25.64800
-14.04850 -25.73760
-13.81560 -26.58560
-13.68960 -26.56440
-13.48230 -27.44290
-13.27160 -28.32100
-12.74560 -28.21330
-12.53260 -28.94090
-13.26240 -29.09800
-13.99020 -29.25100
-13.82010 -29.85150
-13.71590 -29.82800
-13.54280 -30.49130
-13.36660 -31.15670
-13.49880 -31.17910
-13.37140 -31.66120
-13.24530 -32.14320
-13.88300 -32.27450
-14.52290 -32.40020
-14.44610 -32.89760
-14.36680 -33.49890
-14.70180 -33.56910
-14.51510 -34.04340
-15.27410 -34.23760
-15.08340 -34.68980
-15.26590 -34.77020
-15.10000 -35.18240
-16.02740 -35.34310
-16.96190 -35.49940
-17.70320 -35.66330
-17.41910 -36.06840
-17.08470 -36.47240
-17.44040 -36.56230
-17.33310 -36.94360
-17.23350 -37.37440
-17.53310 -37.47240
-17.38780 -38.02510
-17.05050 -38.44670
-16.79850 -38.40120
-16.36100 -38.55840
-16.04380 -38.88340
-15.96510 -39.35160
-15.92240 -39.68070
-16.41460 -39.79000
-16.46980 -40.27290
-16.86740 -40.36630
-16.81660 -40.78970
-16.74360 -41.17630
-16.67800 -41.51910
-16.33160 -41.80650
-16.21460 -42.33770
-16.42990 -42.86770
-16.32960 -43.38700
-16.24450 -43.68350
-16.08560 -44.13190
-15.92420 -44.58000
-15.76030 -45.02790
-15.59390 -45.47560
-14.89400 -45.37140
-14.71550 -45.89850
-13.81000 -45.79720
-13.57150 -46.68780
-13.32510 -47.57780
-12.61020 -47.47140
-11.89820 -47.36050
-11.18920 -47.24520
-10.48340 -47.12560
-10.29580 -47.64870
-10.10450 -48.17150
-9.90926 -48.69390
-9.70992 -49.21600
-8.92248 -49.09120
-8.13908 -48.96100
-8.02211 -49.28260
-7.96086 -49.27020
-7.63767 -50.05870
-7.43284 -50.00130
-7.15851 -50.60960
-6.15983 -50.41710
-5.16942 -50.21610
-4.94334 -50.67490
-4.71279 -51.13330
-4.47762 -51.59120
-4.23767 -52.04860
-3.95559 -51.97880
-3.44688 -52.76400
-2.91952 -53.54690
-2.37231 -54.32740
-1.38220 -54.05330
-0.91465 -54.45350
-0.43790 -54.85180
> AM
137.84800 38.48460
137.77400 38.98160
137.84500 39.40430
138.08500 39.65940
138.35200 39.83240
138.65500 40.07220
138.65500 40.47440
138.75600 40.78230
138.47500 41.10300
138.48900 41.48180
138.74300 41.76930
138.76122 42.54273
138.75000 44.70000
140.39962 46.58412
141.46486 46.58192
141.17800 47.39230
142.02300 48.05120
142.00000 54.00000
141.27800 54.07420
140.14500 54.10280
139.21100 54.33280
137.91800 54.58830
136.61000 54.82990
135.13800 55.06020
133.65000 55.27260
132.67400 55.49130
131.68800 55.70220
130.74700 55.86110
129.79800 56.01270
128.39300 56.40150
126.96000 56.77410
125.49900 57.12990
124.57300 57.17810
123.64500 57.21940
122.71500 57.25380
121.78400 57.28140
120.85100 57.30210
119.91800 57.31590
119.02100 57.15090
118.13300 56.97960
117.25300 56.80210
116.38200 56.61840
115.89992 56.37775
115.37368 56.25436
114.85332 56.10624
114.33961 56.01259
113.81971 55.95928
113.28272 55.89352
112.75500 55.77573
112.24455 55.58356
111.75908 55.33409
111.13791 54.97024
110.57244 54.52809
110.33903 54.27696
110.11660 54.01609
109.87143 53.77362
109.58286 53.58470
108.90629 53.31160
108.21534 53.07343
106.82307 52.52525
107.52392 52.78690
106.82307 52.52525
106.68443 52.48897
106.54579 52.45272
106.36200 52.43050
105.70500 52.09940
105.05800 51.76480
104.42000 51.42670
104.90400 50.78600
105.37500 50.14330
105.58200 49.29210
105.78100 48.44060
105.91600 47.91020
106.04800 47.37970
106.17700 46.84900
106.30400 46.31820
106.46000 45.87480
106.61400 45.43110
106.76500 44.98730
106.91400 44.54320
107.06100 44.09900
119.00000 45.50000
122.73200 42.18780
123.51000 41.53020
124.27200 40.86750
125.01900 40.19990
125.19900 39.74150
125.37600 39.28290
125.55100 38.82400
125.72300 38.36480
125.91400 37.54130
126.48220 37.43805
127.63074 37.33364
128.93590 37.20312
130.31938 37.12481
131.52013 37.04650
133.11243 37.04650
134.67863 36.99429
136.11431 37.15091
> AN
7.23729 -54.10120
6.62540 -53.81420
6.18373 -54.11450
5.49469 -54.54290
5.08372 -54.30930
4.82661 -54.16160
4.41458 -54.43030
3.95638 -54.12670
3.36894 -53.83410
3.02542 -53.65070
2.35975 -54.03740
1.69481 -54.39900
0.96453 -54.83220
0.44318 -54.45120
-0.03883 -54.67720
-0.43790 -54.85180
-1.03898 -55.01900
-1.60588 -55.12930
-1.61369 -55.65290
-2.07998 -55.65680
-2.89625 -55.70720
-3.72024 -55.73990
-4.05601 -55.76940
-4.69061 -55.80720
-4.67546 -56.21020
-4.69342 -56.59160
-5.44832 -56.62700
-6.05679 -56.67210
-6.09431 -56.98230
-6.13025 -57.24020
-6.53815 -57.27000
-6.99917 -57.31760
-7.01278 -57.61720
-7.00902 -57.86940
-7.52477 -57.92040
-8.60685 -57.98880
-9.88532 -58.09150
-11.18970 -58.15770
-12.64890 -58.24060
-13.95430 -58.31730
-15.06890 -58.39040
-15.97150 -58.43880
-16.00470 -58.45930
-16.22580 -58.76720
-16.41000 -59.09840
-16.91690 -59.09820
-17.66700 -59.12890
-18.06000 -59.15260
-18.12330 -59.50930
-18.43250 -59.54230
-18.54720 -59.93760
-18.64640 -60.25000
-19.37050 -60.28910
-19.58120 -60.81080
-20.65100 -60.78170
-21.71860 -60.74410
-22.91370 -60.72320
-24.10690 -60.69170
-25.09350 -60.54500
-26.07090 -60.39100
-26.88950 -60.50600
-27.69670 -60.61710
-28.74330 -60.60100
-29.73820 -60.57530
-31.01390 -60.51180
-32.36700 -60.40890
-33.44640 -60.70090
-34.82520 -60.98950
-36.41810 -61.39200
-37.56050 -61.24330
-39.09300 -61.01800
-39.82700 -60.63400
-41.21360 -60.97500
-42.06740 -60.80100
-43.15090 -60.67610
-44.22590 -60.57250
-45.60340 -60.49150
-46.96320 -60.35980
-48.25070 -60.36840
-49.59940 -60.44360
-50.88710 -60.69360
-51.11940 -60.87250
-52.06810 -61.10270
-53.12210 -61.23660
-54.30070 -61.51020
-55.43590 -61.68680
-56.30560 -62.06270
-57.38960 -62.30380
-58.61430 -62.55330
-60.11800 -62.94520
-61.75010 -63.29280
-62.41980 -63.00130
-63.29160 -62.82470
-63.96930 -62.42240
-63.10530 -62.11000
-62.20290 -61.84120
-61.33230 -61.54310
-60.65020 -61.36320
-59.83600 -61.17680
-58.89060 -61.08180
-58.13080 -60.96150
-57.49380 -60.85460
-56.92500 -60.56470
-58.22300 -59.99930
-58.96980 -59.72850
-59.70450 -59.45350
-61.03990 -59.01050
-62.57140 -58.60290
-63.57070 -58.35920
-64.61700 -57.95860
-65.86720 -57.73630
-67.10180 -57.50190
-68.09720 -57.07170
-69.25610 -56.85220
-70.40110 -56.62200
-71.54810 -56.25520
-72.27720 -55.96240
-72.99520 -55.66540
-73.47990 -55.35900
-74.12020 -55.00370
-74.74920 -54.64510
-75.23890 -54.29410
-75.72030 -53.94120
-76.01970 -53.43520
-76.31210 -52.92850
-76.48330 -52.06840
-76.62570 -51.37750
-76.75650 -50.72890
-76.98980 -49.84460
-77.02400 -49.19230
-76.92550 -48.50650
-76.64970 -47.87460
-76.32100 -47.47770
-75.99720 -47.07990
-75.95810 -46.42200
-76.00620 -45.65850
-76.67460 -45.64270
-77.66070 -45.76050
-77.76400 -45.58850
-77.99020 -45.09160
-78.20650 -44.41110
-78.89330 -44.54490
-79.58580 -44.66550
-80.28110 -44.78190
-81.10650 -44.87600
-81.93460 -44.96410
-82.13770 -44.40400
-82.35070 -43.63900
-82.50890 -42.86070
-83.44750 -42.98150
-83.45380 -42.87300
-83.60370 -42.22250
-83.71620 -41.67370
-83.82690 -41.12470
-84.48700 -41.19090
-85.14840 -41.25330
-86.24010 -41.39250
-87.33640 -41.52130
-87.41710 -41.27290
-88.44670 -41.31870
-89.24960 -41.37810
-90.05400 -41.43190
-90.08760 -41.05850
-90.73910 -41.08230
-91.39100 -41.10250
-91.47560 -40.73190
-91.51220 -40.28240
-91.54830 -39.83290
-91.60350 -39.34930
-91.65790 -38.86560
-92.33970 -38.91840
-93.02250 -38.96730
-93.07480 -38.42940
-93.99630 -38.48230
-94.09310 -37.71700
-94.12980 -37.00060
-94.90950 -36.98510
-95.68890 -36.96460
-96.55150 -36.92090
-97.41310 -36.87100
-97.40170 -36.29360
-98.41670 -36.19280
-99.53180 -36.13320
-100.64500 -36.06320
-101.28600 -35.99700
-101.92600 -35.92740
-102.56500 -35.85440
-103.20200 -35.77810
-103.99800 -35.69440
-104.79300 -35.60550
-105.39100 -35.52360
-105.98800 -35.43880
-106.66600 -35.39350
-107.34300 -35.34450
-108.07100 -35.24040
-108.79700 -35.13190
-109.25900 -34.54460
-109.69100 -34.60920
-109.91900 -34.70190
-110.14100 -34.81710
-110.32600 -34.94600
-110.52700 -35.06130
-110.82700 -35.09080
-110.87700 -35.31910
-110.89500 -35.79670
-110.57900 -35.83010
-110.71500 -36.21860
-110.73900 -36.35780
-110.47100 -36.41020
-110.66800 -37.04230
-110.86900 -37.67410
-111.06700 -38.27600
-111.26800 -38.87760
-111.27000 -38.97850
-110.39100 -38.98580
-110.53300 -39.57490
-110.67700 -40.16380
-110.75400 -40.75970
-110.83200 -41.35550
-110.95400 -42.24870
-111.34900 -42.20040
-111.53800 -42.68330
-111.73000 -43.16590
-111.97100 -43.77380
-112.21600 -44.38110
-112.38100 -44.93780
-112.55000 -45.49420
-112.67500 -45.83270
-112.42600 -45.85440
-112.68500 -46.53850
-112.95000 -47.22210
-113.13100 -47.77330
-113.31500 -48.32420
-113.52800 -48.84100
-113.74500 -49.35740
-113.87500 -49.84890
-114.55600 -49.72100
-115.23300 -49.58920
-116.38800 -49.36750
-116.80200 -49.89340
-117.22500 -50.41780
-117.52200 -50.87470
-117.82400 -51.33090
-118.12000 -51.77180
-118.42200 -52.21200
-118.87500 -52.75240
-118.97700 -52.89740
-117.66100 -53.12410
-118.03700 -53.69080
-118.31300 -54.35030
-118.58100 -54.81850
-119.68500 -54.64160
-120.66300 -54.40980
-121.22800 -55.21890
-121.63500 -55.83210
-121.86200 -56.02620
-122.65500 -55.87310
-123.44200 -55.71500
-124.26200 -55.58730
-125.07700 -55.45410
-126.19700 -55.13820
-126.80000 -55.06410
-127.23100 -55.56540
-128.62400 -55.32150
-129.34500 -55.12860
-130.05900 -54.93140
-131.37500 -54.62290
-132.12600 -54.43230
-132.87000 -54.23710
-134.20500 -53.88710
-135.30700 -53.64300
-136.18000 -53.39570
-136.59000 -53.90670
-137.52200 -53.68780
-137.89000 -53.56790
-138.33800 -54.14100
-138.79900 -54.71230
-139.25300 -55.25090
-139.57800 -55.61460
-139.19100 -55.72490
-139.54500 -56.26780
-140.04100 -56.77220
-140.32500 -57.05280
-141.21100 -56.83920
-142.08600 -56.61930
-143.32400 -56.26250
-144.48200 -55.91030
-144.85700 -55.78420
-145.41200 -56.22770
-145.97900 -56.66860
-146.68100 -57.30760
-147.16700 -57.63790
-147.69200 -57.55470
-148.27600 -58.13000
-149.26400 -58.82210
-149.80900 -59.31410
-150.38200 -59.71760
-151.32900 -59.46940
-152.11900 -60.15750
-152.94300 -60.84070
-153.66100 -61.39920
-154.18100 -61.83610
-154.32400 -61.77620
-155.25400 -62.43270
-156.02200 -62.95250
-156.71700 -63.32400
-157.60100 -63.07000
-158.39400 -62.78850
-158.70300 -63.00440
-159.88800 -62.59540
-160.43000 -62.92330
-161.33800 -62.61440
-162.06100 -62.39360
-163.00100 -62.96750
-163.92100 -63.46670
-165.14900 -63.00700
-166.19900 -62.60560
-166.60800 -62.49000
-167.51300 -63.10600
-168.37900 -63.73030
-169.10900 -64.24480
-169.83900 -64.76370
-170.04300 -64.85850
-171.30000 -64.35640
-172.51700 -64.97830
-173.70900 -65.50610
-174.41800 -65.83520
-175.07000 -65.50500
-175.72900 -65.18250
-177.07200 -65.60690
-177.92600 -65.86230
-178.79300 -66.16320
-179.19700 -65.98590
179.96300 -65.73850
179.38100 -65.47730
178.75900 -65.27400
178.24000 -65.07910
177.88900 -64.97490
177.33800 -64.73620
176.81900 -64.50600
176.54900 -64.41010
176.06300 -64.18780
175.58200 -63.98400
175.16200 -64.17410
174.81400 -64.31490
174.24200 -64.50790
173.63100 -64.73790
172.52000 -64.25610
172.16400 -64.09740
171.64000 -63.80720
171.00900 -63.44730
170.44100 -63.14880
170.06800 -62.97240
169.60500 -62.67620
169.23800 -62.44610
168.70800 -62.63210
168.27700 -62.77320
167.55000 -62.97120
166.85800 -63.22060
166.62000 -63.08690
165.96900 -62.66760
165.65300 -62.47270
165.10300 -62.07720
164.76800 -62.17720
164.27500 -62.32190
163.77300 -62.47460
163.20200 -62.65990
162.57900 -62.21280
161.97500 -61.76300
161.22800 -61.45670
160.86500 -61.55860
159.44000 -62.02590
157.97000 -62.47810
156.45700 -62.91430
155.70100 -62.17380
154.98100 -61.42940
154.29400 -60.68130
153.63900 -59.92990
152.47300 -60.17640
151.29000 -60.41260
151.00800 -59.94420
150.73300 -59.47530
150.00600 -59.57040
149.65200 -58.99880
149.39800 -58.55180
149.15000 -58.10440
148.80600 -57.43580
148.07600 -57.52710
147.90200 -57.56620
147.72100 -57.08840
147.54500 -56.61040
147.37300 -56.13210
147.20600 -55.65360
147.04300 -55.17490
146.88100 -54.69530
145.40100 -54.75550
144.28200 -54.79850
143.77800 -54.23430
142.25000 -54.21490
141.45100 -54.05280
140.65900 -53.88540
140.58400 -53.50440
140.47800 -52.75020
140.40000 -52.27430
140.38581 -52.17681
140.32300 -51.79830
139.81300 -51.83760
139.73300 -51.17390
139.64500 -50.27940
139.11000 -50.25580
138.40100 -50.23110
137.70000 -50.23360
136.94600 -50.22040
136.22600 -50.24760
135.24600 -50.20930
135.02600 -50.38420
134.24500 -50.34750
133.46500 -50.30550
132.26100 -50.22280
131.51500 -50.22220
131.25600 -50.60370
130.56900 -50.52490
129.41200 -50.34800
128.31200 -50.15920
127.14300 -49.97610
127.19600 -49.64290
127.24300 -49.29390
127.31300 -48.76390
126.86100 -48.69770
126.43400 -48.62970
126.26400 -49.04430
126.07400 -49.40140
125.89600 -49.71710
125.26200 -49.59830
125.12500 -49.35810
124.99200 -49.15280
124.60700 -48.98350
124.21300 -48.84760
124.00700 -48.90580
123.77100 -49.12160
123.32800 -49.58470
123.01300 -49.54240
122.79700 -49.72860
122.55300 -49.81160
122.22400 -49.84620
121.86600 -49.73550
121.43700 -49.62020
121.55500 -49.00560
120.84200 -48.88960
120.51600 -49.52430
120.27300 -50.03600
119.36600 -49.93840
118.54700 -49.80170
118.19400 -49.86480
117.52300 -49.61990
116.63500 -49.27090
116.25600 -49.54040
115.98800 -49.85170
115.50000 -49.97430
114.36200 -49.87780
114.02400 -50.38770
112.96700 -50.20040
111.66600 -50.08380
111.36300 -49.92970
111.12900 -49.80040
110.86800 -49.82890
110.47200 -49.77900
109.35100 -49.52350
108.24000 -49.25870
108.28500 -49.18230
107.48600 -49.01460
106.69200 -48.84140
106.55400 -49.10090
105.89800 -48.93350
105.24700 -48.76240
104.60100 -48.58770
103.95900 -48.40930
103.32100 -48.22750
102.68800 -48.04210
102.06000 -47.85330
101.43600 -47.66100
100.81700 -47.46540
100.20200 -47.26650
99.62430 -47.97810
98.97940 -47.74390
98.34040 -47.50610
97.70720 -47.26480
97.07970 -47.02000
96.45800 -46.77180
95.84200 -46.52030
96.27380 -45.99630
96.69750 -45.47070
95.80640 -45.14140
94.92570 -44.80530
95.04050 -44.61950
94.47020 -44.38970
93.90440 -44.15710
93.34310 -43.92170
92.78620 -43.68360
92.23370 -43.44280
91.68570 -43.19940
91.14200 -42.95340
90.60270 -42.70490
90.06770 -42.45380
89.53700 -42.20020
89.01060 -41.94420
88.48840 -41.68590
88.05990 -41.99740
87.50230 -41.71050
86.94970 -41.42100
86.40200 -41.12880
85.85920 -40.83410
85.46650 -41.18020
85.06970 -41.52490
84.66860 -41.86820
84.26310 -42.21010
83.85330 -42.55060
83.43900 -42.88960
82.58770 -42.30910
81.75200 -41.72250
80.93150 -41.12990
80.46350 -41.51190
79.99000 -41.89190
79.31910 -41.38400
78.65860 -40.87220
78.48370 -40.86640
77.82450 -40.32600
78.42540 -39.90490
78.00240 -39.53850
78.38390 -39.26200
78.07310 -39.00490
78.52930 -38.65920
78.18150 -38.39320
78.70610 -38.00060
78.02130 -37.48290
78.60630 -36.99830
79.18390 -36.51090
78.68990 -36.09800
78.20110 -35.68310
78.80350 -35.16120
78.44230 -34.84230
78.48790 -34.80670
77.91660 -34.32380
77.35180 -33.83830
78.08580 -33.19420
77.65780 -32.82760
77.23340 -32.45950
76.81240 -32.09000
76.39480 -31.71910
76.68940 -31.46490
76.14810 -30.97040
76.20450 -30.90570
75.79720 -30.57350
75.39260 -30.24010
75.51490 -30.11760
75.36410 -30.00580
75.55390 -29.83940
74.93760 -29.32840
74.99400 -29.26450
74.59170 -28.90350
74.19220 -28.54130
74.40580 -28.31730
73.96850 -27.94420
73.53420 -27.56980
73.39950 -27.65500
73.12270 -27.44580
72.92020 -27.57280
72.46260 -27.14620
72.00840 -26.71820
72.06560 -26.65600
71.71660 -26.38570
71.58000 -26.45440
71.13540 -26.08310
70.99430 -26.18730
70.66540 -25.91240
70.40860 -26.06040
69.95950 -25.65120
69.49000 -25.67620
69.46030 -25.78220
69.13790 -25.78430
69.15000 -25.99330
68.82940 -26.00890
68.81970 -26.14100
68.59790 -26.12060
68.62190 -26.26250
67.97910 -26.29060
67.96220 -26.58300
67.43330 -26.57150
67.42400 -26.86990
67.15550 -26.86740
67.12900 -27.26920
66.37300 -27.28110
66.35900 -27.51450
65.34750 -27.51410
65.33210 -27.81220
64.46690 -27.81750
63.60370 -27.83130
63.62110 -28.03880
63.19420 -28.02140
63.21120 -28.16400
62.70300 -28.15250
62.74620 -28.45850
62.13510 -28.48960
62.16190 -28.81140
61.51760 -28.77720
61.53220 -28.91990
60.81020 -28.93130
60.78640 -29.46520
60.76240 -29.99900
60.74730 -30.01450
60.76280 -30.53150
60.00540 -30.56070
59.18800 -30.56710
59.16670 -31.04970
58.52990 -31.05530
58.45630 -31.69100
57.80000 -31.72200
57.15300 -31.77060
57.12230 -32.30280
57.09120 -32.83500
57.06070 -33.55420
56.40060 -33.62680
55.73790 -33.65280
55.69870 -34.23500
55.30100 -34.28720
55.27470 -34.56050
54.25510 -34.54160
54.21610 -35.30240
53.47060 -35.51670
53.46650 -36.14090
52.90230 -36.15300
52.33800 -36.16240
52.31060 -36.79730
52.28270 -37.43220
51.55480 -37.44150
50.82700 -37.45070
50.82330 -37.57990
49.96220 -37.59680
49.94510 -37.79020
49.03660 -37.79170
49.03440 -37.99990
48.63260 -38.01420
48.01710 -38.47800
48.02340 -38.65070
47.13530 -38.76370
46.24440 -38.86990
46.16020 -39.49450
46.07440 -40.11900
45.33180 -40.10850
45.30270 -40.36590
44.71600 -40.36890
44.68580 -40.69110
44.02300 -40.67080
44.00920 -40.91500
42.87290 -40.85050
42.77400 -41.32050
42.67370 -41.79040
42.57190 -42.26020
42.46860 -42.72990
41.81200 -42.65530
41.68590 -43.11740
41.55780 -43.57940
40.50580 -43.43760
39.45880 -43.28620
39.26730 -43.72570
39.07290 -44.16480
38.33830 -44.05470
38.19370 -44.40100
38.08270 -44.61880
37.50830 -44.87530
37.08550 -44.80430
36.67740 -44.91970
36.30290 -44.96650
35.97290 -44.96070
35.66030 -44.86600
35.18190 -44.85550
35.01450 -45.10580
34.86820 -45.46570
34.70400 -45.97140
34.50370 -46.22160
34.26720 -46.21230
34.08690 -46.08990
33.98240 -46.08120
33.81840 -45.97910
33.54000 -46.34640
33.35850 -46.80550
33.17390 -47.26440
32.12580 -46.99980
31.86540 -47.20110
31.58850 -47.68220
31.30650 -48.16270
31.00810 -48.58710
30.70460 -49.01060
30.36170 -49.21550
30.00600 -49.61080
29.71150 -49.93350
29.34310 -50.50700
28.96880 -51.13730
28.60540 -51.77160
28.40270 -52.27710
28.31220 -52.54000
28.11080 -52.90370
27.47950 -52.77080
27.37040 -52.67300
27.32210 -52.54720
26.71310 -52.37800
26.51290 -52.62010
26.33820 -53.06500
26.18090 -53.42880
25.98690 -53.58180
25.86140 -53.47990
25.64750 -53.41000
25.17970 -53.44410
24.87260 -53.34530
24.68510 -53.42150
23.88620 -53.30860
23.02140 -53.20040
23.07530 -53.09770
22.50420 -53.05120
21.25040 -52.90880
19.99380 -52.81670
18.71250 -52.55290
18.53740 -52.73430
17.80630 -52.46690
16.90720 -52.16930
15.82230 -51.78700
15.42800 -52.08360
15.11240 -52.30750
14.46330 -51.99710
13.78760 -52.47690
13.20420 -52.14100
12.89510 -51.96290
12.29890 -52.37500
11.70840 -52.78290
10.97480 -53.33200
10.54240 -53.06550
9.99306 -52.79230
9.42869 -53.23260
8.79876 -53.66800
8.28834 -54.03260
7.77235 -54.39600
> AR
64.84903 24.37438
64.49775 24.31647
64.12342 24.23090
63.74707 24.15396
62.96962 24.06178
62.18730 24.02457
61.95300 23.97720
61.79676 24.01877
61.40614 24.01738
61.10878 24.00879
60.81182 24.01273
60.54653 24.02573
60.28109 24.03714
59.93967 24.08731
59.60135 24.15369
59.32117 24.19903
59.03960 24.23446
58.72898 24.27121
60.00000 24.02480
58.42296 24.33500
57.74480 24.40230
57.25520 24.74600
57.03750 25.51240
56.82440 26.26440
56.53320 26.73650
56.08780 26.80430
55.65920 26.44570
55.23320 26.08590
54.45370 26.00110
53.61730 26.38960
52.99480 26.57350
52.24210 26.96290
51.61950 27.14540
50.85580 27.52480
50.56260 28.05740
50.26640 28.58930
50.57920 29.21180
50.21060 29.76300
48.00000 30.00000
46.50000 30.50000
44.00000 32.75000
43.00000 36.00000
41.00000 38.00000
38.00000 36.75000
36.65000 34.00000
35.33000 29.00000
34.75000 27.50000
34.87480 26.80780
35.19990 26.35300
35.54560 25.91910
35.88880 25.48440
36.06610 25.05530
36.24220 24.62600
36.40730 24.13270
36.57110 23.63920
37.04250 23.22590
37.53980 22.49450
37.82530 21.84340
37.97470 21.02130
38.07450 20.38910
38.39570 19.90750
38.82610 19.44750
39.29780 19.02980
39.58990 18.41930
39.98670 17.94940
40.33130 17.26620
44.04930 12.00800
44.51310 12.01260
44.78020 12.02240
44.88170 12.01890
44.91320 12.01160
45.09690 11.99890
45.28110 11.99830
45.32770 12.05250
45.42800 12.01760
45.52180 11.98290
45.60180 12.07300
45.63720 12.15860
45.64960 12.15190
45.85090 12.10020
46.10970 12.05810
46.15030 12.11230
46.19760 12.17240
46.31070 12.14250
46.42900 12.08750
46.51080 12.20190
46.57890 12.29210
46.71680 12.24820
46.84870 12.21080
46.92970 12.30020
46.99230 12.40300
47.04890 12.38770
47.13030 12.35870
47.16130 12.46300
47.31900 12.43010
47.53890 12.36870
47.58750 12.44090
47.64940 12.51850
47.78830 12.49230
47.90140 12.46110
47.99140 12.58070
48.04790 12.67100
48.14200 12.64070
48.26750 12.60230
48.34870 12.57260
48.44790 12.72890
48.56710 12.69060
48.69920 12.65760
48.80250 12.76980
48.88200 12.90840
49.07050 12.85280
49.27840 12.80190
49.34900 12.89730
49.42960 13.04190
49.47210 13.00780
49.59260 13.16860
49.68000 13.31280
49.84910 13.25120
50.06140 13.16750
50.16730 13.12250
50.25240 13.22900
50.31020 13.31250
50.42940 13.27250
50.57300 13.21810
50.66150 13.36180
50.84160 13.27940
51.07900 13.19230
51.25320 13.12230
51.34290 13.27180
51.44870 13.45760
51.56980 13.66730
51.76250 14.02830
51.94000 14.35300
52.13890 14.68870
52.29920 14.66250
52.54690 14.59720
52.66720 14.56150
52.73700 14.68130
52.90710 14.62210
53.12220 14.55860
53.21130 14.53790
53.22020 14.56230
53.35840 14.51180
53.57900 14.44080
53.81800 14.36150
53.86250 14.35090
53.92870 14.48940
54.01770 14.65730
54.06870 14.77220
54.14940 14.73280
54.19260 14.70960
54.24930 14.69140
54.28740 14.68140
54.33190 14.67070
54.38730 14.63990
54.45050 14.62100
54.51100 14.76010
54.54890 14.86980
54.73080 14.80100
54.95760 14.72720
55.04730 14.71160
55.10840 14.85050
55.27780 14.78850
55.48000 14.72920
55.63120 14.68140
55.66850 14.72160
55.82180 14.69230
56.05740 14.64110
56.17910 14.62130
56.20790 14.64330
56.26520 14.62320
57.00150 14.66010
57.47620 14.66200
57.98360 14.59940
58.21310 14.91600
58.58920 14.64600
59.03370 15.08760
59.40960 14.89510
59.64230 15.24180
59.90860 15.57210
59.96420 16.14230
60.02020 16.71260
60.06190 17.45770
60.21480 18.23970
60.45640 18.79830
60.71220 19.30570
60.96960 19.81270
61.23010 20.23030
61.49190 20.64430
61.84810 21.12580
62.09630 21.42490
62.13250 22.08280
62.50250 22.38500
62.87720 22.68300
63.63130 23.20080
64.27540 23.69360
64.65110 24.03830
65.02820 24.38240
> AS
22.01928 36.18806
22.24291 35.88988
22.57837 35.65382
22.92625 35.43018
23.34867 35.25624
23.92018 35.10715
24.49170 35.00776
24.95139 34.89594
25.52291 34.85867
26.05715 34.95806
26.34290 35.25624
26.60381 35.64139
26.80260 35.98927
26.90470 36.33680
26.24360 36.44320
26.42400 37.04110
26.60720 37.63880
26.48906 37.75958
26.39142 37.75300
26.32264 37.80178
26.37823 37.96746
26.31850 38.05280
25.39440 38.20930
24.46640 38.35860
24.50260 37.55580
24.53810 36.75290
23.70610 36.60280
22.87740 36.44690
21.87690 36.43700
> AU
84.39838 -29.49835
84.45470 -29.85075
84.46638 -30.20725
84.41138 -30.50805
84.23135 -30.75067
83.94300 -30.92799
83.62828 -31.05518
83.27723 -31.16605
82.92131 -31.26020
82.21814 -31.44549
81.51581 -31.63403
80.77991 -31.81847
80.04288 -31.99858
79.80038 -32.05954
79.56244 -32.13490
79.44407 -32.17977
79.32570 -32.22464
79.08865 -32.31438
78.85149 -32.40405
78.37360 -32.58447
77.89556 -32.76458
77.78694 -32.80550
77.65780 -32.82760
78.08580 -33.19420
77.35180 -33.83830
77.91660 -34.32380
78.48790 -34.80670
78.44230 -34.84230
78.80350 -35.16120
78.20110 -35.68310
78.68990 -36.09800
79.18390 -36.51090
78.60630 -36.99830
78.02130 -37.48290
78.70610 -38.00060
78.18150 -38.39320
78.52930 -38.65920
78.07310 -39.00490
78.38390 -39.26200
78.00240 -39.53850
78.42540 -39.90490
77.82450 -40.32600
78.48370 -40.86640
78.65860 -40.87220
79.31910 -41.38400
79.99000 -41.89190
80.46350 -41.51190
80.93150 -41.12990
81.75200 -41.72250
82.58770 -42.30910
83.43900 -42.88960
83.85330 -42.55060
84.26310 -42.21010
84.66860 -41.86820
85.06970 -41.52490
85.46650 -41.18020
85.85920 -40.83410
86.40200 -41.12880
86.94970 -41.42100
87.50230 -41.71050
88.05990 -41.99740
88.48840 -41.68590
89.01060 -41.94420
89.53700 -42.20020
90.06770 -42.45380
90.60270 -42.70490
91.14200 -42.95340
91.68570 -43.19940
92.23370 -43.44280
92.78620 -43.68360
93.34310 -43.92170
93.90440 -44.15710
94.47020 -44.38970
95.04050 -44.61950
94.92570 -44.80530
95.80640 -45.14140
96.69750 -45.47070
96.27380 -45.99630
95.84200 -46.52030
96.45800 -46.77180
97.07970 -47.02000
97.70720 -47.26480
98.34040 -47.50610
98.97940 -47.74390
99.62430 -47.97810
100.20200 -47.26650
100.81700 -47.46540
101.43600 -47.66100
102.06000 -47.85330
102.68800 -48.04210
103.32100 -48.22750
103.95900 -48.40930
104.60100 -48.58770
105.24700 -48.76240
105.89800 -48.93350
106.55400 -49.10090
106.69200 -48.84140
107.48600 -49.01460
108.28500 -49.18230
108.24000 -49.25870
109.35100 -49.52350
110.47200 -49.77900
110.86800 -49.82890
111.12900 -49.80040
111.36300 -49.92970
111.66600 -50.08380
112.96700 -50.20040
114.02400 -50.38770
114.36200 -49.87780
115.50000 -49.97430
115.98800 -49.85170
116.25600 -49.54040
116.63500 -49.27090
117.52300 -49.61990
118.19400 -49.86480
118.54700 -49.80170
119.36600 -49.93840
120.27300 -50.03600
120.51600 -49.52430
120.84200 -48.88960
121.55500 -49.00560
121.43700 -49.62020
121.86600 -49.73550
122.22400 -49.84620
122.55300 -49.81160
122.79700 -49.72860
123.01300 -49.54240
123.32800 -49.58470
123.77100 -49.12160
124.00700 -48.90580
124.21300 -48.84760
124.60700 -48.98350
124.99200 -49.15280
125.12500 -49.35810
125.26200 -49.59830
125.89600 -49.71710
126.07400 -49.40140
126.26400 -49.04430
126.43400 -48.62970
126.86100 -48.69770
127.31300 -48.76390
127.24300 -49.29390
127.19600 -49.64290
127.14300 -49.97610
128.31200 -50.15920
129.41200 -50.34800
130.56900 -50.52490
131.25600 -50.60370
131.51500 -50.22220
132.26100 -50.22280
133.46500 -50.30550
134.24500 -50.34750
135.02600 -50.38420
135.24600 -50.20930
136.22600 -50.24760
136.94600 -50.22040
137.70000 -50.23360
138.40100 -50.23110
139.11000 -50.25580
139.64500 -50.27940
139.73300 -51.17390
139.81300 -51.83760
140.32300 -51.79830
140.38581 -52.17681
140.40000 -52.27430
140.47800 -52.75020
140.58400 -53.50440
140.65900 -53.88540
141.45100 -54.05280
142.25000 -54.21490
143.77800 -54.23430
144.28200 -54.79850
145.40100 -54.75550
146.88100 -54.69530
147.04300 -55.17490
147.20600 -55.65360
147.37300 -56.13210
147.54500 -56.61040
147.72100 -57.08840
147.90200 -57.56620
148.07600 -57.52710
148.80600 -57.43580
149.15000 -58.10440
149.39800 -58.55180
149.65200 -58.99880
150.00600 -59.57040
150.73300 -59.47530
151.00800 -59.94420
151.29000 -60.41260
152.47300 -60.17640
153.63900 -59.92990
154.29400 -60.68130
154.98100 -61.42940
155.70100 -62.17380
156.45700 -62.91430
157.97000 -62.47810
159.44000 -62.02590
160.86500 -61.55860
161.22800 -61.45670
161.12900 -61.38420
160.74000 -61.05260
160.32700 -60.50390
159.80300 -60.00550
159.69100 -59.93870
159.41300 -59.73160
159.18600 -59.51070
158.97200 -59.30460
158.65000 -59.07050
158.38500 -58.85810
158.26700 -58.77920
158.12100 -58.60510
157.92000 -58.33420
157.75100 -58.06810
157.62000 -57.78350
157.61500 -57.47400
157.64000 -57.23020
157.70300 -56.99180
157.82300 -56.72480
157.94400 -56.43850
158.04200 -56.31050
158.15300 -56.16470
158.22600 -56.02160
158.33200 -55.77930
158.46500 -55.52160
158.54000 -55.27240
158.59600 -55.04670
158.61800 -54.92790
158.67400 -54.68940
158.74000 -54.55890
158.58058 -54.57328
158.28264 -54.75802
157.59772 -54.95043
156.88302 -54.98664
156.53278 -54.99206
156.18270 -55.00250
155.84794 -55.00792
155.51581 -54.97179
154.87414 -54.71950
154.30836 -54.32277
154.05708 -54.09833
153.86034 -53.82840
153.77029 -53.50555
153.73640 -53.17056
153.68201 -52.82713
153.55281 -52.50514
153.46639 -52.37423
153.35831 -52.26112
153.23755 -52.17030
153.11701 -52.07908
153.05171 -52.02199
152.99678 -51.95522
152.98208 -51.92505
152.97706 -51.89201
153.00019 -51.86462
153.04382 -51.86741
153.21511 -51.85789
153.38500 -51.83298
153.72572 -51.72800
154.03967 -51.55841
154.32747 -51.33676
154.59609 -51.09182
154.87027 -50.83419
155.13858 -50.57053
155.64610 -50.09937
156.24444 -49.75780
156.90607 -49.57909
157.58302 -49.46590
157.62093 -49.46025
157.58302 -49.46590
157.89140 -49.42412
158.20071 -49.38954
158.94358 -49.33283
159.68814 -49.30691
160.43898 -49.29925
161.18935 -49.32053
161.54755 -49.35032
161.90436 -49.39333
162.26017 -49.43921
162.61311 -49.50102
162.95344 -49.60083
163.29726 -49.68825
163.54500 -49.57320
163.74000 -49.32220
163.86800 -49.11570
163.96400 -48.91710
164.13000 -48.74170
164.21500 -48.59160
164.28700 -48.42860
164.30900 -48.27380
164.38900 -48.20200
164.39800 -48.05930
164.48300 -47.91970
164.48000 -47.75950
164.52800 -47.65760
164.65100 -47.52080
164.69900 -47.44390
164.73900 -47.25620
164.83800 -47.14850
164.92300 -47.01080
164.94300 -46.78300
165.02100 -46.60130
165.16800 -46.40520
165.42700 -46.18980
165.73300 -46.06480
165.92000 -45.95810
166.01900 -45.88720
166.20500 -45.73640
166.37700 -45.51500
166.53700 -45.35020
166.71000 -45.21130
166.95100 -44.98710
167.10000 -44.82620
167.36800 -44.64780
167.68800 -44.46600
168.08100 -44.32970
168.48800 -44.16600
168.77000 -44.02150
169.13600 -43.84530
169.64700 -43.59430
170.10300 -43.35780
170.63800 -43.08790
170.89861 -42.70996
171.29793 -42.39050
171.79710 -42.01114
172.29626 -41.55191
172.85532 -41.15258
173.35448 -40.79319
173.85364 -40.41382
174.33283 -40.07439
174.73216 -39.73497
175.17142 -39.47540
175.60900 -39.22970
175.93200 -38.76230
175.99500 -38.67420
176.24100 -38.28690
176.50900 -37.88490
176.77000 -37.48500
177.04900 -37.10220
177.50700 -36.46100
177.89000 -35.91740
178.40300 -35.16120
178.68100 -34.78630
178.99600 -34.24600
179.34500 -33.60160
179.65700 -33.01870
179.98000 -32.34670
-179.74000 -31.75100
-179.51500 -31.33280
-179.39300 -30.99680
-179.22600 -30.35530
-179.07400 -29.79240
-178.96600 -29.49830
-178.71300 -28.69270
-178.48200 -27.98550
-178.24800 -27.37650
-178.01700 -26.76720
-177.79300 -25.97550
-177.65700 -25.19710
-177.55200 -24.71960
-177.44800 -24.24200
-177.41900 -24.10510
-177.25000 -23.70790
-177.10200 -23.41440
-176.91300 -23.04810
-176.74800 -22.73450
-176.70900 -22.50050
-176.69100 -22.28640
-176.63500 -22.23140
-176.60100 -22.00740
-176.52000 -21.81150
-176.44900 -21.60050
-176.40500 -21.48740
-176.37200 -21.30120
-176.32200 -21.11260
-176.28900 -20.99950
-176.26400 -20.89130
-176.23700 -20.79580
-176.19000 -20.65500
-176.17600 -20.49390
-176.15900 -20.42340
-176.15200 -20.26470
-176.11600 -20.12890
-176.18200 -20.10560
-176.12200 -19.88430
-176.07900 -19.81410
-176.02700 -19.65080
-175.97900 -19.38650
-176.54900 -19.21740
-176.57000 -18.97520
-176.58700 -18.83640
-176.58400 -18.76840
-176.55100 -18.68550
-176.51100 -18.60020
-176.44000 -18.47230
-176.34600 -18.30680
-176.33000 -18.26660
-176.29700 -18.13080
-176.30400 -18.05510
-176.40300 -17.87270
-176.46200 -17.73100
-176.53200 -17.57400
-176.62500 -17.39920
-176.71300 -17.21940
-176.82000 -17.03440
-176.92100 -16.87720
-177.06800 -16.72460
-177.20100 -16.57460
-177.36400 -16.43700
-177.51300 -16.31960
-177.67800 -16.17690
-177.66400 -16.10650
-177.63400 -16.02360
-177.57500 -15.96110
-177.49300 -15.89890
-177.38400 -15.80660
-177.24800 -15.70960
-177.13000 -15.55940
-177.73804 -15.38671
-178.07700 -15.86640
-178.57900 -16.08350
-179.08200 -16.29940
-179.39900 -16.64480
-179.71700 -16.98970
-179.94800 -17.45810
179.81900 -17.92620
179.66800 -18.35960
179.51600 -18.79280
179.26400 -19.26570
179.01100 -19.73830
178.41800 -20.21940
177.97100 -20.54740
177.52300 -20.87420
176.89000 -21.39330
176.33800 -21.82510
175.78200 -22.25500
174.93300 -22.61190
173.99600 -22.81410
173.41400 -22.88550
172.88100 -23.08110
172.36100 -23.17750
172.27800 -23.17070
172.19700 -23.17630
172.06000 -23.17300
171.95000 -23.15530
171.85400 -23.14910
171.70300 -23.14640
171.62000 -23.12680
171.49600 -23.10960
171.38500 -23.09150
171.28800 -23.07240
171.16200 -23.02990
171.03700 -22.99980
170.93900 -22.96800
170.84200 -22.94860
170.74500 -22.91660
170.66000 -22.88380
170.54700 -22.82740
170.42000 -22.75910
170.32100 -22.70170
170.22100 -22.64420
170.10900 -22.58730
170.03600 -22.51570
169.95000 -22.44470
169.83500 -22.34990
169.71900 -22.22980
169.57700 -22.12360
169.49100 -22.05220
169.41900 -21.98010
169.32000 -21.90920
169.28800 -21.82250
169.21500 -21.72500
169.14300 -21.64010
169.05400 -21.50550
168.99600 -21.41980
168.87900 -21.26100
168.77600 -21.10150
168.70500 -21.01620
168.64500 -20.89260
168.58500 -20.78150
168.51200 -20.64570
168.39600 -20.47370
168.33500 -20.32460
168.26300 -20.20120
168.19100 -20.09030
168.16000 -20.00310
168.07500 -19.89260
168.00300 -19.76900
167.94300 -19.63220
167.88600 -19.53320
167.81200 -19.37160
167.72700 -19.23560
167.68000 -19.04770
167.60700 -18.88590
167.52100 -18.71180
167.50400 -18.61130
167.48600 -18.48550
167.45500 -18.36010
167.42400 -18.24730
167.39400 -18.14720
167.35000 -18.02210
167.32000 -17.92190
167.27500 -17.75900
167.24500 -17.63350
167.21500 -17.52060
167.17100 -17.39550
167.15500 -17.30740
167.05900 -17.20900
166.95000 -17.09820
166.86800 -16.98660
166.81000 -16.83630
166.72800 -16.73720
166.65900 -16.62510
166.60400 -16.53800
166.56200 -16.43780
166.50600 -16.30000
166.45000 -16.18740
166.39500 -16.08750
166.34000 -15.97490
166.28500 -15.88750
166.27000 -15.79930
166.22700 -15.67370
166.22500 -15.55990
166.20900 -15.43370
166.19300 -15.34540
166.21700 -15.24370
166.22800 -15.12960
166.21300 -15.04130
166.26200 -14.88850
166.27100 -14.68590
166.26800 -14.55940
166.25200 -14.42050
166.25000 -14.34470
166.23400 -14.18050
166.20400 -13.99130
166.16100 -13.82760
166.15400 -13.77940
166.13200 -13.67630
166.09000 -13.51260
166.02000 -13.26080
165.95200 -13.07210
165.90900 -12.87030
165.89400 -12.74400
165.83800 -12.51710
165.77000 -12.31570
165.71500 -12.12660
165.62100 -11.88750
165.51400 -11.68640
165.39600 -11.54870
165.25200 -11.41130
165.07000 -11.28690
164.90100 -11.20020
164.75800 -11.16370
164.64100 -11.11430
164.51200 -11.09030
164.40900 -11.09130
164.26700 -11.11790
164.15100 -11.14430
163.99600 -11.15830
163.85400 -11.18480
163.69900 -11.19870
163.50500 -11.23810
163.31100 -11.26470
163.19500 -11.29080
163.05300 -11.31060
162.83300 -11.35600
162.62600 -11.38230
162.48400 -11.42080
162.35400 -11.42120
162.22500 -11.42160
162.10900 -11.43450
162.01800 -11.42200
161.90100 -11.39680
161.79800 -11.35890
161.72000 -11.32090
161.55200 -11.28290
161.46100 -11.24480
161.38400 -11.23210
161.30600 -11.19400
161.20200 -11.16850
161.12500 -11.13040
161.06000 -11.05410
160.99600 -11.02870
160.93100 -10.96510
160.86700 -10.91420
160.77600 -10.83790
160.72500 -10.78700
160.62200 -10.72330
160.54400 -10.67230
160.49300 -10.63410
160.36400 -10.57020
160.28700 -10.51920
160.21000 -10.46810
160.13200 -10.41700
160.06800 -10.37870
159.97800 -10.31490
159.91400 -10.27650
159.83700 -10.25070
159.77200 -10.19970
159.70800 -10.17390
159.64400 -10.12290
159.58000 -10.08440
159.50300 -10.02060
159.43900 -9.96945
159.36200 -9.93092
159.28500 -9.87969
159.22100 -9.82854
159.17000 -9.76480
159.11900 -9.72641
159.06800 -9.68801
159.00300 -9.64952
156.08600 -9.53838
155.98900 -9.55797
155.97900 -9.54810
155.90800 -9.55456
155.81300 -9.57154
155.79700 -9.52648
155.70800 -9.54838
155.59900 -9.58072
155.57700 -9.53069
155.47300 -9.56795
155.43600 -9.49296
155.34700 -9.53242
155.29100 -9.55615
155.17200 -9.62138
155.17200 -9.72993
155.07000 -9.79486
154.95100 -9.83485
154.85600 -9.83902
154.84900 -9.72297
154.71900 -9.76305
154.59600 -9.81056
154.37900 -9.87219
154.21800 -9.91264
154.21900 -10.27920
154.16900 -10.32300
154.12500 -10.33130
154.01000 -10.34070
153.84700 -10.32540
153.75200 -10.34460
153.55200 -10.35500
153.36200 -10.39810
153.17400 -10.39810
152.85500 -10.38440
152.84900 -10.08810
152.65100 -10.07770
152.54700 -10.05600
152.41300 -10.04730
152.22300 -10.03900
152.21400 -9.94533
152.08600 -9.94400
152.02400 -9.94203
151.91800 -9.93028
151.83800 -9.90561
151.83400 -9.76114
151.65400 -9.76005
151.54500 -9.67589
151.00500 -9.68138
150.46600 -9.68686
150.24500 -9.94531
149.67600 -9.80087
149.13300 -9.35255
148.75100 -9.56973
148.20700 -9.21176
147.53900 -8.88649
146.95400 -8.59828
146.91800 -8.41044
146.39800 -8.10254
145.66600 -7.66091
145.24900 -7.37364
144.74000 -7.02342
144.13600 -6.81309
143.56900 -6.55817
142.95600 -6.29475
142.23100 -5.98645
141.48300 -5.72740
140.84700 -5.04497
140.84700 -5.54497
140.79800 -5.50959
140.26400 -5.43064
139.73100 -5.25127
138.95900 -5.54782
138.48400 -4.94247
138.01000 -4.83682
137.17700 -4.72116
136.67200 -4.69929
136.16700 -4.67709
133.44900 -5.34429
133.98200 -5.64060
133.68600 -6.34769
133.18800 -6.51458
132.68900 -6.68099
132.43100 -6.98943
131.86700 -7.66120
131.41500 -8.26747
130.93300 -8.56249
130.54000 -8.72560
129.86100 -8.92625
129.10600 -9.02027
128.37600 -9.09547
127.90000 -9.13307
127.43000 -9.22077
126.85300 -9.38984
126.33300 -9.59637
125.86900 -9.78401
125.48200 -9.98405
125.15900 -10.15900
124.73400 -10.39000
123.96000 -10.70810
123.21700 -10.99480
122.86872 -11.18503
122.63159 -11.31965
122.38379 -11.43492
122.06674 -11.59136
121.74730 -11.74268
121.42615 -11.88218
121.09139 -11.98182
120.76978 -11.94121
120.47943 -11.78330
119.84100 -11.46160
119.27000 -11.39320
118.75000 -11.36210
118.23600 -11.38690
117.57600 -11.33720
116.85300 -11.33100
116.17400 -11.27500
115.57100 -11.21890
115.01300 -11.15050
114.41000 -11.08820
113.75600 -10.96360
113.20400 -10.87020
112.56300 -10.75800
112.17000 -10.65200
111.52300 -10.57720
111.01500 -10.47730
110.61500 -10.47730
110.15900 -10.43990
109.62600 -10.37130
109.73356 -11.04624
109.73898 -11.43585
109.73944 -11.82547
109.72335 -12.56493
109.66610 -13.30207
109.52870 -13.96440
109.19386 -14.54642
108.62221 -14.94888
107.94905 -15.15312
107.20827 -15.23729
106.46223 -15.25625
104.92590 -15.23822
103.38957 -15.21192
102.62729 -15.21408
101.86887 -15.27629
101.14187 -15.46111
100.44596 -15.74327
99.12533 -16.45093
97.84508 -17.23147
96.53087 -18.00722
95.19036 -18.73616
93.81882 -19.39230
92.45362 -20.06120
91.16502 -20.83865
90.03718 -21.82885
89.62242 -22.40763
89.32248 -23.05355
89.08403 -23.77127
88.85952 -24.49364
88.33041 -25.82866
87.41448 -26.91039
86.77915 -27.20330
86.08828 -27.32708
84.31231 -29.17744
> BU
96.20000 15.20000
95.80000 15.80000
94.00000 15.80000
93.46230 14.38850
93.14860 14.16671
92.94567 13.86038
92.74846 13.55041
92.46925 12.88236
92.22145 12.20007
92.15228 12.03551
92.10161 11.86465
92.08451 11.70810
92.08505 11.55047
92.09689 11.22081
92.12698 10.89236
92.75325 10.80235
93.66810 10.70605
94.41460 10.67900
94.80680 11.18760
95.15460 12.05300
95.50460 12.91800
95.85710 13.78250
96.50310 14.12920
> CA
-69.05490 13.64360
-68.42259 13.61950
-67.79376 13.55266
-67.47053 13.46864
-67.17696 13.31093
-66.90421 13.06038
-66.65560 12.78453
-66.15821 12.25682
-65.64211 11.74748
-65.37748 11.50451
-65.10244 11.27346
-64.81920 11.10566
-64.50533 11.00477
-64.17444 10.95727
-63.84006 10.94590
-63.66963 10.94798
-63.49923 10.95441
-63.32527 10.96295
-63.15383 10.99003
-63.02525 11.03703
-62.89930 11.09107
-62.74097 11.13289
-62.57699 11.14206
-62.40354 11.14124
-62.23167 11.16190
-62.05578 11.21668
-61.88650 11.28971
-61.55971 11.46510
-61.24119 11.65542
-60.96229 11.85456
-60.40002 12.15040
-60.23618 12.83306
-60.53655 13.67957
-60.91885 14.14378
-61.30114 14.44416
-61.71074 14.82645
-62.03842 15.39989
-62.42072 16.10986
-62.77570 16.81984
-63.02146 17.36597
-63.26722 17.74827
-63.48568 18.13056
-63.67682 18.45824
-63.94989 18.59477
-64.25000 17.85000
-64.60000 17.30000
-65.75000 17.30000
-66.14123 17.56612
-66.46423 17.46883
-66.84271 17.38860
-67.22582 17.33379
-67.94176 17.25932
-68.66095 17.24710
-69.36142 17.37209
-70.00561 17.67393
-71.70000 17.00000
-72.80000 17.80000
-74.00000 17.80000
-75.20000 17.15000
-75.75000 16.55000
-76.15000 16.15000
-77.25000 16.15000
-80.30000 17.95000
-81.62480 17.80160
-82.24420 17.69070
-82.86460 17.62570
-83.70580 17.48090
-84.24790 17.34400
-84.90970 17.10660
-85.67140 16.91100
-86.31950 16.69450
-86.96610 16.47590
-86.74678 16.49015
-86.59058 16.47894
-86.45267 16.39445
-86.30022 16.28073
-86.13714 16.18375
-86.13470 16.18270
-86.13714 16.18375
-85.81038 16.09451
-85.48370 16.00387
-85.36092 15.92631
-85.27977 15.80775
-85.29091 15.64343
-85.37783 15.49833
-85.55035 15.22828
-85.69569 14.94238
-85.85285 14.64730
-86.03304 14.36554
-86.23052 14.08787
-86.16772 13.87331
-86.08256 13.70299
-85.90007 13.42317
-85.80275 13.16769
-85.70542 12.99736
-85.49859 12.74188
-85.40127 12.54722
-85.29177 12.36473
-85.12145 12.04842
-85.04846 11.87809
-84.85380 11.62261
-84.67131 11.34279
-82.00000 9.80000
-81.00000 9.80000
-78.00000 10.25000
-77.00000 10.00000
-76.59440 10.09000
-76.45590 10.32850
-76.27480 10.57440
-76.06450 10.76500
-75.90500 11.08730
-75.63130 11.39000
-75.37030 11.59480
-75.12280 11.76450
-74.79640 11.91380
-74.47640 12.02080
-74.30660 12.22430
-74.05770 12.38630
-73.87380 12.74310
-73.63200 13.05830
-73.30320 13.28980
-72.91610 13.36750
-72.42820 13.40970
-71.83970 13.46470
-71.19490 13.50290
-70.54667 13.63756
> CL
138.30900 9.19616
137.98200 8.53360
137.52900 7.87117
137.14400 7.61961
136.75900 7.36771
136.18300 6.98895
135.41500 6.89507
134.52100 6.99019
134.26900 6.61025
133.98900 6.33263
133.67400 6.15594
133.42900 5.96222
133.30800 5.73427
133.24000 5.34909
133.18900 5.01620
133.03200 4.78754
132.91100 4.45382
132.79000 4.11986
132.74000 3.69833
132.79500 3.31224
132.85000 2.90828
132.81700 2.53873
132.76600 2.25688
132.73400 1.72846
132.72000 1.16455
132.65100 0.81158
132.51500 0.01706
132.82400 -0.04290
133.32700 -0.14569
133.89900 0.05668
134.47100 0.25904
134.93800 0.42124
135.65600 -0.02304
136.45100 -0.22814
136.94300 -0.42228
137.43500 -0.61639
138.05400 -0.71816
138.67400 -0.81985
138.79300 -1.15941
139.25700 -1.38997
139.80500 -1.55742
140.22600 -1.76738
140.83700 -1.89328
141.19500 -2.16673
141.59400 -2.27205
141.86800 -2.39843
142.24600 -2.69310
142.39400 -2.46221
142.62600 -1.91593
142.92200 -1.45354
143.26000 -1.15956
143.80800 -0.95057
144.35700 -0.74188
145.03300 -0.53411
145.49700 -0.47327
145.91900 -0.34916
146.59500 -0.29022
147.05900 -0.29351
147.35400 -0.27465
147.85900 -0.42635
148.34400 -0.40946
148.72400 -0.39186
148.91300 -0.45692
149.27000 -0.65021
149.25100 -0.39698
149.19100 -0.14324
149.11200 0.40626
148.86300 0.93659
148.70000 1.48745
148.68400 2.05827
148.66800 2.62928
148.69400 3.13658
148.19100 3.77564
147.77200 4.39257
147.42500 4.76546
147.07800 5.13818
146.73000 5.51071
146.38200 5.88304
146.00100 6.16022
145.47100 6.35347
145.06700 6.50348
144.66400 6.61101
144.02600 6.67698
143.55800 6.80532
143.07000 7.16576
142.66600 7.38844
142.26200 7.61077
141.51700 8.11804
141.04800 8.39250
140.57900 8.66639
139.88600 8.86631
139.19200 9.06494
138.35900 9.37865
> CO
-86.97490 10.54730
-87.46210 11.09590
-87.89010 11.39670
-88.31900 11.69680
-88.91970 11.99920
-89.61900 12.29480
-90.29270 12.54260
-90.89800 12.58370
-91.30790 12.83220
-91.71860 13.08010
-92.06320 13.27120
-92.27240 13.22330
-92.59920 13.49800
-92.96190 13.72210
-93.30940 13.79320
-93.65580 14.01610
-94.05520 14.22210
-94.54220 14.47860
-94.87290 14.69980
-95.11700 14.88660
-95.46630 15.09020
-95.79860 15.27650
-96.21900 15.36090
-96.72700 15.36010
-97.21740 15.35840
-97.69140 15.50800
-98.16570 15.63990
-98.58780 15.77150
-99.02810 15.91910
-99.43470 16.13400
-99.80600 16.29800
-100.33600 16.44240
-100.86700 16.63630
-101.70300 17.02560
-102.43200 17.27990
-103.20000 17.61550
-103.79200 17.92000
-104.19100 18.13830
-104.40600 18.20900
-104.72500 18.36840
-104.84300 17.68950
-105.00600 17.00000
-105.36888 16.99942
-105.39800 16.26050
-105.35700 15.55760
-105.32000 15.10760
-104.69000 15.27450
-104.56300 14.67220
-104.43700 14.06980
-104.18100 13.32840
-103.92700 12.58680
-103.77200 11.89040
-103.87500 11.87230
-103.80700 11.40450
-103.73900 10.93660
-103.62800 10.27460
-103.59800 10.12320
-104.29600 10.01710
-104.29600 9.17474
-104.25800 8.45574
-104.22900 8.34001
-103.59500 8.37048
-102.96100 8.39993
-102.81000 7.79085
-102.65900 7.18172
-102.55800 6.35535
-102.45700 5.52897
-102.32000 4.65326
-102.18400 3.77753
-102.25900 3.75071
-102.19900 3.45816
-102.21900 3.23869
-102.19300 3.07219
-102.14500 2.88876
-102.11800 2.89294
-102.09600 2.79833
-102.10900 2.78564
-102.06800 2.63532
-101.87800 2.64213
-101.69700 2.63971
-101.49000 2.60499
-101.51200 2.23226
-101.20300 2.24142
-101.19600 2.19890
-101.06700 2.21046
-100.64400 2.20440
-100.39400 2.20650
-100.06600 2.20704
-100.04700 2.29966
-99.91290 2.27227
-99.81080 2.27260
-99.73890 2.26882
-99.65700 2.19007
-98.91750 2.11218
-98.88860 2.21253
-98.36740 2.14463
-97.84630 2.07656
-97.55120 2.08841
-97.58510 1.89824
-96.88000 1.88568
-96.17500 1.87283
-96.12020 2.23785
-95.22410 2.22175
-95.19820 2.50694
-94.40440 2.43994
-93.61070 2.37248
-92.92790 2.29988
-92.24510 2.22695
-92.09020 2.19975
-92.11830 1.99009
-91.53760 2.01117
-91.56080 1.81659
-90.69730 1.73615
-90.66320 1.12041
-89.78360 1.07290
-88.90410 1.02514
-88.02450 0.97714
-87.14500 0.92891
-86.26560 0.88046
-85.38610 0.83180
-85.34940 1.64441
-84.57590 1.59812
-84.57130 2.06618
-84.56670 2.53424
-84.46710 3.11226
-83.92250 3.13869
-83.37790 3.16485
-82.80640 3.11792
-82.62500 3.59490
-82.62500 4.07188
-82.62500 4.56303
-82.62500 5.05417
-82.62500 5.83296
-82.62500 6.56231
-82.62490 7.11804
-82.62480 7.36639
-83.07420 7.59169
-83.23310 7.84854
-83.35990 7.92759
-83.60540 8.04445
-83.83770 8.18189
-84.00720 8.30028
-84.15770 8.47377
-84.41870 8.63674
-84.68580 8.77169
-85.04380 8.93723
-85.38050 9.08908
-85.61240 9.20327
-85.91050 9.42337
-86.20360 9.68364
-86.44870 9.93830
-86.64800 10.23500
> CP
68.07310 -7.64768
67.64240 -8.02709
68.03900 -8.49189
67.56480 -8.88140
67.08960 -9.27031
67.37800 -9.62999
66.91950 -9.99041
66.46000 -10.35020
66.78740 -10.76200
66.16740 -11.21000
66.41820 -11.55900
65.69780 -12.01850
66.03300 -12.42580
66.36920 -12.83270
65.82050 -13.26810
66.20970 -13.77730
65.92780 -13.97910
66.20760 -14.33870
66.48830 -14.69800
66.88820 -15.26960
67.29020 -15.82150
67.38270 -15.94190
67.03300 -16.13890
67.41050 -16.65870
66.70810 -17.09010
66.14280 -17.45010
65.54240 -17.78300
65.00730 -18.05790
65.26390 -18.44320
65.52170 -18.82810
66.03330 -19.57750
66.42800 -20.07830
66.75130 -19.87030
67.04040 -20.21810
67.30950 -20.07250
67.59300 -20.36890
67.76790 -20.28000
67.89670 -20.46900
68.21250 -20.29070
68.55920 -20.71190
68.27680 -20.87770
68.65290 -21.44950
69.20170 -22.08770
68.79670 -22.38700
69.16210 -22.83050
69.55770 -23.37310
69.84970 -23.70870
69.40160 -24.03960
69.68040 -24.36860
69.93930 -24.67850
69.59210 -24.97010
70.08960 -25.48250
69.95950 -25.65120
70.40860 -26.06040
70.66540 -25.91240
70.99430 -26.18730
71.13540 -26.08310
71.58000 -26.45440
71.71660 -26.38570
72.06560 -26.65600
72.00840 -26.71820
72.46260 -27.14620
72.92020 -27.57280
73.12270 -27.44580
73.39950 -27.65500
73.53420 -27.56980
73.96850 -27.94420
74.40580 -28.31730
74.33658 -28.13919
74.22486 -28.04442
74.11323 -27.94964
74.00867 -27.86036
73.92875 -27.75182
73.82032 -27.51585
73.71208 -27.27989
74.41604 -27.31532
75.10540 -27.18612
75.41831 -27.02713
75.71516 -26.83875
76.22570 -26.87516
76.80350 -26.85109
77.35722 -26.87516
77.93503 -26.92331
78.48875 -26.97146
78.94618 -26.73071
79.52398 -26.36959
80.02956 -26.10476
80.46291 -25.83994
80.92034 -25.59918
81.23332 -25.43066
81.73889 -25.11768
82.10002 -24.87693
82.46114 -24.63618
82.79820 -24.37135
83.25562 -24.10653
83.61675 -23.86578
84.02603 -23.57688
84.43530 -23.33612
84.77235 -23.11945
85.01310 -22.90277
85.01310 -22.51757
84.96495 -22.03607
85.01310 -21.57864
84.96495 -21.12122
84.94088 -20.71194
84.89273 -20.11006
84.91680 -19.65264
84.86865 -19.02668
84.89273 -18.61741
84.82050 -18.13591
84.84458 -17.75070
84.82050 -17.29328
84.84458 -16.95623
84.84458 -16.47472
84.86865 -16.04137
84.84458 -15.58395
84.84458 -15.03022
84.77235 -14.52464
84.82050 -14.11537
84.79643 -13.58571
84.79643 -13.15236
84.79643 -12.71901
84.77235 -12.26158
84.79643 -11.85231
84.74828 -11.44303
84.72420 -11.03375
84.77235 -10.48003
84.62790 -9.95037
84.05010 -9.92630
83.42415 -9.87815
82.82227 -9.85407
82.31669 -9.85407
81.73889 -9.87815
81.32962 -9.80593
80.63144 -9.80593
80.14994 -9.75778
79.69251 -9.73370
79.21101 -9.78185
78.58505 -9.68555
78.05540 -9.70962
77.42945 -9.63740
76.85165 -9.56517
76.32200 -9.49295
75.79234 -9.42072
75.21454 -9.27627
74.66081 -9.17997
74.05894 -9.13182
73.50521 -9.01145
72.95148 -8.86700
72.46998 -8.79477
71.84403 -8.67440
71.07363 -8.50587
70.37545 -8.33734
69.82172 -8.28919
69.23230 -8.28907
69.01450 -7.47733
68.93257 -7.17163
68.64861 -7.18712
68.53527 -7.19002
68.42197 -7.19153
68.35981 -7.20031
68.30631 -7.23025
68.23266 -7.27926
68.15893 -7.32820
68.05209 -7.22778
67.81130 -7.25250
> EA
-114.56700 -23.02360
-114.87500 -23.03960
-114.96200 -23.17890
-115.18300 -23.23700
-115.25400 -23.39750
-115.59900 -23.46840
-115.42400 -23.88440
-115.40200 -24.01740
-115.48200 -24.10510
-115.91200 -24.24180
-115.96800 -24.38290
-116.18400 -24.45830
-116.22500 -24.55580
-116.09900 -24.84750
-116.49000 -25.17200
-116.35300 -25.41580
-116.02800 -25.67380
-115.76900 -25.96770
-115.51800 -26.24340
-115.29100 -26.46590
-115.10500 -26.60400
-114.52600 -26.72510
-113.94400 -26.78970
-113.75886 -26.79866
-113.60800 -26.80880
-112.97600 -26.83020
-112.94700 -26.72410
-112.68400 -26.80090
-112.65800 -26.55380
-112.68300 -26.28230
-112.67200 -26.03790
-112.62000 -25.93420
-112.55000 -25.92590
-112.54100 -25.78740
-112.45500 -25.78600
-112.43700 -25.68270
-112.36400 -25.66370
-112.36600 -25.56420
-112.38800 -25.42920
-112.44300 -25.19850
-112.45300 -25.05940
-111.97800 -25.02660
-111.97700 -24.89070
-112.04800 -24.65910
-112.10300 -24.44850
-112.12300 -24.22240
-112.09800 -24.11040
-111.71300 -24.03200
-111.76300 -23.85980
-111.83200 -23.72750
-111.86400 -23.47500
-111.87100 -23.32670
-111.81190 -23.27298
-111.97753 -23.22863
-112.17064 -23.20333
-112.39670 -23.17192
-112.62338 -23.14461
-113.04928 -23.11011
-113.47626 -23.10144
-113.91616 -23.10786
-114.35405 -23.07645
-114.52379 -23.02098
-114.55644 -22.94968
> EU
-29.33500 39.31500
-29.29710 39.25540
-29.26030 39.25020
-29.18810 39.27860
-29.14720 39.29370
-29.09040 39.32320
-29.04950 39.33820
-28.98190 39.36560
-28.95050 39.37890
-28.89460 39.41200
-28.85290 39.37250
-28.78120 39.29930
-28.74540 39.26260
-28.68630 39.21440
-28.66600 39.17900
-28.61920 39.12080
-28.56650 39.12990
-28.48360 39.15580
-28.45220 39.13390
-28.42040 39.09270
-28.39550 39.05800
-28.36490 39.02040
-28.34210 38.99310
-28.29190 38.93940
-28.21550 38.95240
-28.11990 38.96850
-28.05880 38.98270
-27.95460 39.00410
-27.79330 38.99980
-27.72230 38.94160
-27.67970 38.91360
-27.60610 38.86350
-27.55880 38.83630
-27.48440 38.78240
-27.23940 38.77960
-27.20330 38.69990
-27.17430 38.66580
-27.12900 38.60700
-27.08950 38.57060
-27.02890 38.49110
-27.00680 38.46350
-26.94080 38.40030
-26.90060 38.36010
-26.82990 38.27820
-26.71800 38.42020
-26.64740 38.35760
-26.61410 38.32400
-26.53230 38.25540
-26.49430 38.22250
-26.41660 38.14930
-26.37870 38.11640
-26.30210 38.04680
-26.17140 38.03600
-26.07520 37.96550
-26.04320 37.93550
-25.91620 37.83860
-25.80810 37.87830
-25.73410 37.81590
-25.69840 37.79020
-25.63320 37.72250
-25.53840 37.81810
-25.46380 37.75170
-25.42650 37.71850
-25.35470 37.66330
-25.26710 37.76920
-25.10130 37.64630
-24.98350 37.64410
-24.93150 37.60910
-24.89150 37.58390
-24.84510 37.55190
-24.81640 37.53280
-24.77480 37.50010
-24.73320 37.46730
-24.66690 37.41100
-24.70220 37.35190
-24.73790 37.27330
-24.74950 37.21740
-24.68050 37.12670
-24.63450 37.09460
-24.55410 37.01720
-24.50020 36.97070
-24.43370 36.91050
-24.38460 36.86330
-24.31110 36.79250
-24.25540 36.78100
-24.14610 36.78850
-24.04560 36.75480
-23.56970 36.64590
-22.89330 36.70200
-22.21600 36.75430
-21.50720 36.81970
-20.79730 36.88090
-20.24030 36.95430
-19.68230 37.02510
-19.64644 37.26030
-19.29342 37.36567
-18.93654 37.45661
-18.61029 37.54346
-18.29169 37.65540
-17.96591 37.79114
-17.65257 37.95318
-17.34980 38.15101
-17.05872 38.36581
-16.45031 38.79500
-15.78883 39.13464
-15.08194 39.34341
-14.35641 39.47946
-13.59807 39.59082
-12.83579 39.67070
-12.08395 39.69480
-11.34209 39.58378
-11.02454 39.45942
-10.74486 39.26546
-10.52240 38.99654
-10.33533 38.70023
-9.92912 38.08796
-9.42171 37.56117
-9.11805 37.38335
-8.78008 37.28629
-8.42664 37.24533
-8.07215 37.21403
-7.70872 37.17009
-7.35079 37.09454
-7.16484 37.03520
-6.88106 37.11706
-6.59737 37.16639
-6.30135 37.26507
-5.98066 37.42541
-5.54896 37.53642
-5.08026 37.69676
-4.56222 37.83244
-4.29087 37.91878
-3.95785 38.02979
-3.67416 38.06679
-3.35347 38.15313
-2.88477 38.27647
-2.50241 38.36281
-2.15705 38.44915
-1.81169 38.53549
-1.51567 38.62183
1.19611 39.00000
1.19611 36.47581
1.93232 36.69649
2.67546 36.89235
3.43732 37.05048
4.21082 37.13199
4.96638 37.12997
5.72178 37.10228
5.97383 37.15400
6.71754 37.24670
7.70620 37.44133
8.66179 37.71435
9.61738 37.71435
10.39095 37.98738
11.39204 38.30591
9.80000 39.00000
9.80000 43.35687
8.93481 43.81191
8.16124 44.26695
7.29666 44.63098
6.25007 45.08602
5.39779 45.41250
5.43421 45.94140
5.47133 46.47030
6.08291 47.14980
6.98268 47.61600
7.58001 47.89310
8.18373 48.16710
8.94620 48.54890
10.39710 48.51240
11.84540 48.45760
13.29000 48.38470
14.73000 48.29380
16.16440 48.18500
17.47290 47.93770
18.76860 47.67560
20.05100 47.39910
21.31960 47.10850
22.72150 46.92350
24.11330 46.72160
25.49430 46.50290
26.86380 46.26770
28.12360 45.89320
29.36620 45.50500
29.43160 44.91550
28.76470 43.98240
28.11840 43.04560
28.42640 42.27480
28.72690 41.50320
29.03020 40.98610
30.00710 41.06820
30.77450 40.90100
31.11610 40.91490
31.48170 40.97860
32.39250 41.16010
33.40530 41.32310
34.28640 41.45870
34.83170 41.42310
35.52720 41.30180
36.16860 41.14870
37.06200 40.90030
38.02130 40.56900
39.71870 41.24640
39.62890 41.99780
39.53700 42.74920
38.45570 43.31780
37.35410 43.87610
36.23190 44.42360
36.17304 44.53326
36.33102 45.07122
36.25570 45.56280
37.80230 45.63630
39.35230 45.68890
40.73220 45.51850
42.10340 45.33160
43.46510 45.12840
44.81680 44.90910
45.80290 44.51100
46.77550 44.10440
47.73460 43.68980
48.66920 43.21580
49.58930 42.73430
50.49520 42.24550
51.38700 41.74980
52.26500 41.24720
53.29210 40.95020
54.30990 40.64420
55.42210 40.60490
56.53280 40.55500
57.64170 40.49450
58.81050 40.77580
60.00000 40.87140
61.14219 40.84721
62.09728 40.84721
63.08911 40.88394
63.89727 41.21047
65.18298 41.77374
66.32175 42.41047
67.16664 43.10435
68.26868 43.32476
69.29724 43.54516
70.03193 43.74516
70.87682 43.92884
71.79519 44.30230
72.89722 44.78598
74.10946 45.18292
75.10129 45.02679
76.09312 44.86353
76.90128 44.94107
77.48903 45.19209
78.15025 45.77984
78.77474 46.14106
79.25229 46.37575
79.29310 46.69004
80.02371 47.46105
79.70065 47.01248
80.13392 48.04717
80.13392 48.85533
80.24412 49.88389
80.26249 50.48083
80.29800 51.35390
80.26249 51.93184
80.17065 52.42775
80.09718 52.99714
80.13392 53.54816
80.02371 54.13591
80.00535 54.57672
81.03391 54.72366
82.04411 54.79713
82.68696 54.77876
83.34818 54.79713
84.13797 54.83386
84.70736 54.87060
85.49715 54.98080
86.37878 54.96243
87.33388 54.98080
88.32571 55.05427
89.13387 55.01754
89.97876 55.03590
90.80528 54.72366
91.38720 54.48200
92.81830 54.51930
94.25140 54.53970
95.68530 54.54310
97.11890 54.52960
98.42510 54.26350
99.71410 53.98340
101.21200 53.30710
102.66300 52.61260
103.60100 52.10020
104.42000 51.42670
105.05800 51.76480
105.70500 52.09940
106.36200 52.43050
107.02900 52.75780
107.70600 53.08130
108.39300 53.40090
108.69100 54.15030
109.00000 54.89890
109.37500 55.33080
109.75800 55.76160
110.92400 56.22070
112.30500 56.29540
113.65600 56.41790
115.01500 56.52560
116.38200 56.61840
117.25300 56.80210
118.13300 56.97960
119.02100 57.15090
119.91800 57.31590
120.85100 57.30210
121.78400 57.28140
122.71500 57.25380
123.64500 57.21940
124.57300 57.17810
125.49900 57.12990
126.96000 56.77410
128.39300 56.40150
129.79800 56.01270
130.74700 55.86110
131.68800 55.70220
132.67400 55.49130
133.65000 55.27260
135.13800 55.06020
136.61000 54.82990
137.91800 54.58830
139.21100 54.33280
140.14500 54.10280
141.27800 54.07420
142.40900 54.03490
142.17900 54.57380
141.94300 55.11230
141.70000 55.65030
141.45100 56.18780
141.53500 56.65810
141.62100 57.12830
141.70900 57.59850
141.80000 58.06860
141.89300 58.53870
141.98800 59.00870
142.08600 59.47860
142.18700 59.93262
142.18700 61.93262
142.94300 62.18170
143.71500 62.51070
144.50200 62.83510
145.30600 63.14490
146.00800 63.58670
145.43521 64.16740
144.76244 64.49597
144.10398 64.78362
143.43345 65.04217
143.08856 65.17679
142.74536 65.31597
142.57562 65.37933
142.40665 65.44447
142.33300 65.47658
142.27281 65.52737
142.22910 65.53437
142.18709 65.53236
142.24225 65.53507
142.30244 65.53074
142.38855 65.53109
142.47474 65.53109
142.63581 65.53000
142.79696 65.52726
143.11440 65.51573
143.43121 65.49321
144.03930 65.38807
144.65011 65.31914
143.99760 65.60393
143.31640 65.81359
142.62018 65.99748
141.91500 66.14138
141.58720 66.18096
141.25785 66.20599
140.93756 66.23759
140.63018 66.32838
140.50655 66.39228
140.38269 66.45564
140.23036 66.52268
140.08127 66.59668
139.85575 66.78967
139.76686 67.06854
139.74404 67.24810
139.66358 67.41099
139.52555 67.57130
139.36804 67.71295
139.02786 67.97089
138.71035 68.25366
138.51083 68.60409
138.40128 68.99471
138.34232 69.18867
138.07300 69.26750
135.28900 69.69090
134.84075 69.69085
135.54308 69.39775
136.26397 69.15362
136.33669 69.13207
136.40957 69.11107
134.88292 69.15260
133.34929 69.23499
131.84902 69.35824
130.34789 69.47639
128.81210 69.80656
127.61200 70.00730
125.47900 70.53400
123.27800 71.13520
121.83500 71.52460
120.33200 71.90260
119.44500 72.41020
118.50700 72.91360
117.63400 73.79550
117.97900 74.67980
118.04140 75.09329
118.42328 75.59308
119.42996 76.28504
120.55440 76.77809
121.90721 77.30982
123.26715 77.82338
123.97180 78.05315
124.66128 78.32030
125.08609 78.59800
125.49203 78.84909
125.18800 78.99010
123.40800 79.75930
122.63900 80.20610
121.89800 80.64340
121.00400 81.11460
119.98400 81.59530
119.10000 82.08740
117.75500 82.29810
117.17100 82.53940
116.58200 82.74020
115.79300 83.01410
115.25800 83.15080
114.55800 83.32090
113.72300 83.51240
112.84300 83.67440
111.97400 83.82380
110.95900 83.96550
109.72700 84.10970
108.93900 84.19360
107.70900 84.29460
106.75900 84.36860
105.30200 84.48550
103.94300 84.57850
102.91800 84.66390
99.44360 84.91080
98.56820 84.96040
97.27270 85.02790
95.83920 85.10180
94.15540 85.15450
92.31290 85.22920
89.98040 85.29570
88.48630 85.34560
86.80210 85.41750
84.80210 85.49980
83.14250 85.55600
81.10270 85.63880
78.40340 85.76820
76.32600 85.91670
75.02930 85.98850
72.98420 86.10630
70.92590 86.20260
68.20810 86.30580
69.75220 86.47240
66.30100 86.60650
66.54380 86.65490
62.46250 86.75480
61.50560 86.80490
58.01780 86.78750
54.56140 86.74590
50.76960 86.70600
47.52350 86.64060
46.06250 86.59820
46.31370 86.56120
43.47950 86.49580
41.75550 86.43160
38.30130 86.29150
35.60670 86.16070
33.34000 86.05340
30.97210 85.90830
29.22940 85.81010
28.14330 85.87450
27.42730 85.86740
25.38280 85.85910
23.34700 85.81740
21.34260 85.79870
19.28450 85.68420
17.89000 85.59120
16.06260 85.48550
14.66620 85.37970
13.24200 85.28140
11.70360 85.13730
10.65880 85.06700
9.80850 84.95790
8.93766 85.00940
8.13393 84.89820
6.66540 84.76220
5.17750 84.63210
4.50755 84.57020
4.03467 84.59690
3.84819 84.56110
3.02402 84.46180
2.23513 84.34350
1.30114 84.22330
0.40499 84.10170
-0.46912 83.99650
-1.20617 83.86420
-2.36257 83.68960
-3.20433 83.57030
-4.14804 83.42960
-5.15419 83.24910
-6.23430 83.00040
-7.21240 82.86850
-5.86541 82.69120
-5.00975 82.51940
-3.69993 82.32810
-3.79607 82.29030
-4.53664 82.05010
-5.03297 81.91280
-3.90911 81.62030
-4.15208 81.55210
-4.64116 81.36970
-3.45411 81.25050
-2.41413 81.12560
-2.77949 80.99290
-3.36375 80.79220
-2.94156 80.75550
-1.68388 80.62480
-2.34079 80.37040
-1.76559 80.30850
-0.96877 80.21320
-0.25072 80.14210
0.62793 80.02640
1.48660 79.90850
2.37761 79.77970
3.29588 79.65750
4.39026 79.53270
3.90068 79.22800
3.43173 79.03020
3.85706 78.95000
4.69068 78.80580
5.59209 78.64100
6.77554 78.44380
7.78484 78.23470
7.82691 78.09030
7.77119 77.91120
7.88003 77.71190
7.80900 77.47910
7.67201 77.14840
7.62226 76.96920
7.61545 76.79850
7.56302 76.60150
7.55713 76.43070
7.48044 76.27900
7.51523 76.11670
7.59292 75.98070
7.60333 75.72890
7.84163 75.52730
7.94643 75.38170
8.21220 75.18820
8.46028 75.07550
8.63037 74.94620
8.78099 74.76310
8.98399 74.54260
9.13259 74.37720
9.15258 74.23270
9.20769 74.09640
9.20295 73.97950
9.13963 73.88200
9.03691 73.75850
8.95698 73.70640
8.83803 73.62820
8.65212 73.53350
8.38583 73.48530
8.15023 73.42720
7.79122 73.37120
7.39100 73.25240
7.07072 73.20350
6.78173 73.14480
6.05514 73.01880
5.58598 72.92430
4.96961 72.82050
4.29990 72.69700
3.60937 72.58010
2.78103 72.43310
1.99058 72.32780
0.90072 72.13370
0.28107 72.01480
-0.39248 71.91050
-0.97503 71.81510
-1.74252 71.68510
-2.39894 71.59170
-2.93661 71.50020
-3.69231 71.39800
-4.07245 71.49050
-4.36039 71.43240
-4.74125 71.33320
-5.15729 71.43100
-5.69853 71.53980
-5.91711 71.46460
-6.33268 71.38720
-6.89992 71.28160
-7.37469 71.12480
-7.94124 71.21660
-9.39339 71.45610
-10.35600 71.61450
-11.36950 71.77440
-11.71380 71.58780
-12.10570 71.39580
-12.35910 71.25220
-11.86490 71.14720
-11.35630 71.05190
-11.66890 70.87630
-12.00940 70.70650
-12.25490 70.56300
-12.90460 70.69770
-13.39570 70.77160
-13.89240 70.81580
-14.03640 70.72610
-14.23670 70.51740
-14.44790 70.35390
-14.73390 70.38910
-15.02450 70.16850
-15.42450 69.83970
-15.71560 69.54990
-16.03350 69.26470
-16.26270 69.03790
-16.48740 68.80840
-17.15370 68.86490
-17.39170 68.69950
-17.82910 68.39980
-18.22030 68.06620
-18.48990 67.73760
-18.75620 67.44340
-19.09880 67.05810
-18.11800 66.93370
-18.24730 66.78070
-17.47350 66.68520
-17.71780 66.36450
-16.50680 66.20300
-16.50680 64.48920
-18.62610 64.18230
-19.04070 63.98490
-19.23770 63.66250
-20.09670 63.84940
-20.73130 63.81710
-21.29760 63.86720
-22.06560 63.72240
-22.53740 63.63610
-22.87200 63.66730
-23.05860 63.64980
-23.33030 63.65080
-23.48730 63.56820
-23.74050 63.47370
-24.00950 63.35510
-24.25470 63.22970
-24.51930 63.11020
-24.72070 62.99220
-24.88810 62.92380
-25.03510 62.80030
-25.15640 62.71000
-25.31120 62.61370
-25.44870 62.62000
-25.64350 62.50310
-25.87480 62.37510
-26.10720 62.23730
-26.30890 62.10500
-26.52650 61.93920
-26.76800 61.82520
-27.03160 61.66540
-27.22570 61.53200
-27.38880 61.39760
-27.58170 61.25190
-27.85450 61.06640
-28.02370 60.95630
-28.19240 60.84830
-28.40770 60.70450
-28.64160 60.56610
-28.82860 60.41860
-28.92660 60.33340
-29.02850 60.33990
-29.11800 60.27310
-29.22450 60.16780
-29.37170 60.08270
-29.50750 59.96920
-29.63620 59.86780
-29.84950 59.75080
-30.04290 59.61820
-30.16300 59.52860
-30.30550 59.38970
-30.45270 59.23830
-30.64660 59.09250
-30.79110 58.94080
-30.97700 58.97590
-31.03920 58.89230
-31.17800 58.80480
-31.30310 58.68960
-31.42740 58.57430
-31.55600 58.44660
-31.74510 58.46830
-31.79960 58.39670
-31.87230 58.34020
-31.98350 58.24920
-32.12250 58.14840
-32.28050 57.99790
-32.47240 58.00620
-32.49180 57.95660
-32.61880 57.88000
-32.70820 57.77350
-32.80650 57.64220
-32.91770 57.66710
-32.96410 57.60760
-33.01040 57.54800
-33.07030 57.45120
-33.20310 57.28490
-33.37730 57.26470
-33.49660 57.26430
-33.50900 57.16250
-33.53540 57.08800
-33.56620 57.00100
-33.58710 56.87450
-33.68240 56.87150
-33.79610 56.88330
-33.97810 56.90190
-34.00350 56.82740
-34.04300 56.77990
-34.07240 56.73880
-34.21850 56.74620
-34.24740 56.65920
-34.32140 56.57660
-34.34600 56.50200
-34.44020 56.49850
-34.46040 56.43630
-34.49270 56.33680
-34.51040 56.21010
-34.55830 56.06080
-34.62030 55.93860
-34.63760 55.81190
-34.87740 55.84850
-34.90060 55.77380
-34.97170 55.69090
-35.08040 55.48350
-35.17320 55.32590
-35.25080 55.14120
-35.33860 54.99590
-35.21200 54.97070
-35.27390 54.91270
-35.28900 54.78600
-35.36510 54.67810
-35.41230 54.51610
-35.48780 54.33130
-35.31320 54.32690
-35.12100 54.30760
-35.14690 54.22040
-35.20120 54.11050
-35.26980 53.95070
-35.32720 53.82820
-35.39500 53.66840
-35.45170 53.54590
-35.24570 53.51210
-35.25650 53.47470
-35.28180 53.38750
-35.32480 53.23800
-35.18280 53.21050
-35.18370 53.13360
-35.16130 52.99010
-35.15610 52.86110
-35.13760 52.70510
-35.01070 52.70440
-34.88370 52.70360
-34.92480 52.70800
-34.57190 52.68220
-34.17450 52.66300
-33.71190 52.64770
-33.33540 52.62810
-33.02040 52.61510
-32.85700 52.59460
-32.64860 52.58100
-32.35890 52.55640
-32.05350 52.51600
-31.86600 52.50380
-31.58170 52.46490
-31.25730 52.41970
-31.26510 52.34270
-31.25270 52.26280
-31.26840 52.10890
-31.05790 52.10480
-30.80740 52.09450
-30.37640 52.05680
-30.02620 52.02970
-30.03610 51.95280
-30.01100 51.85750
-30.00600 51.76520
-30.00100 51.62050
-29.99610 51.42360
-30.00100 51.25440
-29.97650 51.10670
-29.98150 50.98980
-29.94250 50.93130
-29.90850 50.86050
-29.87460 50.78970
-29.83090 50.74350
-29.76800 50.69410
-29.66190 50.59840
-29.53680 50.49950
-29.50810 50.46860
-29.42660 50.41590
-29.32180 50.31990
-29.19820 50.22060
-29.12650 50.19540
-29.02170 50.15150
-28.99470 50.06810
-28.98680 49.98800
-28.96000 49.90470
-28.89520 49.81480
-28.86860 49.73140
-28.81810 49.65700
-28.71830 49.65280
-28.56190 49.63860
-28.54460 49.58300
-28.48610 49.48060
-28.45180 49.36930
-28.42620 49.28580
-28.35300 49.22010
-28.31740 49.16110
-28.26310 49.09870
-28.20580 48.99620
-28.16220 48.90930
-28.08680 48.80340
-28.03530 48.68850
-28.01080 48.60500
-27.88950 48.60890
-27.76020 48.58480
-27.74940 48.51690
-27.73060 48.42100
-27.71180 48.32520
-27.70360 48.20500
-27.65360 48.09000
-27.63510 47.99420
-27.62180 47.88610
-27.59050 47.77460
-27.56440 47.65080
-27.46350 47.65780
-27.44800 47.60200
-27.44290 47.52190
-27.46360 47.47310
-27.45850 47.39290
-27.46120 47.34060
-27.47410 47.26400
-27.44070 47.20470
-27.38190 47.11400
-27.33360 46.99900
-27.34660 46.92230
-27.37740 46.84910
-27.37750 46.75680
-27.43600 46.75510
-27.44370 46.69060
-27.44630 46.63830
-27.47170 46.48500
-27.48680 46.35600
-27.48930 46.30370
-27.51200 46.20270
-27.56490 46.21310
-27.57230 46.14860
-27.58470 46.07190
-27.60200 45.98300
-27.67730 45.98460
-27.69710 45.93580
-27.69940 45.88350
-27.73940 45.87820
-27.75920 45.82930
-27.77340 45.70030
-27.79520 45.59920
-27.82460 45.52590
-27.87700 45.53620
-27.86440 45.52060
-27.86160 45.48050
-27.87140 45.45610
-27.92360 45.46630
-27.93820 45.42960
-27.93540 45.38960
-27.93740 45.33730
-27.97210 45.34410
-27.97900 45.27960
-27.98570 45.21510
-27.98770 45.16280
-27.99450 45.09830
-28.07630 45.12740
-28.10020 45.06630
-28.11460 45.02960
-28.13850 44.96850
-28.15750 44.91960
-28.10570 44.90940
-28.14210 44.86390
-28.14380 44.81160
-28.16760 44.75050
-28.21500 44.62810
-28.25740 44.51800
-28.28250 44.40460
-28.32000 44.30670
-28.36660 44.18430
-28.43490 44.19760
-28.43640 44.14530
-28.45490 44.09630
-28.48270 44.02290
-28.48090 43.93050
-28.51310 43.84480
-28.52370 43.76800
-28.79640 43.76840
-28.84050 43.69810
-28.88450 43.62780
-28.93390 43.49290
-29.00790 43.38900
-29.09140 43.20820
-29.17360 43.07960
-29.31680 43.08070
-29.31750 43.02840
-29.32680 42.95150
-29.34920 42.83780
-29.37150 42.72400
-29.32140 42.71450
-29.31770 42.67440
-29.33940 42.61300
-29.36960 42.52710
-29.39180 42.41330
-29.43470 42.29050
-29.22260 42.28910
-29.22330 42.23680
-29.24490 42.17540
-29.24200 42.08310
-29.26060 41.92940
-29.16160 41.91010
-29.20030 41.79970
-29.20600 41.68280
-29.24520 41.52000
-29.29200 41.38490
-29.32230 41.24670
-29.22860 41.21530
-29.24200 41.12610
-29.25600 40.98470
-29.27770 40.87100
-29.29990 40.70500
-29.34600 40.56990
-29.56050 40.59870
-29.57700 40.54950
-29.56950 40.46950
-29.59840 40.38350
-29.63130 40.28510
-29.63980 40.20820
-29.65650 40.10680
-29.58810 40.10650
-29.58020 40.07880
-29.61270 40.03280
-29.60890 39.99280
-29.76980 39.39960
> GP
-102.08200 2.57438
-102.07700 2.50246
-102.08500 2.48615
-102.08500 2.41199
-102.09000 2.39090
-102.08800 2.32729
-102.08000 2.30830
-102.07500 2.16104
-102.06700 2.13734
-102.07500 2.02449
-102.07600 1.97154
-102.08800 1.90349
-102.10400 1.90382
-102.13300 1.77843
-102.26200 1.75155
-102.23000 1.54137
-102.25700 1.52778
-102.22200 1.36110
-102.24300 1.34857
-102.20300 1.22065
-102.22300 1.21398
-102.18100 1.13426
-102.08200 1.20646
-101.95900 1.26876
-101.82500 1.33439
-101.64400 1.40377
-101.58000 1.31773
-101.48700 1.38887
-101.42300 1.33816
-101.34800 1.39907
-101.31500 1.35013
-101.19500 1.42309
-101.15300 1.38576
-101.04700 1.47077
-101.07400 1.51368
-100.96400 1.65513
-100.97300 1.67885
-100.90800 1.74348
-100.97400 1.83189
-101.04900 1.90637
-101.14900 1.98018
-101.27000 2.04850
-101.35600 2.10436
-101.43800 2.16015
-101.51200 2.23226
-101.49000 2.60499
-101.69700 2.63971
-101.87800 2.64213
-102.06800 2.63532
> IN
58.23920 12.74550
58.01740 12.28350
57.79630 11.82130
57.57600 11.35890
57.35640 10.89630
57.13750 10.43360
56.91920 9.97076
56.97750 9.85724
57.02890 9.85747
57.26060 9.68141
57.49060 9.94156
58.06300 9.53244
58.01840 9.45008
58.26250 9.29259
58.14760 9.08978
58.43020 8.86262
58.25140 8.64690
58.61060 8.40075
58.91830 8.16694
58.88000 8.09719
59.30920 7.76825
59.21970 7.67308
59.69970 7.31217
60.17890 6.95076
60.03830 6.76686
60.67010 6.30983
61.14170 5.90952
61.65730 5.48967
61.52930 5.26156
61.99970 4.91131
62.45680 4.52272
63.00230 4.10805
62.86780 3.89294
63.33070 3.63067
63.38820 3.70015
63.81920 3.48212
63.88980 3.60222
64.61810 3.21695
64.68220 3.29895
65.21280 2.92078
65.48900 3.29907
65.96260 2.97150
66.37950 2.75200
66.17940 2.39253
65.99230 2.05200
66.33280 1.85871
66.67280 1.62094
66.49250 1.33138
66.86980 1.06795
66.65730 0.72201
67.15940 0.33713
66.83920 -0.03884
67.20890 -0.33984
67.02310 -0.57788
67.66200 -1.03960
67.36710 -1.43996
67.92910 -1.91296
67.91960 -1.85492
67.98540 -1.77988
68.02191 -1.74050
68.05835 -1.70112
68.11305 -1.64669
68.18423 -1.61826
68.78528 -1.28779
69.22534 -0.74476
69.44595 -0.46710
69.71119 -0.23345
69.85230 0.20766
70.68190 0.59774
71.51090 0.98819
72.34610 1.37226
73.17420 1.76337
74.00850 2.15474
74.84220 2.53977
75.67540 2.92509
76.50810 3.31730
77.34040 3.70313
78.17870 4.08917
79.01660 4.46881
79.85390 4.85529
80.69080 5.23536
81.52720 5.62220
82.14480 6.21387
82.76860 6.80489
83.39170 7.39519
84.01430 7.98473
84.64300 8.57345
84.85375 8.97152
85.03297 9.63903
85.47875 10.13704
86.19675 10.31687
86.53200 10.33410
87.39000 10.50420
88.24790 10.66180
89.10560 10.82640
89.96310 10.98490
90.82700 11.13740
91.59070 11.30030
91.64260 11.79150
91.70000 12.28320
91.88890 13.15370
92.06820 13.71490
92.42650 14.37450
92.89790 15.12120
93.25880 15.80090
93.45290 16.57230
93.58160 17.23480
93.65944 17.75419
93.55167 17.77125
93.44088 17.88467
93.37543 18.03055
93.34642 18.18346
93.31880 18.33533
93.22047 18.41939
93.11309 18.50058
93.09854 18.57323
93.11432 18.64556
93.13668 18.68278
93.15386 18.72212
93.08199 18.83356
92.95572 18.90807
92.89368 18.95592
92.84385 19.01584
92.81291 19.07521
92.77639 19.13103
92.65849 19.22735
92.53563 19.31841
92.45687 19.40375
92.39289 19.50076
92.45888 19.44197
92.52495 19.38340
92.30283 19.66033
92.26539 20.02592
92.28906 20.39391
92.25162 20.75773
92.09789 21.06963
91.91848 21.37042
91.76886 21.69598
91.63664 22.02908
91.36555 22.69109
91.13059 23.36615
91.05554 23.70814
91.01887 24.05610
91.04595 24.40099
91.20393 24.70276
90.66680 24.61010
90.19300 25.38530
89.71300 26.15900
89.41083 26.81101
88.27060 26.78600
87.69870 26.80900
87.16720 26.92400
86.77240 26.57020
86.43320 26.63790
86.20360 26.99660
85.57060 27.07210
84.60220 27.20760
84.10980 27.35160
83.61610 27.49380
82.89030 27.78190
82.15150 28.06470
81.31690 28.31530
80.99790 28.68670
80.49950 28.87110
80.18610 28.99580
79.74620 29.03960
79.15820 29.29090
78.86980 29.57860
78.38180 29.78850
78.03340 30.12760
77.60260 30.46050
76.96980 30.63470
76.47720 31.04770
75.68010 31.53050
75.42840 32.36270
75.12300 32.54168
74.78441 32.68872
74.45541 32.85239
74.29991 32.90693
74.13299 32.90631
73.99880 32.93006
73.89057 33.01315
73.79084 33.13767
73.66659 33.23395
73.55298 33.20169
73.49221 33.08549
73.42722 32.93443
73.32023 32.81146
73.18151 32.73889
73.03018 32.69711
72.69066 32.64818
72.35656 32.57426
72.06640 32.45581
71.77755 32.49140
71.57675 32.73491
71.28410 32.79680
71.13902 32.66369
71.18439 32.42664
71.06718 32.23013
70.78321 32.18240
70.28520 31.76440
70.44140 31.31120
70.59610 30.85780
70.61100 30.30360
70.62570 29.74930
70.42610 29.10200
69.71310 28.78120
69.52896 28.63313
69.24777 28.47546
68.92848 28.43697
68.63121 28.56482
68.42468 28.82047
68.22364 29.12328
67.93194 29.32215
67.63478 29.23681
67.56840 28.43210
67.66700 28.26690
67.65600 27.77360
67.57490 26.94640
67.58000 26.37860
67.81074 26.10068
67.95074 25.79783
67.97263 25.48168
67.86324 25.18417
67.64325 24.95296
67.35730 24.80910
67.00247 24.70701
66.64326 24.62129
66.33850 24.45680
65.70830 24.38600
65.07890 24.31250
65.02820 24.38240
64.65110 24.03830
64.27540 23.69360
63.63130 23.20080
62.87720 22.68300
62.50250 22.38500
62.13250 22.08280
62.09630 21.42490
61.84810 21.12580
61.49190 20.64430
61.23010 20.23030
60.96960 19.81270
60.71220 19.30570
60.45640 18.79830
60.21480 18.23970
60.06190 17.45770
60.02020 16.71260
59.96420 16.14230
59.90860 15.57210
59.64230 15.24180
59.40960 14.89510
> JF
-128.23167 48.49517
-128.79549 48.49517
-129.14700 48.47600
-128.94000 48.32360
-129.19000 47.83540
-128.93800 47.72700
-129.25900 47.06470
-129.57200 46.40150
-129.80300 46.43320
-129.91700 46.22910
-130.05100 46.19580
-130.07300 45.94270
-129.86900 45.89600
-129.93600 45.73620
-130.18700 45.41400
-130.06900 45.28540
-130.36700 44.92950
-130.48000 44.58920
-129.49800 44.20750
-128.52800 43.81760
-127.57100 43.41950
-126.62700 43.01360
-126.20500 43.03520
-125.55100 43.07660
-125.34300 43.14260
-125.39400 43.26710
-125.47400 43.42600
-125.48000 43.73750
-125.45000 43.92540
-125.42900 44.00230
-125.36200 44.06630
-125.37200 44.32260
-125.37200 44.52270
-125.37600 44.66750
-125.43400 44.72540
-125.43700 44.88130
-125.43500 45.10360
-125.51700 45.47380
-125.65500 45.94610
-125.77300 46.29500
-125.87600 46.64330
-125.99800 46.96970
-126.08500 47.35030
-126.37000 47.74800
-126.48600 47.99560
-126.73300 48.29100
-127.01800 48.56460
-127.51232 48.49517
> JZ
-112.04100 -31.77370
-112.06300 -31.94850
-112.06500 -32.11440
-112.15100 -32.34260
-112.35600 -32.32780
-112.41500 -32.48890
-112.41800 -32.79380
-112.44200 -33.11200
-112.46000 -33.39890
-112.50400 -33.64980
-112.60400 -33.66260
-112.62800 -33.99880
-112.56200 -34.29960
-112.41700 -34.55620
-112.18700 -34.67420
-111.75600 -34.81140
-111.39900 -34.91230
-111.12600 -34.99480
-110.82700 -35.09080
-110.52700 -35.06130
-110.32600 -34.94600
-110.14100 -34.81710
-109.91900 -34.70190
-109.69100 -34.60920
-109.25900 -34.54460
-109.27700 -34.20370
-109.27000 -33.91670
-109.20500 -33.70190
-109.32300 -33.39170
-109.41000 -33.14010
-109.18300 -33.02040
-108.97200 -32.93650
-109.20600 -32.66150
-109.43500 -32.40000
-109.79100 -32.11520
-110.21000 -31.91980
-110.68700 -31.71500
-111.20200 -31.56380
-111.66000 -31.55640
-112.02300 -31.53620
> MA
143.50300 11.99360
144.15700 12.28960
144.61900 12.52060
145.02400 12.71120
145.34900 12.81410
145.69100 13.04660
146.22100 13.60150
146.70100 14.21580
146.96200 14.96610
147.05400 15.65300
147.08700 16.52340
147.15600 17.28310
147.11100 18.06020
147.12000 18.64650
147.01900 19.17240
146.96000 19.74520
146.70700 20.30340
146.41900 20.80510
146.22200 21.33060
145.94500 21.72980
145.56200 22.20150
144.79200 22.71230
143.70600 23.25010
142.88600 23.10120
142.25700 23.00910
142.56000 22.66200
142.77400 22.37660
142.99700 22.13850
143.15000 21.92780
143.21800 21.65900
143.28000 21.32030
143.32100 21.06060
143.28100 20.96190
143.39200 20.72830
143.49300 20.53250
143.57500 20.39680
143.84200 20.41780
143.97000 20.11090
144.08300 19.85770
144.13700 19.75330
144.25200 19.72530
144.52700 19.12340
144.54300 19.07270
144.60100 18.75560
144.62600 18.35910
144.66300 18.16560
144.70600 18.01980
144.77300 17.82950
144.97000 17.53460
144.67100 17.42010
144.79800 16.97930
144.84100 16.47800
144.79200 16.12270
144.79900 15.65310
144.45300 15.52560
144.53000 14.91670
144.33400 14.88450
144.21600 14.65570
144.08200 14.63940
143.97600 14.08700
143.94200 13.81080
143.90300 13.62350
143.87100 13.54090
143.77100 13.26760
143.66200 13.05770
143.51000 12.82220
143.40300 12.69470
143.23900 12.47810
143.14300 12.26500
143.10600 12.03010
> NA
-45.79150 25.25420
-45.49880 25.19180
-45.29600 25.63670
-45.09170 26.08140
-44.89890 26.05540
-44.81630 26.27000
-44.86660 26.27960
-44.68700 26.76680
-44.50590 27.25380
-44.38310 27.23550
-44.20310 27.67130
-44.02170 28.10690
-43.94230 28.10490
-43.56320 28.81080
-43.48280 28.80210
-43.08820 29.46910
-43.03730 29.47140
-42.72860 30.06970
-42.13640 29.97330
-41.78570 30.60560
-41.43040 31.23700
-41.18360 31.19410
-40.71000 31.81730
-40.55260 31.80250
-40.12930 32.44400
-39.69990 33.08410
-39.58600 33.06730
-39.39930 33.76760
-38.59720 33.63700
-37.79750 33.50120
-37.67760 33.73620
-37.53280 33.70520
-37.33640 34.13620
-37.24460 34.12380
-37.04610 34.56690
-36.86180 34.55420
-36.78460 34.71220
-36.62310 34.69290
-36.37310 35.27980
-35.55840 35.14770
-34.74640 35.01020
-34.45950 35.62460
-34.33540 35.61600
-34.14240 36.07940
-34.05680 36.07130
-33.98160 36.22120
-33.77170 36.18500
-33.59470 36.74220
-33.31350 36.69100
-33.22460 36.94080
-33.00490 36.91590
-32.94310 37.06540
-32.70770 37.03330
-32.64560 37.17630
-32.39460 37.13690
-32.28260 37.39150
-31.51640 37.28230
-31.37130 37.70490
-31.07060 37.68020
-30.60550 38.40250
-30.43010 38.38830
-30.17140 38.88800
-29.90910 39.38710
-29.76980 39.39960
-29.60890 39.99280
-29.61270 40.03280
-29.58020 40.07880
-29.58810 40.10650
-29.65650 40.10680
-29.63980 40.20820
-29.63130 40.28510
-29.59840 40.38350
-29.56950 40.46950
-29.57700 40.54950
-29.56050 40.59870
-29.34600 40.56990
-29.29990 40.70500
-29.27770 40.87100
-29.25600 40.98470
-29.24200 41.12610
-29.22860 41.21530
-29.32230 41.24670
-29.29200 41.38490
-29.24520 41.52000
-29.20600 41.68280
-29.20030 41.79970
-29.16160 41.91010
-29.26060 41.92940
-29.24200 42.08310
-29.24490 42.17540
-29.22330 42.23680
-29.22260 42.28910
-29.43470 42.29050
-29.39180 42.41330
-29.36960 42.52710
-29.33940 42.61300
-29.31770 42.67440
-29.32140 42.71450
-29.37150 42.72400
-29.34920 42.83780
-29.32680 42.95150
-29.31750 43.02840
-29.31680 43.08070
-29.17360 43.07960
-29.09140 43.20820
-29.00790 43.38900
-28.93390 43.49290
-28.88450 43.62780
-28.84050 43.69810
-28.79640 43.76840
-28.52370 43.76800
-28.51310 43.84480
-28.48090 43.93050
-28.48270 44.02290
-28.45490 44.09630
-28.43640 44.14530
-28.43490 44.19760
-28.36660 44.18430
-28.32000 44.30670
-28.28250 44.40460
-28.25740 44.51800
-28.21500 44.62810
-28.16760 44.75050
-28.14380 44.81160
-28.14210 44.86390
-28.10570 44.90940
-28.15750 44.91960
-28.13850 44.96850
-28.11460 45.02960
-28.10020 45.06630
-28.07630 45.12740
-27.99450 45.09830
-27.98770 45.16280
-27.98570 45.21510
-27.97900 45.27960
-27.97210 45.34410
-27.93740 45.33730
-27.93540 45.38960
-27.93820 45.42960
-27.92360 45.46630
-27.87140 45.45610
-27.86160 45.48050
-27.86440 45.52060
-27.87700 45.53620
-27.82460 45.52590
-27.79520 45.59920
-27.77340 45.70030
-27.75920 45.82930
-27.73940 45.87820
-27.69940 45.88350
-27.69710 45.93580
-27.67730 45.98460
-27.60200 45.98300
-27.58470 46.07190
-27.57230 46.14860
-27.56490 46.21310
-27.51200 46.20270
-27.48930 46.30370
-27.48680 46.35600
-27.47170 46.48500
-27.44630 46.63830
-27.44370 46.69060
-27.43600 46.75510
-27.37750 46.75680
-27.37740 46.84910
-27.34660 46.92230
-27.33360 46.99900
-27.38190 47.11400
-27.44070 47.20470
-27.47410 47.26400
-27.46120 47.34060
-27.45850 47.39290
-27.46360 47.47310
-27.44290 47.52190
-27.44800 47.60200
-27.46350 47.65780
-27.56440 47.65080
-27.59050 47.77460
-27.62180 47.88610
-27.63510 47.99420
-27.65360 48.09000
-27.70360 48.20500
-27.71180 48.32520
-27.73060 48.42100
-27.74940 48.51690
-27.76020 48.58480
-27.88950 48.60890
-28.01080 48.60500
-28.03530 48.68850
-28.08680 48.80340
-28.16220 48.90930
-28.20580 48.99620
-28.26310 49.09870
-28.31740 49.16110
-28.35300 49.22010
-28.42620 49.28580
-28.45180 49.36930
-28.48610 49.48060
-28.54460 49.58300
-28.56190 49.63860
-28.71830 49.65280
-28.81810 49.65700
-28.86860 49.73140
-28.89520 49.81480
-28.96000 49.90470
-28.98680 49.98800
-28.99470 50.06810
-29.02170 50.15150
-29.12650 50.19540
-29.19820 50.22060
-29.32180 50.31990
-29.42660 50.41590
-29.50810 50.46860
-29.53680 50.49950
-29.66190 50.59840
-29.76800 50.69410
-29.83090 50.74350
-29.87460 50.78970
-29.90850 50.86050
-29.94250 50.93130
-29.98150 50.98980
-29.97650 51.10670
-30.00100 51.25440
-29.99610 51.42360
-30.00100 51.62050
-30.00600 51.76520
-30.01100 51.85750
-30.03610 51.95280
-30.02620 52.02970
-30.37640 52.05680
-30.80740 52.09450
-31.05790 52.10480
-31.26840 52.10890
-31.25270 52.26280
-31.26510 52.34270
-31.25730 52.41970
-31.58170 52.46490
-31.86600 52.50380
-32.05350 52.51600
-32.35890 52.55640
-32.64860 52.58100
-32.85700 52.59460
-33.02040 52.61510
-33.33540 52.62810
-33.71190 52.64770
-34.17450 52.66300
-34.57190 52.68220
-34.92480 52.70800
-34.88370 52.70360
-35.01070 52.70440
-35.13760 52.70510
-35.15610 52.86110
-35.16130 52.99010
-35.18370 53.13360
-35.18280 53.21050
-35.32480 53.23800
-35.28180 53.38750
-35.25650 53.47470
-35.24570 53.51210
-35.45170 53.54590
-35.39500 53.66840
-35.32720 53.82820
-35.26980 53.95070
-35.20120 54.11050
-35.14690 54.22040
-35.12100 54.30760
-35.31320 54.32690
-35.48780 54.33130
-35.41230 54.51610
-35.36510 54.67810
-35.28900 54.78600
-35.27390 54.91270
-35.21200 54.97070
-35.33860 54.99590
-35.25080 55.14120
-35.17320 55.32590
-35.08040 55.48350
-34.97170 55.69090
-34.90060 55.77380
-34.87740 55.84850
-34.63760 55.81190
-34.62030 55.93860
-34.55830 56.06080
-34.51040 56.21010
-34.49270 56.33680
-34.46040 56.43630
-34.44020 56.49850
-34.34600 56.50200
-34.32140 56.57660
-34.24740 56.65920
-34.21850 56.74620
-34.07240 56.73880
-34.04300 56.77990
-34.00350 56.82740
-33.97810 56.90190
-33.79610 56.88330
-33.68240 56.87150
-33.58710 56.87450
-33.56620 57.00100
-33.53540 57.08800
-33.50900 57.16250
-33.49660 57.26430
-33.37730 57.26470
-33.20310 57.28490
-33.07030 57.45120
-33.01040 57.54800
-32.96410 57.60760
-32.91770 57.66710
-32.80650 57.64220
-32.70820 57.77350
-32.61880 57.88000
-32.49180 57.95660
-32.47240 58.00620
-32.28050 57.99790
-32.12250 58.14840
-31.98350 58.24920
-31.87230 58.34020
-31.79960 58.39670
-31.74510 58.46830
-31.55600 58.44660
-31.42740 58.57430
-31.30310 58.68960
-31.17800 58.80480
-31.03920 58.89230
-30.97700 58.97590
-30.79110 58.94080
-30.64660 59.09250
-30.45270 59.23830
-30.30550 59.38970
-30.16300 59.52860
-30.04290 59.61820
-29.84950 59.75080
-29.63620 59.86780
-29.50750 59.96920
-29.37170 60.08270
-29.22450 60.16780
-29.11800 60.27310
-29.02850 60.33990
-28.92660 60.33340
-28.82860 60.41860
-28.64160 60.56610
-28.40770 60.70450
-28.19240 60.84830
-28.02370 60.95630
-27.85450 61.06640
-27.58170 61.25190
-27.38880 61.39760
-27.22570 61.53200
-27.03160 61.66540
-26.76800 61.82520
-26.52650 61.93920
-26.30890 62.10500
-26.10720 62.23730
-25.87480 62.37510
-25.64350 62.50310
-25.44870 62.62000
-25.31120 62.61370
-25.15640 62.71000
-25.03510 62.80030
-24.88810 62.92380
-24.72070 62.99220
-24.51930 63.11020
-24.25470 63.22970
-24.00950 63.35510
-23.74050 63.47370
-23.48730 63.56820
-23.33030 63.65080
-23.05860 63.64980
-22.87200 63.76730
-22.87200 64.40000
-19.50000 64.40000
-17.71780 65.50000
-17.71780 66.36450
-17.47350 66.68520
-18.24730 66.78070
-18.11800 66.93370
-19.09880 67.05810
-18.75620 67.44340
-18.48990 67.73760
-18.22030 68.06620
-17.82910 68.39980
-17.39170 68.69950
-17.15370 68.86490
-16.48740 68.80840
-16.26270 69.03790
-16.03350 69.26470
-15.71560 69.54990
-15.42450 69.83970
-15.02450 70.16850
-14.73390 70.38910
-14.44790 70.35390
-14.23670 70.51740
-14.03640 70.72610
-13.89240 70.81580
-13.39570 70.77160
-12.90460 70.69770
-12.25490 70.56300
-12.00940 70.70650
-11.66890 70.87630
-11.35630 71.05190
-11.86490 71.14720
-12.35910 71.25220
-12.10570 71.39580
-11.71380 71.58780
-11.36950 71.77440
-10.35600 71.61450
-9.39339 71.45610
-7.94124 71.21660
-7.37469 71.12480
-6.89992 71.28160
-6.33268 71.38720
-5.91711 71.46460
-5.69853 71.53980
-5.15729 71.43100
-4.74125 71.33320
-4.36039 71.43240
-4.07245 71.49050
-3.69231 71.39800
-2.93661 71.50020
-2.39894 71.59170
-1.74252 71.68510
-0.97503 71.81510
-0.39248 71.91050
0.28107 72.01480
0.90072 72.13370
1.99058 72.32780
2.78103 72.43310
3.60937 72.58010
4.29990 72.69700
4.96961 72.82050
5.58598 72.92430
6.05514 73.01880
6.78173 73.14480
7.07072 73.20350
7.39100 73.25240
7.79122 73.37120
8.15023 73.42720
8.38583 73.48530
8.65212 73.53350
8.83803 73.62820
8.95698 73.70640
9.03691 73.75850
9.13963 73.88200
9.20295 73.97950
9.20769 74.09640
9.15258 74.23270
9.13259 74.37720
8.98399 74.54260
8.78099 74.76310
8.63037 74.94620
8.46028 75.07550
8.21220 75.18820
7.94643 75.38170
7.84163 75.52730
7.60333 75.72890
7.59292 75.98070
7.51523 76.11670
7.48044 76.27900
7.55713 76.43070
7.56302 76.60150
7.61545 76.79850
7.62226 76.96920
7.67201 77.14840
7.80900 77.47910
7.88003 77.71190
7.77119 77.91120
7.82691 78.09030
7.78484 78.23470
6.77554 78.44380
5.59209 78.64100
4.69068 78.80580
3.85706 78.95000
3.43173 79.03020
3.90068 79.22800
4.39026 79.53270
3.29588 79.65750
2.37761 79.77970
1.48660 79.90850
0.62793 80.02640
-0.25072 80.14210
-0.96877 80.21320
-1.76559 80.30850
-2.34079 80.37040
-1.68388 80.62480
-2.94156 80.75550
-3.36375 80.79220
-2.77949 80.99290
-2.41413 81.12560
-3.45411 81.25050
-4.64116 81.36970
-4.15208 81.55210
-3.90911 81.62030
-5.03297 81.91280
-4.53664 82.05010
-3.79607 82.29030
-3.69993 82.32810
-5.00975 82.51940
-5.86541 82.69120
-7.21240 82.86850
-6.23430 83.00040
-5.15419 83.24910
-4.14804 83.42960
-3.20433 83.57030
-2.36257 83.68960
-1.20617 83.86420
-0.46912 83.99650
0.40499 84.10170
1.30114 84.22330
2.23513 84.34350
3.02402 84.46180
3.84819 84.56110
4.03467 84.59690
4.50755 84.57020
5.17750 84.63210
6.66540 84.76220
8.13393 84.89820
8.93766 85.00940
9.80850 84.95790
10.65880 85.06700
11.70360 85.13730
13.24200 85.28140
14.66620 85.37970
16.06260 85.48550
17.89000 85.59120
19.28450 85.68420
21.34260 85.79870
23.34700 85.81740
25.38280 85.85910
27.42730 85.86740
28.14330 85.87450
29.22940 85.81010
30.97210 85.90830
33.34000 86.05340
35.60670 86.16070
38.30130 86.29150
41.75550 86.43160
43.47950 86.49580
46.31370 86.56120
46.06250 86.59820
47.52350 86.64060
50.76960 86.70600
54.56140 86.74590
58.01780 86.78750
61.50560 86.80490
62.46250 86.75480
66.54380 86.65490
66.30100 86.60650
69.75220 86.47240
68.20810 86.30580
70.92590 86.20260
72.98420 86.10630
75.02930 85.98850
76.32600 85.91670
78.40340 85.76820
81.10270 85.63880
83.14250 85.55600
84.80210 85.49980
86.80210 85.41750
88.48630 85.34560
89.98040 85.29570
92.31290 85.22920
94.15540 85.15450
95.83920 85.10180
97.27270 85.02790
98.56820 84.96040
99.44360 84.91080
102.91800 84.66390
103.94300 84.57850
105.30200 84.48550
106.75900 84.36860
107.70900 84.29460
108.93900 84.19360
109.72700 84.10970
110.95900 83.96550
111.97400 83.82380
112.84300 83.67440
113.72300 83.51240
114.55800 83.32090
115.25800 83.15080
115.79300 83.01410
116.58200 82.74020
117.17100 82.53940
117.75500 82.29810
119.10000 82.08740
119.98400 81.59530
121.00400 81.11460
121.89800 80.64340
122.63900 80.20610
123.40800 79.75930
125.18800 78.99010
125.49203 78.84909
125.59532 78.88712
125.70711 78.91539
126.95626 78.73946
128.18498 78.33670
129.69330 78.05056
131.20356 77.77448
132.66585 77.49333
134.11150 77.13912
135.24599 76.74706
137.42600 76.08580
138.24900 75.29960
138.99000 74.51070
139.33200 73.44910
139.63300 72.38700
139.25500 71.35480
138.91600 70.32190
139.26592 69.20309
139.57654 69.04948
139.89358 68.90968
140.18254 68.77000
140.45812 68.60525
140.74499 68.43636
141.02459 68.25567
141.28624 68.07483
141.56724 67.92664
142.21533 67.65721
142.87023 67.40500
143.57565 67.15565
144.26823 66.87365
144.58450 66.71432
144.89597 66.54578
145.23097 66.39159
145.58623 66.29283
146.27749 66.14309
146.94911 65.92174
147.28193 65.76922
147.60223 65.59186
147.89482 65.39600
148.18696 65.19988
148.83489 64.87181
149.50774 64.59608
150.17131 64.29312
150.80888 63.93855
151.42587 63.55973
152.06135 63.21387
152.74194 62.93357
153.44102 62.70263
154.91089 62.31062
156.40327 62.01532
157.92080 61.78469
159.43624 61.54099
159.52660 61.52412
159.61697 61.50687
159.52305 61.49550
159.61697 61.50687
159.32375 61.42095
159.36700 61.32220
160.36300 61.31280
161.35900 61.29610
162.35300 61.27210
163.34500 61.24090
165.01300 61.33760
165.56910 61.72334
166.94938 62.24161
168.31357 62.80073
168.63286 62.94196
168.94116 63.10494
169.22919 63.30674
169.52303 63.49911
169.83628 63.63969
170.15681 63.76347
170.48368 63.89840
170.81419 64.02462
171.15026 64.13800
171.48882 64.24360
171.84601 64.33606
172.20437 64.42464
172.55693 64.52773
172.90732 64.63840
173.25353 64.75650
173.58751 64.90578
173.89775 65.07312
174.21108 65.23477
174.54948 65.39376
174.89097 65.54621
175.58394 65.81796
176.29547 66.03632
177.01590 66.19392
177.74159 66.32699
178.47401 66.46764
179.20628 66.60929
-179.90812 66.77621
-179.06181 66.92533
-179.02050 66.93222
-175.97508 67.31696
-172.91093 67.51254
-169.79046 67.59772
-168.31700 68.01580
-168.13500 68.12500
-160.04900 68.54090
-157.90700 68.72990
-155.71200 68.89080
-153.46900 69.02260
-151.17800 69.50370
-148.85300 69.75390
-146.49800 69.97230
-145.00900 70.30290
-143.50300 70.52070
-141.24400 70.25050
-139.02300 69.75150
-136.84500 69.02450
-134.71500 68.77040
-133.46500 68.16120
-132.28000 67.54310
-131.15500 66.91680
-128.95800 66.23940
-126.87800 65.53250
-125.07300 65.01400
-123.33800 64.47460
-122.50500 63.84400
-121.70800 63.20890
-121.89700 62.45060
-122.07600 61.69210
-123.02300 60.84450
-122.80439 60.60453
-122.63171 60.25917
-122.26168 59.74113
-121.94099 59.34643
-121.64497 59.05041
-121.42295 58.80373
-121.15160 58.50771
-120.92958 58.23635
-120.58422 57.94033
-120.38688 57.64431
-120.01685 57.15094
-119.74550 56.80558
-119.47414 56.41089
-119.15345 56.06553
-118.83276 55.64616
-118.51207 55.17746
-118.14204 54.85677
-117.77202 54.48674
-117.37732 54.04271
-117.03196 53.59868
-116.61260 53.15465
-116.16857 52.63661
-115.82321 52.11857
-115.37918 51.62520
-114.93514 51.10716
-114.46644 50.53979
-114.21976 50.16976
-113.82506 49.84907
-113.47970 49.40504
-113.13434 49.08435
-112.88766 48.81300
-112.56697 48.49231
-112.27095 48.14695
-111.97493 47.87559
-111.60490 47.50557
-111.16087 47.03687
-110.71684 46.61750
-110.29747 46.09946
-109.85344 45.65543
-109.71400 45.23790
-109.56900 44.92710
-109.41604 44.62168
-109.25073 44.36454
-109.14053 44.10739
-108.95686 43.77678
-108.82828 43.55638
-108.77318 43.29924
-108.69971 42.91352
-108.49767 42.63802
-108.35074 42.30740
-108.22217 42.01353
-108.09359 41.71965
-107.96502 41.33394
-107.85482 41.05843
-107.74462 40.76456
-107.65278 40.37884
-107.48748 40.02987
-107.41401 39.64415
-107.21197 39.33191
-107.15686 39.12987
-107.04666 38.81763
-106.86299 38.52375
-106.69768 38.15641
-106.56911 37.89927
-106.38544 37.56866
-106.23850 37.29315
-106.07320 36.98090
-105.88953 36.63193
-105.70585 36.30132
-105.61402 36.08091
-105.46708 35.71356
-105.30177 35.36459
-105.13647 34.97887
-105.00790 34.61153
-104.89769 34.20745
-104.73239 33.89521
-104.62219 33.54623
-104.45688 33.19725
-104.23647 32.84827
-104.18137 32.53603
-104.05280 32.22379
-103.79566 31.76461
-103.63035 31.50746
-103.39158 31.12175
-103.28138 30.90135
-103.02424 30.57074
-102.89566 30.35033
-102.73036 29.96462
-102.87739 29.64044
-103.11528 29.30061
-103.28519 28.96077
-103.48909 28.68890
-103.72698 28.29809
-103.84592 28.04322
-104.10080 27.68639
-104.27071 27.41453
-104.49161 27.02372
-104.67851 26.71786
-103.95717 21.58626
-93.06208 17.94704
-93.06657 17.84669
-92.34591 17.71509
-91.64722 17.53328
-91.34077 17.39344
-91.05552 17.21430
-90.78552 17.03934
-90.64765 16.77463
-90.77499 16.48017
-90.28844 16.48477
-89.79197 16.48388
-89.37160 16.51500
-88.87640 16.52220
-88.35100 16.55830
-87.72280 16.45060
-86.96610 16.47590
-86.31950 16.69450
-85.67140 16.91100
-84.90970 17.10660
-84.24790 17.34400
-83.70580 17.48090
-82.86460 17.62570
-82.24420 17.69070
-81.62480 17.80160
-81.68930 18.33320
-81.75410 18.86470
-81.25630 18.95980
-80.75790 19.05360
-80.20950 19.15970
-79.66040 19.26420
-79.01100 19.38150
-78.36070 19.49650
-77.67260 19.62280
-76.98340 19.74650
-76.50000 20.10000
-75.90000 20.10000
-75.23880 19.99020
-74.74860 20.03720
-73.99420 20.16590
-73.23850 20.29130
-72.33220 20.33100
-72.00000 20.50000
-70.80000 20.60000
-69.50000 20.40000
-68.02180 19.68700
-67.04050 19.75430
-66.00000 20.50000
-68.50000 21.70000
-68.00000 23.50000
-59.50000 27.00000
-51.00000 27.00000
-46.40000 25.50000
> NB
154.22500 -6.50689
154.54000 -6.81779
154.92700 -7.29284
154.73000 -6.85808
154.53300 -6.42324
154.54500 -5.90097
154.59200 -5.58051
154.97800 -5.24012
154.99200 -4.88657
154.95500 -4.55028
154.70000 -4.28294
154.35900 -3.94845
154.25600 -3.61210
154.03500 -3.32680
153.88200 -3.04097
153.71100 -2.68759
153.54200 -2.60389
153.39000 -2.43572
153.11900 -2.20029
152.91600 -2.15020
152.57800 -2.13414
152.15500 -1.86475
151.81600 -1.64562
151.42700 -1.46017
151.08900 -1.30833
150.71700 -1.22404
150.34400 -1.12276
150.02300 -1.02138
149.76900 -1.00453
149.48100 -0.81847
149.27000 -0.65021
148.91300 -0.45692
148.72400 -0.39186
148.34400 -0.40946
147.85900 -0.42635
147.35400 -0.27465
147.05900 -0.29351
146.59500 -0.29022
145.91900 -0.34916
145.49700 -0.47327
145.03300 -0.53411
144.35700 -0.74188
143.80800 -0.95057
143.26000 -1.15956
142.92200 -1.45354
142.62600 -1.91593
142.39400 -2.46221
142.24600 -2.69310
142.44900 -2.81358
142.63300 -2.93233
142.93600 -3.01814
143.17200 -3.05310
143.50800 -3.15594
143.74300 -3.46045
144.36800 -3.53117
144.80700 -3.55013
145.39900 -3.48507
146.11000 -3.47062
146.41500 -3.43769
146.83600 -3.75493
146.91800 -3.64099
146.99900 -3.51435
147.08300 -3.38515
147.16200 -3.26100
147.24100 -3.15205
147.32500 -3.05326
147.40700 -2.96204
147.47800 -2.90886
147.53900 -2.88103
147.60500 -2.87857
147.81600 -2.81284
147.98300 -2.92212
148.12300 -3.02628
148.32900 -3.14063
148.49900 -3.22195
148.67500 -3.30577
148.87800 -3.39465
149.08900 -3.46572
149.29500 -3.52151
149.45300 -3.54429
149.60300 -3.56959
149.71700 -3.57966
149.77300 -3.59230
149.81600 -3.61764
149.81700 -3.61656
149.91300 -3.49148
150.03400 -3.37167
150.13500 -3.27439
150.24900 -3.20201
150.35200 -3.14092
150.43600 -3.09258
150.50900 -3.06108
150.56000 -3.05074
150.61600 -3.04729
150.61500 -3.08491
150.63400 -3.16268
150.68300 -3.23453
150.73200 -3.29524
150.78900 -3.32939
150.82400 -3.34847
150.87900 -3.33111
150.93100 -3.37230
150.98200 -3.41905
151.02100 -3.47569
151.09500 -3.54725
151.14200 -3.58709
151.20400 -3.60167
151.25000 -3.60671
151.30100 -3.65625
151.37500 -3.70620
151.42800 -3.75424
151.56300 -3.66511
151.67500 -3.76873
151.81400 -3.72013
151.92900 -3.67667
151.98700 -3.64860
152.03800 -3.63575
152.13200 -3.66584
152.22600 -3.73899
152.32800 -3.82223
152.41500 -3.90297
152.47800 -3.97364
152.55700 -4.03917
152.61600 -4.13010
152.66200 -4.18815
152.92700 -4.60329
153.19300 -5.01833
153.40300 -5.36112
153.61400 -5.70366
153.82300 -6.04594
153.93000 -6.26500
> NZ
-108.79700 -35.13190
-108.07100 -35.24040
-107.34300 -35.34450
-106.66600 -35.39350
-105.98800 -35.43880
-105.39100 -35.52360
-104.79300 -35.60550
-103.99800 -35.69440
-103.20200 -35.77810
-102.56500 -35.85440
-101.92600 -35.92740
-101.28600 -35.99700
-100.64500 -36.06320
-99.53180 -36.13320
-98.41670 -36.19280
-97.40170 -36.29360
-97.41310 -36.87100
-96.55150 -36.92090
-95.68890 -36.96460
-94.90950 -36.98510
-94.12980 -37.00060
-94.09310 -37.71700
-93.99630 -38.48230
-93.07480 -38.42940
-93.02250 -38.96730
-92.33970 -38.91840
-91.65790 -38.86560
-91.60350 -39.34930
-91.54830 -39.83290
-91.51220 -40.28240
-91.47560 -40.73190
-91.39100 -41.10250
-90.73910 -41.08230
-90.08760 -41.05850
-90.05400 -41.43190
-89.24960 -41.37810
-88.44670 -41.31870
-87.41710 -41.27290
-87.33640 -41.52130
-86.24010 -41.39250
-85.14840 -41.25330
-84.48700 -41.19090
-83.82690 -41.12470
-83.71620 -41.67370
-83.60370 -42.22250
-83.45380 -42.87300
-83.44750 -42.98150
-82.50890 -42.86070
-82.35070 -43.63900
-82.13770 -44.40400
-81.93460 -44.96410
-81.10650 -44.87600
-80.28110 -44.78190
-79.58580 -44.66550
-78.89330 -44.54490
-78.20650 -44.41110
-77.99020 -45.09160
-77.76400 -45.58850
-77.66070 -45.76050
-76.67460 -45.64270
-76.00620 -45.65850
-75.82140 -44.84940
-75.78240 -44.05060
-75.63160 -43.64820
-75.55800 -42.97220
-75.40170 -42.28450
-75.39690 -41.82560
-75.39220 -41.36660
-75.18890 -40.86280
-75.19480 -40.35890
-75.12780 -39.81310
-75.14950 -39.56440
-75.09923 -39.41019
-74.98830 -39.06810
-74.83590 -38.54200
-74.65480 -38.13760
-74.59560 -37.56350
-74.44160 -36.72490
-74.26170 -36.16530
-73.89740 -35.57770
-73.67550 -34.88760
-73.24570 -34.29040
-72.93750 -33.83690
-72.86100 -33.35850
-72.88900 -32.74190
-72.76220 -32.31880
-72.67830 -31.53130
-72.61810 -30.96520
-72.59990 -30.19030
-72.55460 -29.53570
-72.43320 -28.90140
-72.16980 -28.27760
-71.95780 -27.75470
-71.84710 -27.24780
-71.75250 -26.65220
-71.62830 -25.83970
-71.52430 -25.09280
-71.46590 -24.26260
-71.38950 -23.52270
-71.34750 -22.75840
-71.30680 -21.96540
-71.24950 -21.26220
-71.32280 -20.75770
-71.36230 -20.24910
-71.48650 -19.81120
-71.74650 -19.29810
-72.26640 -18.72150
-72.73660 -18.25670
-73.39970 -17.74700
-73.94930 -17.37350
-74.60950 -16.82300
-75.29230 -16.33020
-75.91630 -15.73550
-76.40290 -15.21850
-76.76480 -14.84330
-77.12540 -14.46750
-77.63880 -13.91360
-78.14760 -13.38720
-78.40690 -13.01440
-78.66540 -12.64140
-79.14720 -11.89030
-79.61810 -11.29060
-79.99660 -10.56030
-80.36840 -9.92089
-80.70100 -9.43400
-81.04060 -8.66540
-81.37470 -7.98838
-81.54920 -7.30604
-81.78400 -6.65544
-81.95410 -6.00265
-81.99850 -5.25340
-82.00980 -4.50353
-81.92580 -3.72131
-81.59890 -3.24451
-81.65190 -3.00021
-81.53180 -2.43745
-81.59850 -1.81384
-81.41460 -1.09547
-81.22940 -0.28445
-80.88660 0.43189
-80.57380 1.05338
-80.29170 1.54938
-79.79130 2.07369
-79.47800 2.42697
-79.16460 2.78019
-78.66170 3.39204
-78.34190 4.06591
-78.08000 4.83152
-77.91010 5.50529
-78.00800 6.00453
-78.05040 6.05273
-78.08610 6.12184
-78.12930 6.23949
-78.15140 6.34345
-78.19460 6.46107
-78.26500 6.50195
-78.33560 6.56364
-78.39970 6.66011
-78.44280 6.75680
-78.54190 6.85277
-78.59900 6.94229
-78.69760 6.99653
-78.74700 7.03058
-78.76190 7.09977
-78.71480 7.23227
-78.64630 7.33731
-78.75110 7.32893
-78.98180 7.31874
-79.24020 7.30109
-79.46970 7.22831
-79.65760 7.18385
-79.84560 7.16010
-80.09580 7.10068
-81.34230 7.09933
-81.48740 7.05516
-81.58430 7.03949
-81.74100 7.06054
-81.88860 6.97836
-81.94360 6.94971
-82.08960 6.96742
-82.12520 7.00801
-82.20210 7.04084
-82.27340 7.12881
-82.33850 7.25127
-82.49200 7.29605
-82.61710 7.30701
-82.68570 7.27797
-82.74820 7.28342
-82.81100 7.30260
-82.62480 7.36639
-82.62490 7.11804
-82.62500 6.56231
-82.62500 5.83296
-82.62500 5.05417
-82.62500 4.56303
-82.62500 4.07188
-82.62500 3.59490
-82.80640 3.11792
-83.37790 3.16485
-83.92250 3.13869
-84.46710 3.11226
-84.56670 2.53424
-84.57130 2.06618
-84.57590 1.59812
-85.34940 1.64441
-85.38610 0.83180
-86.26560 0.88046
-87.14500 0.92891
-88.02450 0.97714
-88.90410 1.02514
-89.78360 1.07290
-90.66320 1.12041
-90.69730 1.73615
-91.56080 1.81659
-91.53760 2.01117
-92.11830 1.99009
-92.09020 2.19975
-92.24510 2.22695
-92.92790 2.29988
-93.61070 2.37248
-94.40440 2.43994
-95.19820 2.50694
-95.22410 2.22175
-96.12020 2.23785
-96.17500 1.87283
-96.88000 1.88568
-97.58510 1.89824
-97.55120 2.08841
-97.84630 2.07656
-98.36740 2.14463
-98.88860 2.21253
-98.91750 2.11218
-99.65700 2.19007
-99.73890 2.26882
-99.81080 2.27260
-99.91290 2.27227
-100.04700 2.29966
-100.06600 2.20704
-100.39400 2.20650
-100.64400 2.20440
-101.06700 2.21046
-101.19600 2.19890
-101.20300 2.24142
-101.51200 2.23226
-101.43800 2.16015
-101.35600 2.10436
-101.27000 2.04850
-101.14900 1.98018
-101.04900 1.90637
-100.97400 1.83189
-100.90800 1.74348
-100.97300 1.67885
-100.96400 1.65513
-101.07400 1.51368
-101.04700 1.47077
-101.15300 1.38576
-101.19500 1.42309
-101.31500 1.35013
-101.34800 1.39907
-101.42300 1.33816
-101.48700 1.38887
-101.58000 1.31773
-101.64400 1.40377
-101.82500 1.33439
-101.95900 1.26876
-102.08200 1.20646
-102.18100 1.13426
-102.24000 0.71282
-102.21000 0.70634
-102.25300 0.37170
-102.29400 0.15707
-102.31900 -0.01548
-102.39700 -0.50323
-102.52400 -1.28284
-102.39900 -1.28336
-102.46200 -1.53269
-102.30700 -1.59589
-102.40200 -1.90746
-102.62100 -1.90611
-102.68700 -2.43571
-102.75400 -2.93392
-102.56600 -2.93572
-102.57100 -3.43472
-102.73500 -4.05639
-103.63700 -3.95089
-104.53900 -3.84440
-104.69900 -4.15158
-105.38000 -4.07847
-105.54400 -4.56935
-106.25300 -4.49391
-106.45000 -5.04324
-106.58700 -5.62383
-106.74100 -5.61990
-106.75200 -6.01875
-106.84500 -6.01620
-106.95000 -6.44278
-107.44100 -6.36670
-107.60700 -6.75924
-107.65300 -7.18594
-107.88000 -7.51409
-108.06300 -8.24014
-108.19200 -8.35695
-108.32000 -9.14481
-109.03800 -9.03537
-109.75600 -8.92454
-109.85700 -9.67656
-110.07100 -9.66505
-110.21800 -10.08040
-110.29200 -10.80170
-110.44700 -10.82240
-110.48500 -11.39420
-110.67500 -11.47240
-110.92600 -11.96840
-111.07700 -12.74170
-110.89200 -12.75530
-111.00700 -13.41080
-111.19100 -13.39640
-111.26600 -13.54130
-111.84600 -13.46450
-112.42600 -13.38630
-112.43900 -13.86460
-112.58100 -14.06190
-112.61300 -14.71800
-112.76600 -14.70380
-112.86900 -15.24780
-112.97300 -15.79170
-113.06600 -16.35130
-112.97300 -16.36090
-113.16500 -16.67030
-113.04100 -16.68340
-113.24100 -17.05150
-113.11700 -17.06500
-113.32900 -17.52110
-113.17400 -17.53840
-113.38800 -17.99380
-113.26400 -18.00810
-113.38300 -18.44420
-113.52000 -18.75790
-113.36400 -18.77660
-113.62300 -19.28520
-113.49800 -19.30060
-113.69700 -19.96750
-113.79600 -20.32100
-113.93100 -20.57450
-114.08700 -20.59930
-114.22900 -21.12130
-114.28930 -21.42173
-114.12838 -21.31437
-113.78433 -21.41069
-113.47858 -21.60581
-113.18985 -21.82754
-112.90724 -22.05708
-112.61023 -22.27959
-112.29690 -22.47818
-111.97869 -22.62912
-111.65848 -22.77589
-111.41524 -22.95081
-111.36727 -23.21935
-111.55960 -23.33950
-111.79070 -23.27869
-111.81190 -23.27298
-111.87100 -23.32670
-111.86400 -23.47500
-111.83200 -23.72750
-111.76300 -23.85980
-111.71300 -24.03200
-112.09800 -24.11040
-112.12300 -24.22240
-112.10300 -24.44850
-112.04800 -24.65910
-111.97700 -24.89070
-111.97800 -25.02660
-112.45300 -25.05940
-112.44300 -25.19850
-112.38800 -25.42920
-112.36600 -25.56420
-112.36400 -25.66370
-112.43700 -25.68270
-112.45500 -25.78600
-112.54100 -25.78740
-112.55000 -25.92590
-112.62000 -25.93420
-112.67200 -26.03790
-112.68300 -26.28230
-112.65800 -26.55380
-112.68400 -26.80090
-112.94700 -26.72410
-112.97600 -26.83020
-113.11200 -27.01430
-113.12900 -27.27270
-113.13300 -27.57700
-113.00100 -27.60740
-112.97100 -27.84950
-112.95500 -28.12900
-112.93400 -28.37940
-113.01000 -28.38290
-113.02100 -28.54950
-113.02000 -28.78720
-112.95600 -29.00880
-112.36700 -29.16020
-111.80600 -29.26560
-111.74900 -29.57880
-111.77300 -30.02470
-111.77500 -30.18730
-111.79700 -30.42480
-111.85100 -30.62440
-111.88500 -30.66580
-111.95100 -31.04460
-111.97800 -31.38620
-111.96400 -31.39050
-112.02300 -31.53620
-111.66000 -31.55640
-111.20200 -31.56380
-110.68700 -31.71500
-110.21000 -31.91980
-109.79100 -32.11520
-109.43500 -32.40000
-109.20600 -32.66150
-108.97200 -32.93650
-109.18300 -33.02040
-109.41000 -33.14010
-109.32300 -33.39170
-109.20500 -33.70190
-109.27000 -33.91670
-109.27700 -34.20370
-109.25900 -34.54460
> OK
147.33901 44.37912
148.02738 44.74625
148.85343 45.02161
149.58770 45.25106
150.27608 45.61820
151.01035 46.07712
151.69872 46.53603
152.61656 46.90317
153.25904 47.40798
153.94742 47.91279
154.63580 48.46349
155.81367 53.23601
155.81000 55.00000
156.48257 58.28025
156.66423 58.47069
156.93385 58.66221
157.22173 58.82568
158.53895 59.41447
159.90167 59.89271
161.30261 60.31497
162.71067 60.71348
164.14750 61.19601
163.34500 61.24090
162.35300 61.27210
161.35900 61.29610
160.36300 61.31280
159.36700 61.32220
159.02133 61.37380
158.67342 61.33817
158.32434 61.31608
157.58697 61.29469
156.84929 61.29582
155.33122 61.33531
153.81407 61.40266
153.13573 61.43538
152.45693 61.46149
151.67306 61.49325
150.89120 61.55700
150.51559 61.60547
150.14245 61.67003
149.82850 61.75216
149.52353 61.86337
149.20749 61.97408
148.88418 62.06170
148.56373 62.14657
148.25666 62.26977
146.96300 61.87970
146.12600 61.56980
145.30600 61.25490
144.50200 60.93510
143.71500 60.61070
142.94300 60.28170
142.18700 59.94840
142.08600 59.47860
141.98800 59.00870
141.89300 58.53870
141.80000 58.06860
141.70900 57.59850
141.62100 57.12830
141.53500 56.65810
141.45100 56.18780
141.70000 55.65030
141.94300 55.11230
142.17900 54.57380
143.25000 54.03490
143.25000 53.38430
143.25000 53.04250
143.25000 52.54180
143.25000 51.69980
142.39800 50.85740
142.52100 50.31780
142.64100 49.77810
142.76100 49.24090
142.87800 48.70360
142.96645 48.00406
142.85722 47.13025
142.50000 45.25000
> ON
129.05500 29.35540
128.68700 29.03210
128.32100 28.70790
128.55700 28.40100
128.04900 28.05280
127.59900 27.78960
127.34700 27.66150
127.41700 27.48550
126.88500 27.14910
126.74500 27.00570
126.82000 26.81060
126.47700 26.54030
126.64223 24.86476
127.22642 25.20231
127.74647 25.62813
127.86871 25.76104
127.99296 25.89199
128.10637 25.98517
128.22730 26.06795
128.46288 26.28833
128.66449 26.54128
128.89605 26.80575
129.16149 27.03619
129.43985 27.25010
129.68417 27.50042
> PS
132.63000 30.49260
132.47112 30.30756
132.44125 30.15511
132.30331 29.82460
132.08034 29.54210
131.94116 29.39762
131.80492 29.25039
131.69413 29.11098
131.62800 28.98740
131.52400 28.85910
131.46700 28.75080
131.30900 28.45080
131.09700 28.31820
130.64900 28.13580
130.52300 27.70940
130.21100 27.21350
129.78500 26.67090
129.36000 26.19080
128.97800 25.85910
128.46200 25.45760
127.90700 24.96900
127.39800 24.50290
126.90100 24.10110
126.42600 23.76060
125.95400 23.49770
125.55000 23.37990
124.80719 23.34700
124.09109 23.33308
123.76453 23.30739
123.43735 23.30020
123.09965 23.33896
122.76721 23.41098
122.41218 23.49709
122.05754 23.58440
122.06105 23.35205
122.06105 23.10536
122.08572 22.73534
122.08572 22.35297
122.08572 21.98295
122.09806 21.48958
122.12272 21.08255
122.11039 20.67552
122.09806 20.26849
122.11039 19.81212
122.13400 19.31780
122.67300 19.18510
123.01100 18.80650
123.34800 18.42730
123.52800 17.83560
123.29600 17.42250
123.06600 17.00920
122.91400 16.37400
123.37800 16.03740
123.84100 15.69990
124.38000 15.20260
124.89100 14.70420
125.15000 14.13210
125.49400 13.30560
125.68600 12.81810
126.13700 12.26530
126.24000 11.63040
126.21400 11.05990
126.57300 10.29640
126.82400 9.44925
127.05300 8.75031
127.21900 8.13649
127.23400 7.29165
127.25000 6.44683
127.45900 5.89653
127.49800 5.47404
127.83600 5.22401
128.15100 4.76318
128.38700 4.33466
128.68400 3.70046
128.99800 3.11403
129.21700 2.67063
129.24600 1.92806
129.19700 1.05932
129.98900 0.68416
130.54600 0.47488
131.10200 0.26556
131.73800 0.14974
132.37300 0.03390
132.51500 0.01706
132.65100 0.81158
132.72000 1.16455
132.73400 1.72846
132.76600 2.25688
132.81700 2.53873
132.85000 2.90828
132.79500 3.31224
132.74000 3.69833
132.79000 4.11986
132.91100 4.45382
133.03200 4.78754
133.18900 5.01620
133.24000 5.34909
133.30800 5.73427
133.42900 5.96222
133.67400 6.15594
133.98900 6.33263
134.26900 6.61025
134.52100 6.99019
135.41500 6.89507
136.18300 6.98895
136.75900 7.36771
137.14400 7.61961
137.52900 7.87117
137.98200 8.53360
138.30900 9.19616
138.35900 9.37865
138.57400 9.95256
138.71000 10.64920
138.81300 11.12140
138.87759 11.41005
140.10000 11.94590
140.77200 11.85780
141.60800 11.95810
142.12200 11.98520
142.96100 12.02310
143.10600 12.03010
143.14300 12.26500
143.23900 12.47810
143.40300 12.69470
143.51000 12.82220
143.66200 13.05770
143.77100 13.26760
143.87100 13.54090
143.90300 13.62350
143.94200 13.81080
143.97600 14.08700
144.08200 14.63940
144.21600 14.65570
144.33400 14.88450
144.53000 14.91670
144.45300 15.52560
144.79900 15.65310
144.79200 16.12270
144.84100 16.47800
144.79800 16.97930
144.67100 17.42010
144.97000 17.53460
144.77300 17.82950
144.70600 18.01980
144.66300 18.16560
144.62600 18.35910
144.60100 18.75560
144.54300 19.07270
144.52700 19.12340
144.25200 19.72530
144.13700 19.75330
144.08300 19.85770
143.97000 20.11090
143.84200 20.41780
143.57500 20.39680
143.49300 20.53250
143.39200 20.72830
143.28100 20.96190
143.32100 21.06060
143.28000 21.32030
143.21800 21.65900
143.15000 21.92780
142.99700 22.13850
142.77400 22.37660
142.56000 22.66200
142.25700 23.00910
140.49600 24.90920
140.49800 24.91760
140.47500 25.61240
140.63100 26.32890
140.66000 26.73700
140.64300 27.46330
140.67200 27.94070
140.40200 28.51870
140.14800 28.97540
139.90700 29.62080
139.87300 30.12820
139.72400 30.71100
139.65900 31.31520
139.59900 31.98250
139.39400 32.55760
139.41200 32.80000
138.06600 33.74950
137.54600 33.40460
137.03000 33.05260
136.52400 32.86810
136.02500 32.68600
135.61200 32.53720
135.35600 32.46000
135.02600 32.32640
134.69100 32.19970
134.04200 31.88210
133.50000 31.51520
133.19700 31.21620
132.96500 30.96980
132.82400 30.75440
> RI
-108.66900 21.77390
-108.78400 21.64280
-108.86800 21.53600
-108.93600 21.45130
-108.97700 21.34700
-108.80900 21.25290
-108.91500 21.06790
-109.01300 20.94900
-109.11100 20.82400
-109.19400 20.73920
-109.26100 20.64260
-109.28500 20.55840
-109.18700 20.49950
-109.21500 20.39730
-109.31900 20.24230
-109.37800 20.17570
-109.37300 20.14180
-109.45000 20.02710
-109.16000 19.80650
-108.90300 19.62550
-108.89600 19.54960
-108.53400 19.38370
-108.19800 19.22350
-108.23300 19.10730
-107.81600 18.93600
-107.52300 18.86320
-107.27200 18.75610
-107.00200 18.64710
-106.75600 18.58990
-106.52700 18.54440
-106.28787 18.52302
-106.23700 18.81900
-105.53000 18.55940
-105.54600 18.98070
-105.73900 19.16440
-105.94900 19.40190
-106.12100 19.64370
-106.27100 19.91580
-106.35200 20.20270
-106.38500 20.42810
-106.38700 20.63790
-106.38100 20.83970
-106.44200 21.12080
-106.52500 21.18380
-106.55100 21.23550
-106.62400 21.31060
-106.75700 21.48300
-106.80800 21.64030
-106.86200 21.71560
-106.89000 21.79920
-107.04600 21.75360
-107.17100 21.75220
-107.39300 21.74780
-107.58600 21.74170
-107.77400 21.73970
-107.92800 21.68610
-108.11400 21.72000
-108.39700 21.83480
-108.58200 21.90470
> SA
-12.74560 -28.21330
-13.27160 -28.32100
-13.48230 -27.44290
-13.68960 -26.56440
-13.81560 -26.58560
-14.04850 -25.73760
-13.66320 -25.64800
-13.81060 -24.88740
-13.28010 -24.77710
-13.42590 -24.14580
-13.57030 -23.51430
-13.66370 -23.54420
-13.82930 -22.82920
-13.33980 -22.73020
-12.85110 -22.62980
-12.91020 -22.37900
-12.36430 -22.26710
-11.81920 -22.15340
-11.93590 -21.75220
-11.84950 -21.73510
-12.00660 -21.20910
-11.76320 -21.17590
-11.97080 -20.29910
-11.85220 -20.27840
-11.94460 -19.82480
-12.26260 -19.93530
-12.37030 -19.34090
-12.47720 -18.74650
-12.75930 -18.78450
-12.85980 -18.28720
-12.95980 -17.78980
-13.51890 -17.89300
-14.07860 -17.99460
-14.22420 -17.38590
-14.36880 -16.77700
-14.23810 -16.76450
-14.30240 -16.43270
-13.77020 -16.32290
-13.23860 -16.21170
-13.38350 -15.68820
-13.22610 -15.66320
-13.43520 -14.84940
-13.64280 -14.03550
-14.47840 -14.20770
-14.53910 -13.73660
-14.59960 -13.26550
-14.41020 -13.21810
-14.55010 -12.57700
-14.79100 -12.65620
-14.86110 -12.31960
-14.90770 -12.33900
-15.00580 -11.88530
-14.51150 -11.77060
-14.01770 -11.65510
-13.52430 -11.53870
-13.03130 -11.42150
-13.17360 -10.62310
-13.31510 -9.82468
-13.16630 -9.79444
-13.24820 -9.27648
-13.02300 -9.22523
-13.19110 -8.37401
-13.35740 -8.41071
-13.48940 -7.88908
-13.62100 -7.36740
-12.80680 -7.16482
-11.99330 -6.96082
-11.18050 -6.75542
-11.26710 -6.02023
-11.02220 -5.93021
-11.16690 -5.37706
-11.51610 -5.41504
-11.60440 -4.94231
-12.01850 -5.02557
-12.14450 -4.60882
-12.03860 -4.58743
-12.09680 -4.10303
-11.76550 -3.97199
-11.89750 -3.49273
-12.02930 -3.01345
-11.83360 -2.85504
-11.99890 -2.40025
-12.16410 -1.94545
-12.70140 -2.09908
-12.92980 -1.50722
-13.15800 -0.91535
-13.90870 -1.10824
-14.65940 -1.30094
-15.41030 -1.49342
-15.56520 -1.07324
-15.84060 -1.14320
-16.03720 -0.51963
-16.25220 -0.55620
-16.49820 0.29895
-16.75690 0.26859
-17.32290 0.14961
-17.88890 0.03061
-18.36930 -0.07275
-18.84970 -0.17611
-19.67470 -0.33338
-20.48990 -0.49671
-21.01680 -0.58849
-21.54370 -0.68022
-22.38130 -0.79639
-22.93550 -0.88040
-23.48970 -0.96432
-24.05070 -1.03387
-24.61170 -1.10331
-24.82060 -0.24459
-25.02940 0.61413
-25.65910 0.55617
-26.28870 0.49814
-26.47400 1.15918
-27.31530 1.06184
-27.83090 1.00748
-28.34650 0.95303
-29.20960 0.84891
-29.92030 0.79740
-30.02690 1.60709
-30.73580 1.64269
-30.81130 2.44874
-30.88680 3.25477
-30.96250 4.06081
-31.43740 4.03611
-31.91220 4.01114
-32.38700 3.98590
-32.86170 3.96038
-32.91980 4.80377
-32.97800 5.64716
-33.50680 5.64946
-33.51360 6.07619
-33.62030 6.10421
-33.62440 6.61760
-34.49370 6.61577
-35.36290 6.61393
-35.36650 6.93495
-36.04690 7.02322
-36.05770 7.36342
-36.85140 7.40089
-36.86480 7.65432
-37.53560 7.67935
-38.20650 7.70334
-38.22100 8.13953
-38.70090 8.15934
-39.18080 8.17858
-39.66080 8.19726
-40.14080 8.21537
-40.11960 8.81526
-40.65220 8.84060
-40.64020 9.37285
-40.86480 9.38937
-40.86150 9.97269
-41.08290 9.97939
-41.08710 10.78690
-41.55920 10.81210
-42.03130 10.83650
-42.50350 10.86020
-42.97580 10.88320
-43.44820 10.90550
-43.92060 10.92700
-43.90260 11.50620
-43.88450 12.08540
-44.27750 12.10080
-44.26200 12.62560
-45.03730 12.67990
-45.04930 13.33580
-45.06140 13.99170
-45.54810 13.43940
-46.11270 12.73210
-46.67410 12.02370
-47.60530 12.28730
-48.53830 12.54780
-49.47330 12.80500
-50.41010 13.05890
-51.34880 13.30950
-52.21560 13.54600
-53.08410 13.77960
-53.95430 14.01000
-54.82630 14.23740
-55.20029 14.20845
-55.88134 13.91747
-56.19289 13.74290
-56.49024 13.54515
-56.76567 13.43521
-57.06422 13.38384
-57.40370 13.39421
-57.71070 13.87400
-58.00000 14.00000
-59.25000 12.50000
-59.25000 10.15970
-61.50000 9.40000
-62.69254 9.85314
-63.35966 9.59880
-63.52836 9.55826
-63.69632 9.51490
-63.85202 9.48655
-64.00741 9.50774
-64.27378 9.72038
-64.50019 9.98261
-64.78168 10.12609
-65.10147 10.13410
-65.44262 10.07491
-65.77688 9.98358
-66.04371 9.92405
-66.31399 9.87678
-66.58887 9.81953
-66.86394 9.76328
-67.42983 9.66162
-68.00099 9.59772
-72.25000 5.00000
-73.13000 4.41261
-73.32590 4.30774
-73.59170 4.16783
-73.78030 3.97914
-73.81500 3.81860
-73.92650 3.56025
-74.10100 3.42043
-74.34540 3.29442
-74.58940 3.02190
-74.69784 2.93600
-74.73776 2.73418
-74.74194 2.41470
-74.85977 2.13270
-75.09933 1.93712
-75.39374 1.77848
-75.68762 1.61830
-75.98207 1.41993
-77.62157 -1.15526
-77.59321 -1.45653
-77.59128 -1.75903
-77.62855 -2.30857
-77.10560 -2.34986
-76.31190 -2.78531
-75.51750 -3.22022
-74.72250 -3.65452
-73.92670 -4.08810
-73.13010 -4.52091
-72.88560 -5.39357
-72.64040 -6.26612
-72.39440 -7.13856
-72.14750 -8.01087
-71.89950 -8.88304
-66.96021 -14.08300
-66.40105 -14.58495
-65.87168 -15.11954
-65.62724 -15.37315
-65.40230 -15.64401
-65.19945 -15.94295
-65.00801 -16.24955
-64.81583 -16.54431
-64.60721 -16.82739
-64.35767 -17.06166
-64.06004 -17.23178
-63.39269 -17.44593
-62.74750 -17.70797
-62.50615 -17.94695
-62.39587 -18.26771
-62.36040 -18.63466
-62.32906 -19.00191
-62.27576 -19.73379
-62.22918 -20.46606
-62.20458 -20.82372
-62.18563 -21.18177
-62.18973 -21.34323
-62.22191 -21.50113
-62.29781 -21.65819
-62.39780 -21.80147
-62.48420 -22.33350
-62.41430 -22.99830
-63.34380 -23.66310
-63.49530 -24.36450
-63.64850 -25.06580
-63.81070 -25.97670
-63.97550 -26.88740
-63.92050 -27.72790
-63.86460 -28.56830
-63.80780 -29.40870
-63.75010 -30.24910
-63.80820 -31.16360
-63.86740 -32.07810
-63.92780 -32.99250
-71.33225 -39.83872
-71.57014 -41.13009
-71.77404 -42.14960
-71.90997 -43.06715
-71.97794 -44.32454
-72.07989 -45.34404
-71.97794 -46.26159
-72.01192 -47.28110
-72.07989 -48.23264
-71.97794 -49.18417
-72.01192 -50.20367
-72.01192 -51.22318
-72.01192 -52.58252
-64.78800 -54.17260
-63.71310 -54.01770
-62.82080 -53.91710
-61.93300 -53.81000
-60.53220 -53.67350
-59.24580 -53.59810
-57.75000 -53.62600
-56.45670 -53.64860
-55.59650 -53.53040
-54.74130 -53.40600
-53.38210 -53.20940
-52.17590 -52.87260
-50.67130 -52.71000
-49.16260 -52.66400
-47.66260 -52.69070
-46.41410 -52.83010
-45.19100 -52.93090
-44.20950 -53.26970
-43.21250 -53.60030
-42.41010 -53.87970
-41.59710 -54.15360
-40.65970 -54.39720
-39.71120 -54.63340
-38.71490 -54.85320
-37.81030 -55.08620
-36.84600 -55.21490
-36.10830 -55.64160
-34.59120 -55.72950
-33.69110 -55.60500
-33.05770 -55.45800
-33.35510 -54.86000
-33.73380 -54.46030
-32.36700 -54.58540
-30.90560 -54.82170
-29.48850 -55.03340
-28.64660 -55.00490
-27.60440 -55.09480
-26.99490 -55.23190
-26.41400 -55.42440
-25.72050 -55.83960
-25.14920 -56.29200
-24.69630 -56.73360
-24.23270 -57.17360
-24.13020 -57.42530
-23.81940 -58.19500
-23.99070 -58.92090
-24.45590 -59.38580
-25.06880 -59.97330
-26.07090 -60.39100
-25.09350 -60.54500
-24.10690 -60.69170
-22.91370 -60.72320
-21.71860 -60.74410
-20.65100 -60.78170
-19.58120 -60.81080
-19.37050 -60.28910
-18.64640 -60.25000
-18.54720 -59.93760
-18.43250 -59.54230
-18.12330 -59.50930
-18.06000 -59.15260
-17.66700 -59.12890
-16.91690 -59.09820
-16.41000 -59.09840
-16.22580 -58.76720
-16.00470 -58.45930
-15.97150 -58.43880
-15.06890 -58.39040
-13.95430 -58.31730
-12.64890 -58.24060
-11.18970 -58.15770
-9.88532 -58.09150
-8.60685 -57.98880
-7.52477 -57.92040
-7.00902 -57.86940
-7.01278 -57.61720
-6.99917 -57.31760
-6.53815 -57.27000
-6.13025 -57.24020
-6.09431 -56.98230
-6.05679 -56.67210
-5.44832 -56.62700
-4.69342 -56.59160
-4.67546 -56.21020
-4.69061 -55.80720
-4.05601 -55.76940
-3.72024 -55.73990
-2.89625 -55.70720
-2.07998 -55.65680
-1.61369 -55.65290
-1.60588 -55.12930
-1.03898 -55.01900
-0.43790 -54.85180
-0.91465 -54.45350
-1.38220 -54.05330
-2.37231 -54.32740
-2.91952 -53.54690
-3.44688 -52.76400
-3.95559 -51.97880
-4.23767 -52.04860
-4.47762 -51.59120
-4.71279 -51.13330
-4.94334 -50.67490
-5.16942 -50.21610
-6.15983 -50.41710
-7.15851 -50.60960
-7.43284 -50.00130
-7.63767 -50.05870
-7.96086 -49.27020
-8.02211 -49.28260
-8.13908 -48.96100
-8.92248 -49.09120
-9.70992 -49.21600
-9.90926 -48.69390
-10.10450 -48.17150
-10.29580 -47.64870
-10.48340 -47.12560
-11.18920 -47.24520
-11.89820 -47.36050
-12.61020 -47.47140
-13.32510 -47.57780
-13.57150 -46.68780
-13.81000 -45.79720
-14.71550 -45.89850
-14.89400 -45.37140
-15.59390 -45.47560
-15.76030 -45.02790
-15.92420 -44.58000
-16.08560 -44.13190
-16.24450 -43.68350
-16.32960 -43.38700
-16.42990 -42.86770
-16.21460 -42.33770
-16.33160 -41.80650
-16.67800 -41.51910
-16.74360 -41.17630
-16.81660 -40.78970
-16.86740 -40.36630
-16.46980 -40.27290
-16.41460 -39.79000
-15.92240 -39.68070
-15.96510 -39.35160
-16.04380 -38.88340
-16.36100 -38.55840
-16.79850 -38.40120
-17.05050 -38.44670
-17.38780 -38.02510
-17.53310 -37.47240
-17.23350 -37.37440
-17.33310 -36.94360
-17.44040 -36.56230
-17.08470 -36.47240
-17.41910 -36.06840
-17.70320 -35.66330
-16.96190 -35.49940
-16.02740 -35.34310
-15.10000 -35.18240
-15.26590 -34.77020
-15.08340 -34.68980
-15.27410 -34.23760
-14.51510 -34.04340
-14.70180 -33.56910
-14.36680 -33.49890
-14.44610 -32.89760
-14.52290 -32.40020
-13.88300 -32.27450
-13.24530 -32.14320
-13.37140 -31.66120
-13.49880 -31.17910
-13.36660 -31.15670
-13.54280 -30.49130
-13.71590 -29.82800
-13.82010 -29.85150
-13.99020 -29.25100
-13.26240 -29.09800
-12.53260 -28.94090
> SB
149.31400 -7.03217
149.86000 -6.93936
150.14600 -6.88149
150.66300 -6.69359
151.14800 -6.44252
151.51900 -6.21031
151.87600 -5.92553
152.25700 -5.75490
152.65300 -5.64024
153.10700 -5.74072
153.51900 -5.94643
153.93000 -6.26500
153.82300 -6.04594
153.61400 -5.70366
153.40300 -5.36112
153.19300 -5.01833
152.92700 -4.60329
152.66200 -4.18815
152.61600 -4.13010
152.55700 -4.03917
152.47800 -3.97364
152.41500 -3.90297
152.32800 -3.82223
152.22600 -3.73899
152.13200 -3.66584
152.03800 -3.63575
151.98700 -3.64860
151.92900 -3.67667
151.81400 -3.72013
151.67500 -3.76873
151.56300 -3.66511
151.42800 -3.75424
151.37500 -3.70620
151.30100 -3.65625
151.22200 -3.73657
151.09500 -3.80630
150.98700 -3.69197
150.90900 -3.72352
150.79300 -3.77503
150.67800 -3.81816
150.55200 -3.83913
150.44700 -3.85709
150.32000 -3.88086
150.24000 -3.90269
150.22600 -3.87360
150.19200 -3.82943
150.12100 -3.78988
150.02700 -3.75198
149.93800 -3.72378
149.87200 -3.65909
149.81700 -3.61656
149.81600 -3.61764
149.77300 -3.59230
149.71700 -3.57966
149.60300 -3.56959
149.45300 -3.54429
149.29500 -3.52151
149.08900 -3.46572
148.87800 -3.39465
148.67500 -3.30577
148.49900 -3.22195
148.32900 -3.14063
148.12300 -3.02628
147.98300 -2.92212
147.81600 -2.81284
147.60500 -2.87857
147.53900 -2.88103
147.47800 -2.90886
147.40700 -2.96204
147.32500 -3.05326
147.24100 -3.15205
147.16200 -3.26100
147.08300 -3.38515
146.99900 -3.51435
146.91800 -3.64099
146.83600 -3.75493
146.41500 -3.43769
146.11000 -3.47062
145.39900 -3.48507
148.01000 -5.00000
148.01000 -7.31238
148.58700 -7.39451
> SC
-76.31210 -52.92850
-76.01970 -53.43520
-75.72030 -53.94120
-75.23890 -54.29410
-74.74920 -54.64510
-74.12020 -55.00370
-73.47990 -55.35900
-72.99520 -55.66540
-72.27720 -55.96240
-71.54810 -56.25520
-70.40110 -56.62200
-69.25610 -56.85220
-68.09720 -57.07170
-67.10180 -57.50190
-65.86720 -57.73630
-64.61700 -57.95860
-63.57070 -58.35920
-62.57140 -58.60290
-61.03990 -59.01050
-59.70450 -59.45350
-58.96980 -59.72850
-58.22300 -59.99930
-56.92500 -60.56470
-56.26920 -60.74220
-55.80970 -60.70010
-55.06660 -60.76310
-54.30900 -60.97760
-54.30070 -61.51020
-53.12210 -61.03660
-52.06810 -60.75270
-51.11940 -60.57250
-50.88710 -60.09360
-49.59940 -60.04360
-48.25070 -59.96840
-46.96320 -59.95980
-45.60340 -60.09150
-44.22590 -60.24250
-43.15090 -60.37610
-42.06740 -60.50100
-41.21360 -60.97500
-39.82700 -60.63400
-39.09300 -60.61800
-37.56050 -60.64330
-36.41810 -60.62000
-34.82520 -60.68950
-33.44640 -60.70090
-32.36700 -60.40890
-31.01390 -60.51180
-29.73820 -60.57530
-28.74330 -60.60100
-27.69670 -60.61710
-27.70480 -60.46730
-28.67710 -60.45870
-29.59800 -60.43470
-29.88120 -60.17360
-30.03140 -59.93700
-30.10750 -59.51500
-29.55470 -59.51380
-29.56340 -58.81670
-29.95090 -58.80520
-30.00690 -58.27190
-29.84420 -58.26190
-29.85170 -57.59790
-30.06920 -57.59950
-30.12920 -57.09540
-30.38000 -57.09370
-30.46900 -56.85100
-30.74310 -56.85930
-30.74340 -56.56990
-30.72710 -56.51100
-30.72100 -56.44920
-30.37790 -56.44340
-30.33380 -56.29040
-30.32530 -56.13450
-30.33240 -56.05170
-30.33430 -55.94910
-30.32630 -55.86350
-30.31570 -55.75390
-29.81700 -55.68350
-29.77280 -55.60480
-29.79360 -55.50090
-29.81470 -55.32680
-29.71470 -55.20430
-29.48850 -55.03340
-30.90560 -54.82170
-32.36700 -54.58540
-33.73380 -54.46030
-33.35510 -54.86000
-33.05770 -55.45800
-33.69110 -55.60500
-34.59120 -55.72950
-36.10830 -55.64160
-36.84600 -55.21490
-37.81030 -55.08620
-38.71490 -54.85320
-39.71120 -54.63340
-40.65970 -54.39720
-41.59710 -54.15360
-42.41010 -53.87970
-43.21250 -53.60030
-44.20950 -53.26970
-45.19100 -52.93090
-46.41410 -52.83010
-47.66260 -53.49070
-49.16260 -53.66400
-50.67130 -53.71000
-52.17590 -53.87260
-53.38210 -54.20940
-54.74130 -54.40600
-55.59650 -54.53040
-56.45670 -54.64860
-57.75000 -54.42600
-59.24580 -54.39810
-60.53220 -54.37350
-61.93300 -54.26000
-62.82080 -54.31710
-63.71310 -54.21770
-64.78800 -54.17260
-65.87080 -54.51780
-67.40400 -54.39410
-68.98860 -54.62970
-69.86690 -54.23090
-70.51270 -54.09940
-71.29060 -53.92250
-72.08160 -53.71830
-73.01050 -53.31350
-74.03510 -52.91110
-74.99560 -52.55640
-75.74350 -52.31470
-76.48330 -52.06840
> SL
-57.49380 -60.85460
-58.13080 -60.96150
-58.89060 -61.08180
-59.83600 -61.17680
-60.65020 -61.36320
-61.33230 -61.54310
-62.20290 -61.84120
-63.10530 -62.11000
-63.96930 -62.42240
-63.29160 -62.82470
-62.41980 -63.00130
-61.75010 -63.29280
-60.11800 -62.94520
-58.61430 -62.55330
-57.38960 -62.30380
-56.30560 -62.06270
-55.43590 -61.68680
-54.30070 -61.51020
-54.30900 -60.97760
-55.06660 -60.76310
-55.80970 -60.70010
-56.26920 -60.74220
-56.92500 -60.56470
> SO
48.63260 -38.01420
49.03440 -37.99990
49.03660 -37.79170
49.94510 -37.79020
49.96220 -37.59680
50.82330 -37.57990
50.82700 -37.45070
51.55480 -37.44150
52.28270 -37.43220
52.31060 -36.79730
52.33800 -36.16240
52.90230 -36.15300
53.46650 -36.14090
53.47060 -35.51670
54.21610 -35.30240
54.25510 -34.54160
55.27470 -34.56050
55.30100 -34.28720
55.69870 -34.23500
55.73790 -33.65280
56.40060 -33.62680
57.06070 -33.55420
57.09120 -32.83500
57.12230 -32.30280
57.15300 -31.77060
57.80000 -31.72200
58.45630 -31.69100
58.52990 -31.05530
59.16670 -31.04970
59.18800 -30.56710
60.00540 -30.56070
60.76280 -30.53150
60.74730 -30.01450
60.76240 -29.99900
60.78640 -29.46520
60.81020 -28.93130
61.53220 -28.91990
61.51760 -28.77720
62.16190 -28.81140
62.13510 -28.48960
62.74620 -28.45850
62.70300 -28.15250
63.21120 -28.16400
63.19420 -28.02140
63.62110 -28.03880
63.60370 -27.83130
64.46690 -27.81750
65.33210 -27.81220
65.34750 -27.51410
66.35900 -27.51450
66.37300 -27.28110
67.12900 -27.26920
67.15550 -26.86740
67.42400 -26.86990
67.43330 -26.57150
67.96220 -26.58300
67.97910 -26.29060
68.62190 -26.26250
68.59790 -26.12060
68.81970 -26.14100
68.82940 -26.00890
69.15000 -25.99330
69.13790 -25.78430
69.46030 -25.78220
69.49000 -25.67620
69.95950 -25.65120
70.08960 -25.48250
69.59210 -24.97010
69.93930 -24.67850
69.68040 -24.36860
69.40160 -24.03960
69.84970 -23.70870
69.55770 -23.37310
69.16210 -22.83050
68.79670 -22.38700
69.20170 -22.08770
68.65290 -21.44950
68.27680 -20.87770
68.55920 -20.71190
68.21250 -20.29070
67.89670 -20.46900
67.76790 -20.28000
67.59300 -20.36890
67.30950 -20.07250
67.04040 -20.21810
66.75130 -19.87030
66.42800 -20.07830
66.03330 -19.57750
65.52170 -18.82810
65.26390 -18.44320
65.00730 -18.05790
65.54240 -17.78300
66.14280 -17.45010
66.70810 -17.09010
67.41050 -16.65870
67.03300 -16.13890
67.38270 -15.94190
67.29020 -15.82150
66.88820 -15.26960
66.48830 -14.69800
66.20760 -14.33870
65.92780 -13.97910
66.20970 -13.77730
65.82050 -13.26810
66.36920 -12.83270
66.03300 -12.42580
65.69780 -12.01850
66.41820 -11.55900
66.16740 -11.21000
66.78740 -10.76200
66.46000 -10.35020
66.91950 -9.99041
67.37800 -9.62999
67.08960 -9.27031
67.56480 -8.88140
68.03900 -8.49189
67.64240 -8.02709
68.07310 -7.64768
67.81130 -7.25250
68.27380 -6.81090
67.78230 -6.25933
68.21910 -5.89099
68.60690 -5.47188
68.19850 -5.04193
68.75100 -4.54877
68.34850 -4.11762
68.66720 -3.77068
68.27020 -3.35132
67.89210 -2.88800
68.24900 -2.54022
67.78840 -2.08765
67.92910 -1.91296
67.36710 -1.43996
67.66200 -1.03960
67.02310 -0.57788
67.20890 -0.33984
66.83920 -0.03884
67.15940 0.33713
66.65730 0.72201
66.86980 1.06795
66.49250 1.33138
66.67280 1.62094
66.33280 1.85871
65.99230 2.05200
66.17940 2.39253
66.37950 2.75200
65.96260 2.97150
65.48900 3.29907
65.21280 2.92078
64.68220 3.29895
64.61810 3.21695
63.88980 3.60222
63.81920 3.48212
63.38820 3.70015
63.33070 3.63067
62.86780 3.89294
63.00230 4.10805
62.45680 4.52272
61.99970 4.91131
61.52930 5.26156
61.65730 5.48967
61.14170 5.90952
60.67010 6.30983
60.03830 6.76686
60.17890 6.95076
59.69970 7.31217
59.21970 7.67308
59.30920 7.76825
58.88000 8.09719
58.91830 8.16694
58.61060 8.40075
58.25140 8.64690
58.43020 8.86262
58.14760 9.08978
58.26250 9.29259
58.01840 9.45008
58.06300 9.53244
57.49060 9.94156
57.26060 9.68141
57.02890 9.85747
56.97750 9.85724
56.91920 9.97076
57.13750 10.43360
57.35640 10.89630
57.57600 11.35890
57.79630 11.82130
58.01740 12.28350
58.23920 12.74550
57.86750 13.00230
57.63920 13.13770
57.73270 13.30900
57.80960 13.45090
57.68910 13.52250
57.47750 13.64300
57.30150 13.74000
57.29900 13.77180
57.13970 13.84760
56.96880 13.93720
57.03720 14.06810
56.90310 14.14070
56.76160 14.20760
56.81880 14.30210
56.26520 14.62320
56.20790 14.64330
56.17910 14.62130
56.05740 14.64110
55.82180 14.69230
55.66850 14.72160
55.63120 14.68140
55.48000 14.72920
55.27780 14.78850
55.10840 14.85050
55.04730 14.71160
54.95760 14.72720
54.73080 14.80100
54.54890 14.86980
54.51100 14.76010
54.45050 14.62100
54.38730 14.63990
54.33190 14.67070
54.28740 14.68140
54.24930 14.69140
54.19260 14.70960
54.14940 14.73280
54.06870 14.77220
54.01770 14.65730
53.92870 14.48940
53.86250 14.35090
53.81800 14.36150
53.57900 14.44080
53.35840 14.51180
53.22020 14.56230
53.21130 14.53790
53.12220 14.55860
52.90710 14.62210
52.73700 14.68130
52.66720 14.56150
52.54690 14.59720
52.29920 14.66250
52.13890 14.68870
51.94000 14.35300
51.76250 14.02830
51.56980 13.66730
51.44870 13.45760
51.34290 13.27180
51.25320 13.12230
51.07900 13.19230
50.84160 13.27940
50.66150 13.36180
50.57300 13.21810
50.42940 13.27250
50.31020 13.31250
50.25240 13.22900
50.16730 13.12250
50.06140 13.16750
49.84910 13.25120
49.68000 13.31280
49.59260 13.16860
49.47210 13.00780
49.42960 13.04190
49.34900 12.89730
49.27840 12.80190
49.07050 12.85280
48.88200 12.90840
48.80250 12.76980
48.69920 12.65760
48.56710 12.69060
48.44790 12.72890
48.34870 12.57260
48.26750 12.60230
48.14200 12.64070
48.04790 12.67100
47.99140 12.58070
47.90140 12.46110
47.78830 12.49230
47.64940 12.51850
47.58750 12.44090
47.53890 12.36870
47.31900 12.43010
47.16130 12.46300
47.13030 12.35870
47.04890 12.38770
46.99230 12.40300
46.92970 12.30020
46.84870 12.21080
46.71680 12.24820
46.57890 12.29210
46.51080 12.20190
46.42900 12.08750
46.31070 12.14250
46.19760 12.17240
46.15030 12.11230
46.10970 12.05810
45.85090 12.10020
45.64960 12.15190
45.63720 12.15860
45.60180 12.07300
45.52180 11.98290
45.42800 12.01760
45.32770 12.05250
45.28110 11.99830
45.09690 11.99890
44.91320 12.01160
44.88170 12.01890
44.78020 12.02240
44.51310 12.01260
44.04930 12.00800
42.44078 10.96725
42.64043 10.91139
42.55834 10.90075
42.48047 10.86586
42.40755 10.83936
42.33108 10.82640
42.15701 10.82772
41.98332 10.84060
41.73474 10.86474
41.50249 10.79971
41.40095 10.61945
41.34532 10.41459
41.27465 10.26786
41.20077 10.12303
41.15338 9.98053
41.10530 9.83825
41.01083 9.67992
40.89417 9.53606
40.78055 9.39502
40.66408 9.25642
40.41960 9.02417
40.15068 8.82081
39.86605 8.57417
39.61051 8.29697
39.18601 7.70125
38.83430 7.05889
38.51041 6.44077
38.10153 5.87898
38.09732 5.87457
38.10153 5.87898
37.67807 5.47451
37.28536 5.04119
36.96004 4.48462
36.73185 3.88132
36.61089 3.24182
36.58219 2.59094
36.59704 1.94710
36.65808 1.30613
36.78860 0.59293
36.99981 -0.10000
37.34416 -0.75873
37.78569 -1.35843
38.27913 -1.94416
38.76552 -2.53562
39.18222 -3.14186
39.54336 -3.78299
39.90761 -4.11338
40.06284 -4.44806
40.19757 -4.77656
40.28654 -5.11979
40.29977 -5.46771
40.24299 -5.81148
39.94709 -6.14810
39.88818 -6.49238
39.93382 -6.82110
40.06043 -7.12952
40.22580 -7.44970
40.39620 -7.76725
40.76260 -8.44300
41.13075 -9.11782
41.49213 -9.79260
41.84135 -10.47381
41.99075 -10.80184
42.15051 -11.12469
42.36454 -11.39655
42.64867 -11.59391
43.34047 -11.85502
44.05602 -12.05014
44.80945 -12.23558
45.57734 -12.24490
46.35208 -12.25496
47.11847 -12.24401
47.86985 -12.09362
48.63244 -12.02213
49.00213 -12.02213
49.36610 -12.07752
49.68427 -12.21601
49.96591 -12.41956
50.44396 -12.97102
50.77972 -13.62051
51.03047 -15.03738
50.84889 -16.47190
50.39684 -17.89968
49.73780 -19.24399
48.86430 -20.48192
47.99866 -21.72580
47.67330 -22.38542
> SS
153.51900 -5.94643
153.10700 -5.74072
152.65300 -5.64024
152.25700 -5.75490
151.87600 -5.92553
151.51900 -6.21031
151.14800 -6.44252
150.66300 -6.69359
150.14600 -6.88149
149.86000 -6.93936
149.31400 -7.03217
148.58700 -7.39451
148.73300 -7.47525
148.94400 -7.60693
149.14800 -7.66468
149.33400 -7.66492
149.60900 -7.62419
149.86600 -7.61219
150.17300 -7.62900
150.55500 -7.68698
150.91700 -7.75724
151.30700 -7.85219
151.68000 -7.95532
152.06200 -8.10364
152.41100 -8.26014
152.68500 -8.38779
152.95900 -8.54419
153.10800 -8.68401
153.17000 -8.78265
153.23700 -8.88951
153.25500 -9.18615
153.69700 -8.96649
154.08700 -8.63265
154.48100 -8.29620
154.87200 -7.96237
155.26200 -7.62863
155.45400 -7.48875
154.92700 -7.29284
154.54000 -6.81779
154.22500 -6.50689
153.93000 -6.26500
> SU
120.62000 -6.12225
120.51600 -5.27551
120.34100 -4.63970
119.95300 -4.30293
119.56500 -3.96595
118.82300 -3.60956
118.57800 -3.25522
118.72300 -2.40821
118.88400 -1.94980
119.04500 -1.49138
119.29600 -0.68033
119.47500 -0.08103
119.24900 0.71372
119.30600 1.57712
119.69600 2.03338
120.18900 2.20752
120.82400 2.31094
121.66900 2.30853
122.48000 2.37711
123.21900 2.02386
123.43000 2.00599
123.74300 4.88000
122.81600 4.88000
121.88800 4.88000
120.96100 4.88000
120.83800 5.74739
120.71500 6.61475
120.59100 7.48209
120.46600 8.34938
120.34100 9.21664
120.21600 10.08390
120.09000 10.95100
119.96300 11.81810
119.83500 12.68520
119.52500 13.11240
119.21300 13.53930
119.02900 14.06270
118.88100 14.79730
119.00000 15.30590
119.11300 16.06740
119.25500 16.55570
119.24800 16.84020
119.16100 17.62900
119.27900 18.20140
119.79500 18.87810
120.11500 19.48680
119.92655 19.84817
120.07571 20.44482
120.00113 21.38951
120.03600 21.95090
119.61800 22.26860
118.95800 22.00310
118.48400 22.10670
118.04500 21.49830
117.86400 20.71990
117.50400 20.33010
117.14500 19.93950
116.31900 19.81530
115.49400 19.68730
114.92600 19.34050
114.41900 18.82610
114.00000 18.43770
113.31300 18.28040
112.62800 18.12070
112.09800 18.03850
111.56900 17.95480
111.04000 17.86970
110.51200 17.78310
109.57300 17.78550
108.63400 17.78350
107.69500 17.77690
106.75600 17.76590
105.81700 17.75040
104.87800 17.73050
104.31200 17.70850
103.74600 17.68480
103.18000 17.65960
102.61500 17.63270
102.03200 17.35030
101.45100 17.06630
101.14100 16.57530
100.83200 16.08380
100.29700 15.46160
99.76600 14.83810
99.20980 14.44580
98.29990 14.43400
97.39000 14.41880
96.48030 14.40000
96.50310 14.12920
95.85710 13.78250
95.50460 12.91800
95.15460 12.05300
94.80680 11.18760
94.41460 10.67900
94.02380 10.17000
94.21640 9.71684
94.41460 9.27021
93.98600 9.01948
94.17120 8.68600
94.42880 8.31186
94.77470 7.84720
94.45990 7.60272
94.88260 7.13930
98.00000 5.00000
106.00000 -4.77476
> SW
-30.31570 -55.75390
-30.32630 -55.86350
-30.33430 -55.94910
-30.33240 -56.05170
-30.32530 -56.13450
-30.33380 -56.29040
-30.37790 -56.44340
-30.72100 -56.44920
-30.72710 -56.51100
-30.74340 -56.56990
-30.74310 -56.85930
-30.46900 -56.85100
-30.38000 -57.09370
-30.12920 -57.09540
-30.06920 -57.59950
-29.85170 -57.59790
-29.84420 -58.26190
-30.00690 -58.27190
-29.95090 -58.80520
-29.56340 -58.81670
-29.55470 -59.51380
-30.10750 -59.51500
-30.03140 -59.93700
-29.88120 -60.17360
-28.67710 -60.45870
-27.70480 -60.46730
-27.69670 -60.61710
-26.88950 -60.50600
-26.37090 -60.19100
-26.13880 -59.97330
-25.99590 -59.38580
-25.90070 -58.92090
-25.81940 -58.19500
-25.99020 -57.42530
-26.40270 -57.17360
-26.82630 -56.73360
-27.20020 -56.49200
-27.62050 -56.20960
-27.81400 -56.12440
-28.14949 -55.93190
-28.40440 -55.79480
-28.64660 -55.70490
-29.48850 -55.73340
> WL
146.39800 -8.10254
146.91800 -8.41044
146.95400 -8.59828
147.53900 -8.88649
148.20700 -9.21176
148.75100 -9.56973
149.13300 -9.35255
149.67600 -9.80087
150.24500 -9.94531
150.46600 -9.68686
151.00500 -9.68138
151.54500 -9.67589
151.65400 -9.76005
151.83400 -9.76114
151.83800 -9.90561
151.91800 -9.93028
152.02400 -9.94203
152.08600 -9.94400
152.21400 -9.94533
152.22300 -10.03900
152.41300 -10.04730
152.54700 -10.05600
152.65100 -10.07770
152.84900 -10.08810
152.85500 -10.38440
153.17400 -10.39810
153.36200 -10.39810
153.55200 -10.35500
153.75200 -10.34460
153.84700 -10.32540
154.01000 -10.34070
154.12500 -10.33130
154.16900 -10.32300
154.21900 -10.27920
154.21800 -9.91264
154.37900 -9.87219
154.59600 -9.81056
154.71900 -9.76305
154.84900 -9.72297
154.85600 -9.83902
154.95100 -9.83485
155.07000 -9.79486
155.17200 -9.72993
155.17200 -9.62138
155.29100 -9.55615
155.34700 -9.53242
155.43600 -9.49296
155.47300 -9.56795
155.57700 -9.53069
155.59900 -9.58072
155.70800 -9.54838
155.79700 -9.52648
155.81300 -9.57154
155.90800 -9.55456
155.97900 -9.54810
155.98900 -9.55797
156.08600 -9.53838
156.06600 -9.40524
156.12400 -9.38140
156.10100 -9.26847
156.25800 -9.22502
156.35000 -9.20553
156.42800 -9.17875
156.39000 -8.80938
156.36100 -8.59844
156.33100 -8.38495
156.29600 -8.17405
156.04700 -7.88376
155.81200 -7.70595
155.45400 -7.48875
155.26200 -7.62863
154.87200 -7.96237
154.48100 -8.29620
154.08700 -8.63265
153.69700 -8.96649
153.25500 -9.18615
153.23700 -8.88951
153.17000 -8.78265
153.10800 -8.68401
152.95900 -8.54419
152.68500 -8.38779
152.41100 -8.26014
152.06200 -8.10364
151.68000 -7.95532
151.30700 -7.85219
150.91700 -7.75724
150.55500 -7.68698
150.17300 -7.62900
149.86600 -7.61219
149.60900 -7.62419
149.33400 -7.66492
149.14800 -7.66468
148.94400 -7.60693
148.73300 -7.47525
148.58700 -7.39451
148.01000 -7.31238
> YA
114.41900 18.82610
114.92600 19.34050
115.49400 19.68730
116.31900 19.81530
117.14500 19.93950
117.50400 20.33010
117.86400 20.71990
118.04500 21.49830
118.48400 22.10670
118.95800 22.00310
119.61800 24.00000
120.98100 25.25000
122.55400 25.16490
123.18200 24.85980
123.72100 24.89850
123.75500 25.01650
124.14800 25.07020
124.70500 25.11970
124.69700 25.47510
125.15900 25.56910
125.73600 25.64370
125.66300 25.92700
126.06500 26.12330
126.38300 26.37000
126.47700 26.54030
126.82000 26.81060
126.74500 27.00570
126.88500 27.14910
127.41700 27.48550
127.34700 27.66150
127.59900 27.78960
128.04900 28.05280
128.55700 28.40100
128.32100 28.70790
128.68700 29.03210
129.05500 29.35540
128.64600 29.89310
128.88100 30.10420
128.84800 30.38700
129.03200 30.58540
128.81900 31.02450
129.05900 31.26450
129.12100 31.40940
129.44200 31.79260
129.74511 33.20932
128.85760 33.60087
127.91788 33.86190
126.95206 34.09683
126.26300 34.25210
125.52100 33.56330
124.79100 32.87010
124.07200 32.17270
123.36400 31.47130
122.78000 31.50220
122.19500 31.53050
121.61100 31.55710
121.02700 31.58100
120.36800 31.39190
119.71100 31.19940
119.00100 31.37600
118.57700 31.77630
118.15000 32.17510
117.71900 32.57250
117.28400 32.96840
116.52100 33.59300
115.74600 34.21280
114.96000 34.82770
114.28000 34.84260
113.59900 34.85380
113.25000 34.46900
112.90500 34.08330
112.27400 33.46490
111.65100 32.84340
111.63300 32.25190
111.61500 31.66030
111.20900 31.25170
110.80600 30.84180
109.88000 30.56930
108.95900 30.29030
108.04300 30.00490
107.13300 29.71320
106.26200 29.25430
105.39900 28.78980
105.17000 28.33430
104.94200 27.87840
105.18200 27.11690
105.41900 26.35490
105.72000 25.79690
106.01800 25.23830
106.57800 24.64640
107.13200 24.05240
107.68100 23.45640
108.56100 23.14080
109.43600 22.82030
110.30800 22.49510
111.17500 22.16520
112.03800 21.83070
112.28800 21.40780
112.53700 20.98450
112.78400 20.56090
113.03000 20.13690
113.27400 19.71260
113.51700 19.28800
113.75900 18.86300
114.00000 18.43770
> TO
184.01500 -23.74990
184.15800 -23.51260
184.33700 -23.22050
184.51100 -22.90580
184.67700 -22.61690
184.86100 -22.28980
185.04800 -21.91530
185.18200 -21.52630
185.29700 -21.24760
185.44900 -20.89260
185.59700 -20.58620
185.78200 -20.20400
185.94700 -19.77880
186.03000 -19.46080
186.17600 -19.07100
186.26400 -18.77690
186.30200 -18.48320
186.40900 -18.15230
186.46000 -17.93480
186.55500 -17.67660
186.62600 -17.27060
186.66500 -16.96290
186.68900 -16.71570
186.69300 -16.33190
186.70000 -16.04100
186.66900 -15.73200
186.64500 -15.56110
186.57200 -15.37340
185.73600 -15.31380
185.43300 -15.25050
185.33300 -15.37050
185.26900 -15.47080
185.17800 -15.61610
185.13400 -15.73920
185.13000 -15.88040
185.39900 -15.93580
185.43200 -16.05210
185.43100 -16.20080
185.42400 -16.35450
185.45000 -16.59670
185.46500 -16.73550
185.47100 -16.87420
185.47700 -17.06580
185.43500 -17.10070
185.40100 -17.31970
185.42900 -17.36030
185.40300 -17.61220
185.44000 -17.63010
185.43200 -17.84180
185.34100 -18.03510
185.24300 -18.23080
185.13000 -18.41630
185.04400 -18.60450
184.96500 -18.78780
184.90500 -19.00150
184.84500 -19.22530
184.81100 -19.45940
184.79000 -19.70370
184.02100 -19.38650
183.97300 -19.65080
183.92100 -19.81410
183.87800 -19.88430
183.81800 -20.10560
183.88400 -20.12890
183.84800 -20.26470
183.84100 -20.42340
183.82400 -20.49390
183.81000 -20.65500
183.76300 -20.79580
183.73600 -20.89130
183.71100 -20.99950
183.67800 -21.11260
183.62800 -21.30120
183.59500 -21.48740
183.55100 -21.60050
183.48000 -21.81150
183.39900 -22.00740
183.36500 -22.23140
183.30900 -22.28640
183.29100 -22.50050
183.25200 -22.73450
183.08700 -23.04810
182.89800 -23.41440
182.75000 -23.70790
182.58100 -24.10510
183.11300 -24.02950
183.64400 -23.95200
184.30900 -23.85260
> NI
183.34000 -15.60410
182.87000 -15.55940
182.75200 -15.70960
182.61600 -15.80660
182.50700 -15.89890
182.42500 -15.96110
182.36600 -16.02360
182.33600 -16.10650
182.32200 -16.17690
182.48700 -16.31960
182.63600 -16.43700
182.79900 -16.57460
182.93200 -16.72460
183.07900 -16.87720
183.18000 -17.03440
183.28700 -17.21940
183.37500 -17.39920
183.46800 -17.57400
183.53800 -17.73100
183.59700 -17.87270
183.69600 -18.05510
183.70300 -18.13080
183.67000 -18.26660
183.65400 -18.30680
183.56000 -18.47230
183.48900 -18.60020
183.44900 -18.68550
183.41600 -18.76840
183.41300 -18.83640
183.43000 -18.97520
183.45100 -19.21740
184.02100 -19.38650
184.79000 -19.70370
184.81100 -19.45940
184.84500 -19.22530
184.90500 -19.00150
184.96500 -18.78780
185.04400 -18.60450
185.13000 -18.41630
185.24300 -18.23080
185.34100 -18.03510
185.43200 -17.84180
185.44000 -17.63010
185.40300 -17.61220
185.42900 -17.36030
185.40100 -17.31970
185.43500 -17.10070
185.47700 -17.06580
185.47100 -16.87420
185.46500 -16.73550
185.45000 -16.59670
185.42400 -16.35450
185.43100 -16.20080
185.43200 -16.05210
185.39900 -15.93580
185.13000 -15.88040
> PM
-82.00000 9.80000
-81.00000 9.80000
-78.50000 9.75000
-78.00000 9.50000
-77.50000 9.00000
-77.25000 8.80000
-77.50000 8.33000
-78.00000 7.95000
-78.50000 7.70000
-80.50000 7.50000
-81.50000 7.80000
-82.26245 8.17964
-82.26245 8.80000
-82.50000 9.00000
> PR
-66.14123 17.56612
-66.46423 17.46883
-66.84271 17.38860
-67.22582 17.33379
-67.94176 17.25932
-68.66095 17.24710
-69.36142 17.37209
-66.25000 19.10000
-66.00000 19.25000
-65.50000 19.30000
-65.00000 19.20000
-64.70000 18.85000
-64.90000 18.50000
-65.00000 18.33000
> GV
-73.68679 18.41277
-73.34115 18.35981
-74.00000 19.00000
-74.75000 19.33000
-75.90710 19.57341
-76.63523 19.68389
-76.58966 19.68478
-76.63523 19.68389
-76.98340 19.74650
-77.67260 19.62280
-78.36070 19.49650
-79.01100 19.38150
-79.66040 19.26420
-80.20950 19.15970
-80.75790 19.05360
-81.25630 18.95980
-81.75410 18.86470
-81.68930 18.33320
-81.62480 17.80160
-80.30000 17.95000
-77.40000 18.33000
-76.60000 18.30000
> BC
-111.00000 22.75000
-110.40000 23.50000
-110.00700 25.33920
-109.80600 25.55670
-109.87200 25.60730
-110.02400 25.70630
-110.29100 25.88950
-110.57200 26.06610
-110.77800 26.22490
-110.68000 26.36050
-110.75800 26.41590
-110.95700 26.53500
-111.22800 26.72340
-111.50600 26.92670
-111.37300 27.10530
-111.56900 27.21520
-111.38200 27.49690
-111.50600 27.57000
-111.71100 27.69350
-112.01500 27.90600
-112.32100 28.12490
-112.58900 28.32230
-112.81200 28.49870
-113.08700 28.71470
-113.33900 28.94980
-113.28100 29.00840
-113.52100 29.20540
-113.77500 29.43970
-113.96900 29.64580
-114.25000 29.50000
-115.80000 31.00000
-117.84500 31.75900
-118.64100 32.05130
-119.51300 32.51250
-120.00600 32.86140
-120.50700 33.21190
-116.50000 29.50000
-115.00000 27.40000
-114.20000 26.75000
-112.50000 24.90000
> SI
34.42800 28.41430
34.60090 28.94310
34.77550 29.47170
34.95190 30.00000
35.14170 30.70250
35.30890 31.38330
35.47010 32.00350
35.57130 32.75530
35.00000 33.25000
35.79120 35.68900
35.36210 35.40510
34.90010 35.09100
34.49980 34.78550
34.05420 34.50450
33.73540 34.30170
33.18970 34.03469
32.92116 34.22768
32.60153 34.26133
32.30069 34.12621
31.99235 34.01461
32.00000 31.50000
32.50000 29.80000
33.00000 28.90000
> DA
40.33130 17.26620
40.25120 16.78510
40.17160 16.30400
39.67070 15.77160
39.55949 15.63704
39.63539 15.58149
39.69024 15.50262
39.75759 15.40905
39.82795 15.31768
39.96825 15.09753
40.08670 14.86470
40.24824 14.58116
40.44807 14.32345
40.54815 14.20852
40.63781 14.08555
40.70555 13.98227
40.78307 13.88618
40.88264 13.77531
40.98917 13.67137
41.09880 13.58600
41.20889 13.50101
41.43379 13.33321
41.66968 13.18107
41.92205 12.99261
42.15190 12.77660
42.39034 12.57719
42.58140 12.33972
42.60507 12.09872
42.67195 11.87347
42.80885 11.78148
42.84130 11.79500
43.64950 12.01270
44.04930 12.00800
> SK
124.70500 25.11970
124.14800 25.07020
123.75500 25.01650
123.72100 24.89850
123.18200 24.85980
122.85974 23.84408
123.47263 23.83928
124.08483 23.87773
124.76255 23.99533
125.08000 24.10000
> ST
132.26900 31.25710
132.03000 31.48440
131.71700 31.76060
131.28400 31.87710
130.83500 31.98210
130.18500 32.01940
129.76800 32.04170
129.44200 31.79260
129.12100 31.40940
129.05900 31.26450
128.81900 31.02450
129.03200 30.58540
128.84800 30.38700
128.88100 30.10420
128.64600 29.89310
131.29299 29.65625
131.72988 30.21762
132.17651 30.77140
132.28335 31.10036
> VI
35.60000 4.50000
34.00000 0.00000
33.40000 -4.00000
34.40000 -5.50000
36.00000 -6.00000
33.00000 -8.00000
31.00000 -6.00000
30.00000 -2.00000
30.00000 -1.20000
31.00000 0.00000
33.50000 4.50000
> RO
36.50000 -6.50000
40.75000 -11.50000
41.00000 -14.50000
41.00000 -20.50000
36.00000 -24.00000
34.00000 -21.50000
34.00000 -20.80000
35.25000 -18.40000
35.25000 -15.00000
34.60000 -10.20000
34.25000 -9.50000
35.30000 -8.50000
> LW
43.50000 -22.00000
36.42366 -26.01055
36.27973 -26.02153
36.14000 -25.99361
37.56150 -36.98370
37.17400 -37.84040
36.77740 -38.69590
36.37130 -39.55000
35.95500 -40.40260
35.52800 -41.25370
35.08980 -42.10320
34.63600 -42.93070
34.15680 -43.74670
33.67750 -44.56070
33.17060 -45.38180
32.66260 -46.19110
32.12520 -46.99750
32.12580 -46.99980
33.17390 -47.26440
33.35850 -46.80550
33.54000 -46.34640
33.81840 -45.97910
33.98240 -46.08120
34.08690 -46.08990
34.26720 -46.21230
34.50370 -46.22160
34.70400 -45.97140
34.86820 -45.46570
35.01450 -45.10580
35.18190 -44.85550
35.66030 -44.86600
35.97290 -44.96070
36.30290 -44.96650
36.67740 -44.91970
37.08550 -44.80430
37.50830 -44.87530
38.08270 -44.61880
38.19370 -44.40100
38.33830 -44.05470
39.07290 -44.16480
39.26730 -43.72570
39.45880 -43.28620
40.50580 -43.43760
41.55780 -43.57940
41.68590 -43.11740
41.81200 -42.65530
42.46860 -42.72990
42.57190 -42.26020
42.67370 -41.79040
42.77400 -41.32050
> PA
161.97500 -61.76300
162.57900 -62.21280
163.20200 -62.65990
163.77300 -62.47460
164.27500 -62.32190
164.76800 -62.17720
165.10300 -62.07720
165.65300 -62.47270
165.96900 -62.66760
166.62000 -63.08690
166.85800 -63.22060
167.55000 -62.97120
168.27700 -62.77320
168.70800 -62.63210
169.23800 -62.44610
169.60500 -62.67620
170.06800 -62.97240
170.44100 -63.14880
171.00900 -63.44730
171.64000 -63.80720
172.16400 -64.09740
172.52000 -64.25610
173.63100 -64.73790
174.24200 -64.50790
174.81400 -64.31490
175.16200 -64.17410
175.58200 -63.98400
176.06300 -64.18780
176.54900 -64.41010
176.81900 -64.50600
177.33800 -64.73620
177.88900 -64.97490
178.24000 -65.07910
178.75900 -65.27400
179.38100 -65.47730
179.96300 -65.73850
-179.19700 -65.98590
-178.79300 -66.16320
-177.92600 -65.86230
-177.07200 -65.60690
-175.72900 -65.18250
-175.07000 -65.50500
-174.41800 -65.83520
-173.70900 -65.50610
-172.51700 -64.97830
-171.30000 -64.35640
-170.04300 -64.85850
-169.83900 -64.76370
-169.10900 -64.24480
-168.37900 -63.73030
-167.51300 -63.10600
-166.60800 -62.49000
-166.19900 -62.60560
-165.14900 -63.00700
-163.92100 -63.46670
-163.00100 -62.96750
-162.06100 -62.39360
-161.33800 -62.61440
-160.43000 -62.92330
-159.88800 -62.59540
-158.70300 -63.00440
-158.39400 -62.78850
-157.60100 -63.07000
-156.71700 -63.32400
-156.02200 -62.95250
-155.25400 -62.43270
-154.32400 -61.77620
-154.18100 -61.83610
-153.66100 -61.39920
-152.94300 -60.84070
-152.11900 -60.15750
-151.32900 -59.46940
-150.38200 -59.71760
-149.80900 -59.31410
-149.26400 -58.82210
-148.27600 -58.13000
-147.69200 -57.55470
-147.16700 -57.63790
-146.68100 -57.30760
-145.97900 -56.66860
-145.41200 -56.22770
-144.85700 -55.78420
-144.48200 -55.91030
-143.32400 -56.26250
-142.08600 -56.61930
-141.21100 -56.83920
-140.32500 -57.05280
-140.04100 -56.77220
-139.54500 -56.26780
-139.19100 -55.72490
-139.57800 -55.61460
-139.25300 -55.25090
-138.79900 -54.71230
-138.33800 -54.14100
-137.89000 -53.56790
-137.52200 -53.68780
-136.59000 -53.90670
-136.18000 -53.39570
-135.30700 -53.64300
-134.20500 -53.88710
-132.87000 -54.23710
-132.12600 -54.43230
-131.37500 -54.62290
-130.05900 -54.93140
-129.34500 -55.12860
-128.62400 -55.32150
-127.23100 -55.56540
-126.80000 -55.06410
-126.19700 -55.13820
-125.07700 -55.45410
-124.26200 -55.58730
-123.44200 -55.71500
-122.65500 -55.87310
-121.86200 -56.02620
-121.63500 -55.83210
-121.22800 -55.21890
-120.66300 -54.40980
-119.68500 -54.64160
-118.58100 -54.81850
-118.31300 -54.35030
-118.03700 -53.69080
-117.66100 -53.12410
-118.97700 -52.89740
-118.87500 -52.75240
-118.42200 -52.21200
-118.12000 -51.77180
-117.82400 -51.33090
-117.52200 -50.87470
-117.22500 -50.41780
-116.80200 -49.89340
-116.38800 -49.36750
-115.23300 -49.58920
-114.55600 -49.72100
-113.87500 -49.84890
-113.74500 -49.35740
-113.52800 -48.84100
-113.31500 -48.32420
-113.13100 -47.77330
-112.95000 -47.22210
-112.68500 -46.53850
-112.42600 -45.85440
-112.67500 -45.83270
-112.55000 -45.49420
-112.38100 -44.93780
-112.21600 -44.38110
-111.97100 -43.77380
-111.73000 -43.16590
-111.53800 -42.68330
-111.34900 -42.20040
-110.95400 -42.24870
-110.83200 -41.35550
-110.75400 -40.75970
-110.67700 -40.16380
-110.53300 -39.57490
-110.39100 -38.98580
-111.27000 -38.97850
-111.26800 -38.87760
-111.06700 -38.27600
-110.86900 -37.67410
-110.66800 -37.04230
-110.47100 -36.41020
-110.73900 -36.35780
-110.71500 -36.21860
-110.57900 -35.83010
-110.89500 -35.79670
-110.87700 -35.31910
-110.82700 -35.09080
-111.12600 -34.99480
-111.39900 -34.91230
-111.75600 -34.81140
-112.18700 -34.67420
-112.41700 -34.55620
-112.56200 -34.29960
-112.62800 -33.99880
-112.60400 -33.66260
-112.50400 -33.64980
-112.46000 -33.39890
-112.44200 -33.11200
-112.41800 -32.79380
-112.41500 -32.48890
-112.35600 -32.32780
-112.15100 -32.34260
-112.06500 -32.11440
-112.06300 -31.94850
-112.04100 -31.77370
-112.02300 -31.53620
-111.96400 -31.39050
-111.97800 -31.38620
-111.95100 -31.04460
-111.88500 -30.66580
-111.85100 -30.62440
-111.79700 -30.42480
-111.77500 -30.18730
-111.77300 -30.02470
-111.74900 -29.57880
-111.80600 -29.26560
-112.36700 -29.16020
-112.95600 -29.00880
-113.02000 -28.78720
-113.02100 -28.54950
-113.01000 -28.38290
-112.93400 -28.37940
-112.95500 -28.12900
-112.97100 -27.84950
-113.00100 -27.60740
-113.13300 -27.57700
-113.17825 -27.78632
-113.19836 -27.88628
-113.21330 -27.98701
-113.20726 -28.07358
-113.22034 -28.15706
-113.29793 -28.17137
-113.36292 -28.10801
-113.41120 -27.99985
-113.44346 -27.88574
-113.49228 -27.66037
-113.53057 -27.43299
-113.55518 -27.29521
-113.59657 -27.16167
-113.66256 -27.02675
-113.72786 -26.89151
-113.74805 -26.83527
-113.75886 -26.79866
-113.94400 -26.78970
-114.52600 -26.72510
-115.10500 -26.60400
-115.29100 -26.46590
-115.51800 -26.24340
-115.76900 -25.96770
-116.02800 -25.67380
-116.35300 -25.41580
-116.49000 -25.17200
-116.09900 -24.84750
-116.22500 -24.55580
-116.18400 -24.45830
-115.96800 -24.38290
-115.91200 -24.24180
-115.48200 -24.10510
-115.40200 -24.01740
-115.42400 -23.88440
-115.59900 -23.46840
-115.25400 -23.39750
-115.18300 -23.23700
-114.96200 -23.17890
-114.87500 -23.03960
-114.56700 -23.02360
-114.55644 -22.94968
-114.49800 -22.54260
-114.50500 -22.19610
-114.42100 -22.11450
-114.37900 -21.62700
-114.31800 -21.56360
-114.28930 -21.42173
-114.22900 -21.12130
-114.08700 -20.59930
-113.93100 -20.57450
-113.79600 -20.32100
-113.69700 -19.96750
-113.49800 -19.30060
-113.62300 -19.28520
-113.36400 -18.77660
-113.52000 -18.75790
-113.38300 -18.44420
-113.26400 -18.00810
-113.38800 -17.99380
-113.17400 -17.53840
-113.32900 -17.52110
-113.11700 -17.06500
-113.24100 -17.05150
-113.04100 -16.68340
-113.16500 -16.67030
-112.97300 -16.36090
-113.06600 -16.35130
-112.97300 -15.79170
-112.86900 -15.24780
-112.76600 -14.70380
-112.61300 -14.71800
-112.58100 -14.06190
-112.43900 -13.86460
-112.42600 -13.38630
-111.84600 -13.46450
-111.26600 -13.54130
-111.19100 -13.39640
-111.00700 -13.41080
-110.89200 -12.75530
-111.07700 -12.74170
-110.92600 -11.96840
-110.67500 -11.47240
-110.48500 -11.39420
-110.44700 -10.82240
-110.29200 -10.80170
-110.21800 -10.08040
-110.07100 -9.66505
-109.85700 -9.67656
-109.75600 -8.92454
-109.03800 -9.03537
-108.32000 -9.14481
-108.19200 -8.35695
-108.06300 -8.24014
-107.88000 -7.51409
-107.65300 -7.18594
-107.60700 -6.75924
-107.44100 -6.36670
-106.95000 -6.44278
-106.84500 -6.01620
-106.75200 -6.01875
-106.74100 -5.61990
-106.58700 -5.62383
-106.45000 -5.04324
-106.25300 -4.49391
-105.54400 -4.56935
-105.38000 -4.07847
-104.69900 -4.15158
-104.53900 -3.84440
-103.63700 -3.95089
-102.73500 -4.05639
-102.57100 -3.43472
-102.56600 -2.93572
-102.75400 -2.93392
-102.68700 -2.43571
-102.62100 -1.90611
-102.40200 -1.90746
-102.30700 -1.59589
-102.46200 -1.53269
-102.39900 -1.28336
-102.52400 -1.28284
-102.39700 -0.50323
-102.31900 -0.01548
-102.29400 0.15707
-102.25300 0.37170
-102.21000 0.70634
-102.24000 0.71282
-102.18100 1.13426
-102.22300 1.21398
-102.20300 1.22065
-102.24300 1.34857
-102.22200 1.36110
-102.25700 1.52778
-102.23000 1.54137
-102.26200 1.75155
-102.13300 1.77843
-102.10400 1.90382
-102.08800 1.90349
-102.07600 1.97154
-102.07500 2.02449
-102.06700 2.13734
-102.07500 2.16104
-102.08000 2.30830
-102.08800 2.32729
-102.09000 2.39090
-102.08500 2.41199
-102.08500 2.48615
-102.07700 2.50246
-102.08200 2.57438
-102.06800 2.63532
-102.10900 2.78564
-102.09600 2.79833
-102.11800 2.89294
-102.14500 2.88876
-102.19300 3.07219
-102.21900 3.23869
-102.19900 3.45816
-102.25900 3.75071
-102.18400 3.77753
-102.32000 4.65326
-102.45700 5.52897
-102.55800 6.35535
-102.65900 7.18172
-102.81000 7.79085
-102.96100 8.39993
-103.59500 8.37048
-104.22900 8.34001
-104.25800 8.45574
-104.29600 9.17474
-104.29600 10.01710
-103.59800 10.12320
-103.62800 10.27460
-103.73900 10.93660
-103.80700 11.40450
-103.87500 11.87230
-103.77200 11.89040
-103.92700 12.58680
-104.18100 13.32840
-104.43700 14.06980
-104.56300 14.67220
-104.69000 15.27450
-105.32000 15.10760
-105.35700 15.55760
-105.39800 16.26050
-105.36888 16.99942
-105.42100 17.00000
-105.48000 17.29020
-105.72500 17.50610
-106.32100 17.78000
-106.35900 17.92780
-106.35700 18.11770
-106.28787 18.52302
-106.52700 18.54440
-106.75600 18.58990
-107.00200 18.64710
-107.27200 18.75610
-107.52300 18.86320
-107.81600 18.93600
-108.23300 19.10730
-108.19800 19.22350
-108.53400 19.38370
-108.89600 19.54960
-108.90300 19.62550
-109.16000 19.80650
-109.45000 20.02710
-109.37300 20.14180
-109.37800 20.17570
-109.31900 20.24230
-109.21500 20.39730
-109.18700 20.49950
-109.28500 20.55840
-109.26100 20.64260
-109.19400 20.73920
-109.11100 20.82400
-109.01300 20.94900
-108.91500 21.06790
-108.80900 21.25290
-108.97700 21.34700
-108.93600 21.45130
-108.86800 21.53600
-108.78400 21.64280
-108.66900 21.77390
-108.58200 21.90470
-108.67600 21.95960
-108.58900 22.10240
-108.51600 22.20110
-108.52700 22.27690
-108.40700 22.44010
-108.27300 22.61340
-108.23200 22.71170
-111.00000 22.75000
-112.50000 24.90000
-114.20000 26.75000
-115.00000 27.40000
-116.50000 29.50000
-120.50700 33.21190
-120.95200 33.76340
-121.40800 34.31290
-121.78000 34.92800
-122.16300 35.54140
-122.53700 36.27170
-122.55800 36.67390
-123.17000 36.99620
-123.58000 37.41310
-123.77500 38.07960
-123.98600 38.49770
-124.20100 38.91900
-124.54600 39.38900
-124.95800 39.70160
-125.47800 40.00900
-125.78700 40.27110
-126.20500 40.28000
-126.15900 40.39040
-126.86900 40.42240
-127.57900 40.45000
-127.57900 40.53850
-127.71700 40.57260
-127.63900 41.08070
-127.56000 41.58880
-127.44600 41.55510
-127.40100 41.64050
-127.24100 41.69210
-127.03900 42.35700
-126.62700 43.01360
-127.57100 43.41950
-128.52800 43.81760
-129.49800 44.20750
-130.48000 44.58920
-130.36700 44.92950
-130.06900 45.28540
-130.18700 45.41400
-129.93600 45.73620
-129.86900 45.89600
-130.07300 45.94270
-130.05100 46.19580
-129.91700 46.22910
-129.80300 46.43320
-129.57200 46.40150
-129.25900 47.06470
-128.93800 47.72700
-129.19000 47.83540
-128.94000 48.32360
-129.14700 48.47600
-128.91900 48.86870
-129.70500 49.17680
-130.50100 49.47940
-130.16200 49.98270
-130.30000 50.05540
-130.16200 50.21720
-130.32900 50.29790
-130.25400 50.46470
-130.75300 50.90760
-131.07400 51.18510
-131.85000 51.61210
-131.57700 51.88580
-131.83200 52.25910
-132.33900 52.69710
-132.71400 53.12700
-133.09300 53.52170
-133.42600 53.92410
-133.84000 54.37740
-134.11945 54.38249
-134.61242 54.84901
-135.09101 55.33107
-135.54808 55.84803
-135.95673 56.40537
-136.34278 56.99150
-136.69186 57.60036
-136.85234 58.00847
-137.04500 57.60470
-138.36700 57.07860
-139.65300 56.53890
-140.90100 55.98640
-141.09900 55.89690
-141.60200 55.66470
-142.92800 55.40590
-144.19400 55.70270
-145.47900 55.98630
-146.88700 56.14510
-148.30500 56.28780
-149.73400 56.41410
-151.21800 56.30920
-152.22700 56.05830
-153.16400 55.61040
-154.16000 55.23900
-155.23900 54.78450
-156.13800 54.52720
-157.06700 54.31750
-157.98600 54.10080
-159.34400 53.85550
-160.12900 53.74080
-160.91000 53.62090
-161.66400 53.49640
-162.41300 53.36720
-163.17700 53.18000
-163.93400 52.98790
-164.66500 52.81830
-165.39000 52.64430
-166.10800 52.45270
-166.81900 52.25680
-167.99000 52.00070
-168.97200 51.74000
-169.37800 51.63220
-170.15900 51.43950
-170.89700 51.30610
-171.63400 51.17060
-172.48400 51.06930
-173.32800 50.96360
-174.11900 50.89630
-174.90700 50.82580
-175.62900 50.74470
-176.22300 50.58830
-177.08800 50.49600
-177.75800 50.48420
-178.48000 50.49030
-179.20200 50.49650
179.68800 50.50550
178.49800 50.61890
177.63700 50.71270
176.72000 50.89590
175.57100 51.10820
174.21900 51.40300
172.96400 51.68390
171.84700 52.02590
170.70000 52.49790
169.75200 52.85550
168.83600 53.20790
168.18800 53.56940
167.41300 53.90600
166.40700 54.23670
165.77100 54.58840
164.84700 54.95700
164.06600 55.20920
163.67000 54.77860
163.28200 54.34680
162.79000 53.62490
162.45800 53.00320
161.58400 52.65400
160.94500 52.15880
160.59900 51.48770
159.87700 50.85510
159.17400 50.15450
158.64400 49.85460
158.12100 49.55240
157.56800 49.10720
157.02400 48.65940
156.35300 48.18280
155.74200 47.72460
155.14100 47.26320
154.66400 46.85260
154.19500 46.44000
153.52800 45.89730
152.88000 45.52930
152.24000 45.15760
151.41900 44.70400
150.87700 44.44700
150.33900 44.18740
149.31100 43.72050
148.34000 43.20790
147.34500 42.68510
146.69000 42.36230
146.19800 42.07620
145.71000 41.78800
145.07700 41.31920
144.45400 40.84700
144.47900 40.54940
144.39900 40.36680
144.32800 40.20290
144.28300 40.06720
144.25400 39.92810
144.22500 39.76670
144.23600 39.55720
144.20300 39.37370
144.18900 39.12330
144.11900 38.90860
144.06100 38.70950
144.01700 38.53560
143.97300 38.35850
143.92800 38.16550
143.88800 37.92810
143.84300 37.70970
143.74300 37.47920
143.63700 37.28990
143.51800 37.05940
143.40800 36.86040
143.27500 36.64880
143.15100 36.51950
143.02000 36.33930
142.88700 36.26360
142.76100 36.18780
142.68100 36.06420
142.60600 36.00090
142.55500 35.94380
142.46000 35.67300
142.32500 35.50270
142.22100 35.33330
142.17000 35.21680
142.06700 35.16360
142.02900 34.88860
141.99200 34.66630
141.88300 34.21270
141.85800 33.70390
142.01200 33.25250
141.99400 32.55760
142.09900 31.98250
142.15900 31.31520
142.22400 30.71100
142.47300 30.12820
142.50700 29.62080
142.74800 28.97540
143.00200 28.51870
143.17200 27.94070
143.24300 27.46330
143.26000 26.73700
143.23100 26.32890
143.07500 25.61240
143.09800 24.91760
143.09600 24.90920
143.52200 24.39080
144.02200 23.76440
144.70600 23.25010
145.29200 22.71230
146.06200 22.20150
146.54500 21.72980
146.82200 21.33060
147.01900 20.80510
147.20700 20.30340
147.46000 19.74520
147.61900 19.17240
147.82000 18.64650
147.81100 18.06020
147.85600 17.28310
147.78700 16.52340
147.68400 15.65300
147.46200 14.96610
147.20100 14.21580
146.75200 13.36320
146.22100 13.00150
145.69100 12.64660
145.34900 12.31410
145.02400 12.21120
144.61900 12.02060
144.15700 11.78960
143.50300 11.49360
143.09700 11.56890
142.96100 11.40310
142.12200 11.28520
141.60800 11.05810
140.77200 10.85780
140.10000 10.94590
138.81300 11.12140
138.90647 11.06055
139.13176 11.00736
139.35682 10.95178
139.58745 10.89998
139.80152 10.80470
139.97783 10.60297
140.09822 10.36062
140.09713 10.36302
140.09822 10.36062
140.24266 9.99538
140.36141 9.62070
140.50021 9.19101
140.70530 8.79095
141.51700 8.11804
142.26200 7.61077
142.66600 7.38844
142.82211 7.31319
142.95796 7.27559
143.10093 7.27539
143.27733 7.28398
143.45256 7.30445
143.78841 7.40916
144.09810 7.57755
144.39325 7.78651
144.67486 8.01373
144.95183 8.24367
145.25147 8.44164
145.94962 8.62291
146.67113 8.54965
147.01092 8.44814
147.33199 8.29898
147.61824 8.09211
147.86960 7.84361
148.20908 7.39303
148.47120 6.89344
148.61881 6.31169
148.64968 5.70963
148.65920 5.14900
148.65633 4.58825
148.63831 4.01555
148.62825 3.44270
148.69400 3.13658
148.66800 2.62928
148.68400 2.05827
148.70000 1.48745
148.86300 0.93659
149.11200 0.40626
149.19100 -0.14324
149.25100 -0.39698
149.27000 -0.65021
149.48100 -0.81847
149.76900 -1.00453
150.02300 -1.02138
150.34400 -1.12276
150.71700 -1.22404
151.08900 -1.30833
151.42700 -1.46017
151.81600 -1.64562
152.15500 -1.86475
152.57800 -2.13414
152.91600 -2.15020
153.11900 -2.20029
153.39000 -2.43572
153.54200 -2.60389
153.71100 -2.68759
153.88200 -3.04097
154.03500 -3.32680
154.25600 -3.61210
154.35900 -3.94845
154.70000 -4.28294
154.95500 -4.55028
154.99200 -4.88657
154.97800 -5.24012
154.59200 -5.58051
154.54500 -5.90097
154.53300 -6.42324
158.00000 -6.50000
161.00000 -7.75000
162.00000 -8.75000
162.00000 -10.00000
165.50000 -10.00000
167.00000 -10.40000
167.50000 -11.00000
167.50000 -11.88540
168.34000 -12.01350
169.30500 -12.13840
170.27100 -12.25990
171.23900 -12.37800
172.20700 -12.49260
173.17600 -12.60390
174.14500 -12.71160
175.11600 -12.81580
176.03000 -12.98340
176.94500 -13.14770
177.86100 -13.30880
178.77900 -13.46670
179.69700 -13.62120
-179.38300 -13.77230
-178.69500 -13.82430
-178.00600 -13.87430
-177.23100 -14.34600
-177.41500 -14.70640
-176.88000 -14.67080
-176.34600 -14.63400
-175.86500 -14.47810
-175.30900 -14.40660
-174.75400 -14.33390
-174.08300 -14.37910
-173.83600 -14.53380
-173.40700 -14.58400
-173.27300 -14.69670
-173.13000 -14.78480
-172.93900 -14.86690
-172.77400 -15.03300
-172.60200 -15.15140
-172.42800 -15.37340
-172.35500 -15.56110
-172.33100 -15.73200
-172.30000 -16.04100
-172.30700 -16.33190
-172.31100 -16.71570
-172.33500 -16.96290
-172.37400 -17.27060
-172.44500 -17.67660
-172.54000 -17.93480
-172.59100 -18.15230
-172.69800 -18.48320
-172.78600 -18.77690
-172.87400 -19.07100
-172.97000 -19.46080
-173.05300 -19.77880
-173.21800 -20.20400
-173.40300 -20.58620
-173.55100 -20.89260
-173.70300 -21.24760
-173.81800 -21.52630
-173.95200 -21.91530
-174.13900 -22.28980
-174.32300 -22.61690
-174.48900 -22.90580
-174.66300 -23.22050
-174.84200 -23.51260
-174.98500 -23.74990
-175.10200 -24.07010
-175.20900 -24.47190
-175.22900 -24.83620
-175.26100 -25.14250
-175.29700 -25.42570
-175.38200 -25.72950
-175.41500 -26.02480
-175.42300 -26.43720
-175.40000 -26.85690
-175.54500 -27.31800
-175.78500 -27.78430
-175.88500 -28.26380
-175.99500 -28.69710
-176.07800 -29.06530
-176.15300 -29.46910
-176.33900 -29.88080
-176.54700 -30.32150
-176.69000 -30.67790
-176.91900 -31.03740
-177.10800 -31.45170
-177.30100 -31.79320
-177.53800 -31.95740
-177.64900 -32.20280
-177.66600 -32.69590
-177.81000 -33.19080
-177.98100 -33.57950
-178.20800 -33.84590
-178.29400 -34.24130
-178.41300 -34.48540
-178.53900 -34.70580
-178.64100 -35.02180
-179.04400 -35.54230
-179.37100 -36.17900
-179.81100 -36.79300
179.83800 -37.47580
179.56900 -38.20450
179.36600 -38.53800
179.21500 -38.88850
179.12500 -39.22960
178.95000 -39.68480
178.79200 -40.08700
178.56600 -40.42400
178.28400 -40.80710
178.01500 -41.18790
177.60700 -41.49970
176.94843 -41.97120
176.44927 -42.25073
176.01001 -42.61013
175.45095 -42.80979
175.05162 -43.14922
174.21303 -43.58848
173.67394 -43.70828
173.07495 -44.06768
172.53585 -44.42707
171.85700 -44.82640
171.39777 -45.16583
170.89861 -45.50526
170.23971 -45.66499
169.62076 -46.24402
169.00180 -46.62338
168.46270 -46.96281
167.78385 -47.36214
167.20482 -47.80140
166.68569 -48.12086
166.16656 -48.42036
165.74727 -48.65995
165.12831 -49.07925
164.58922 -49.39871
164.07009 -49.85794
163.39123 -50.15744
162.96300 -50.36880
162.78500 -50.44330
162.59400 -50.54950
162.45300 -50.66790
162.27300 -50.81740
162.04900 -50.96210
161.82500 -51.11820
161.71600 -51.19210
161.54200 -51.39880
161.36800 -51.54210
161.16200 -51.75080
161.02600 -51.92440
160.76200 -52.16560
160.67100 -52.29180
160.53500 -52.43270
160.34200 -52.63360
160.09200 -52.82170
159.90500 -52.99070
159.73100 -53.17040
159.51200 -53.34520
159.31800 -53.59800
159.21600 -53.61950
159.14200 -53.81220
158.98500 -54.08830
158.88500 -54.30800
158.74000 -54.55890
158.67400 -54.68940
158.61800 -54.92790
158.59600 -55.04670
158.54000 -55.27240
158.46500 -55.52160
158.33200 -55.77930
158.22600 -56.02160
158.15300 -56.16470
158.04200 -56.31050
157.94400 -56.43850
157.82300 -56.72480
157.70300 -56.99180
157.64000 -57.23020
157.61500 -57.47400
157.62000 -57.78350
157.75100 -58.06810
157.92000 -58.33420
158.12100 -58.60510
158.26700 -58.77920
158.38500 -58.85810
158.65000 -59.07050
158.97200 -59.30460
159.18600 -59.51070
159.41300 -59.73160
159.69100 -59.93870
159.80300 -60.00550
160.32700 -60.50390
160.74000 -61.05260
161.12900 -61.38420
161.22800 -61.45670
MintPy-1.6.2/src/mintpy/data/plate_boundary/MORVEL/ 0000775 0000000 0000000 00000000000 15032632755 0022004 5 ustar 00root root 0000000 0000000 MintPy-1.6.2/src/mintpy/data/plate_boundary/MORVEL/plate_outlines.lalo 0000664 0000000 0000000 00000711433 15032632755 0025715 0 ustar 00root root 0000000 0000000 nb
-54.852 -0.438
-54.677 -0.039
-54.451 0.443
-54.832 0.965
-54.399 1.695
-54.037 2.360
-53.651 3.025
-53.834 3.369
-54.127 3.956
-54.430 4.415
-54.162 4.827
-54.309 5.084
-54.543 5.495
-54.114 6.184
-53.814 6.625
-54.101 7.237
-54.396 7.772
-54.396 7.772
-54.033 8.288
-53.668 8.799
-53.233 9.429
-52.792 9.993
-53.066 10.542
-53.332 10.975
-52.783 11.708
-52.375 12.299
-51.963 12.895
-52.141 13.204
-52.477 13.788
-51.997 14.463
-52.307 15.112
-52.084 15.428
-51.787 15.822
-52.169 16.907
-52.467 17.806
-52.734 18.537
-52.553 18.712
-52.817 19.994
-52.909 21.250
-53.051 22.504
-53.098 23.075
-53.200 23.021
-53.309 23.886
-53.422 24.685
-53.345 24.873
-53.345 24.873
-53.444 25.180
-53.410 25.648
-53.480 25.861
-53.582 25.987
-53.429 26.181
-53.065 26.338
-52.620 26.513
-52.378 26.713
-52.547 27.322
-52.673 27.370
-52.771 27.480
-52.904 28.111
-52.540 28.312
-52.277 28.403
-51.772 28.605
-51.137 28.969
-50.507 29.343
-49.934 29.712
-49.611 30.006
-49.215 30.362
-49.011 30.705
-48.587 31.008
-48.163 31.306
-47.682 31.588
-47.201 31.865
-47.000 32.126
-46.998 32.125
-46.191 32.663
-45.382 33.171
-44.561 33.678
-43.747 34.157
-42.931 34.636
-42.103 35.090
-42.103 35.090
-41.254 35.528
-40.403 35.955
-39.550 36.371
-38.696 36.777
-37.840 37.174
-36.984 37.562
-36.433 36.721
-35.876 35.892
-35.314 35.075
-34.746 34.269
-34.173 33.474
-33.595 32.690
-33.012 31.916
-32.425 31.153
-31.832 30.400
-31.236 29.656
-30.635 28.922
-29.849 28.341
-29.849 28.341
-29.454 28.054
-29.060 27.769
-28.625 27.179
-28.187 26.594
-27.477 26.595
-26.768 26.596
-26.474 27.253
-26.177 27.905
-25.733 27.800
-25.291 27.696
-24.847 27.592
-24.404 27.489
-23.928 27.944
-23.450 28.396
-22.971 28.844
-22.491 29.290
-22.352 29.770
-22.212 30.250
-22.071 30.729
-21.928 31.207
-21.784 31.684
-21.639 32.160
-21.492 32.636
-21.344 33.110
-20.512 33.196
-19.681 33.282
-19.350 33.613
-19.019 33.943
-18.688 34.272
-18.356 34.599
-17.976 35.200
-17.404 35.200
-16.833 35.199
-16.334 34.901
-15.834 34.604
-15.191 34.729
-14.549 34.852
-13.859 34.461
-13.167 34.071
-12.406 34.172
-11.717 34.441
-11.027 34.709
-10.455 34.081
-9.598 33.818
-8.741 33.556
-8.643 33.099
-8.546 32.643
-8.162 32.117
-7.778 31.592
-7.631 31.042
-7.483 30.493
-6.791 30.046
-6.099 29.600
-5.625 29.604
-5.151 29.608
-4.557 29.280
-3.962 28.953
-3.134 28.910
-2.306 28.868
-1.809 29.130
-1.313 29.392
-0.626 29.630
0.060 29.867
0.749 30.246
1.437 30.625
1.960 31.122
2.483 31.620
2.648 31.049
2.812 30.478
3.524 30.475
4.235 30.471
4.477 31.279
5.097 31.753
5.717 32.227
5.630 32.736
5.543 33.244
5.455 33.752
5.366 34.260
5.277 34.767
5.188 35.275
5.099 35.782
5.009 36.290
5.484 36.601
5.958 36.914
5.956 37.583
6.477 37.849
6.998 38.115
7.447 38.477
7.895 38.841
8.296 39.157
8.696 39.473
9.071 39.790
9.446 40.107
9.796 40.449
10.146 40.792
10.732 41.117
11.317 41.442
11.577 42.033
11.577 42.033
12.189 41.649
11.811 41.206
12.206 40.857
12.600 40.507
13.209 40.091
13.742 40.614
14.300 40.275
14.719 40.026
15.138 39.777
15.772 39.671
16.304 40.172
16.785 40.251
17.266 40.331
17.949 39.987
18.419 39.590
19.030 39.298
19.030 39.298
19.448 38.826
19.907 38.396
20.389 38.075
21.021 37.975
21.843 37.825
22.494 37.540
23.226 37.042
23.639 36.571
24.133 36.407
24.626 36.242
25.055 36.066
25.484 35.889
25.919 35.546
26.353 35.200
26.808 34.875
27.262 34.547
27.885 34.257
28.414 34.428
28.943 34.601
29.472 34.776
30.000 34.952
30.000 34.952
30.703 35.142
31.383 35.309
32.004 35.470
32.755 35.571
33.233 35.648
33.710 35.726
34.096 36.024
34.482 36.325
35.285 36.396
35.752 36.431
36.023 36.413
36.023 36.413
35.689 35.791
35.405 35.362
35.091 34.900
34.785 34.500
34.505 34.054
34.302 33.735
34.290 33.101
34.390 32.668
34.487 32.172
34.634 31.740
34.826 31.256
34.991 30.793
35.154 30.221
35.427 29.731
35.427 29.731
35.425 29.345
35.378 29.070
35.312 28.779
35.127 28.478
34.870 28.050
34.706 27.684
34.335 27.227
34.198 26.465
34.249 25.577
34.340 24.593
34.628 23.874
34.990 23.399
35.437 22.866
35.742 22.375
35.933 21.893
36.216 21.599
36.629 21.327
37.098 20.760
37.804 20.300
37.804 20.300
37.907 20.000
37.907 20.000
38.272 19.584
38.694 18.895
38.947 18.364
39.170 17.960
39.170 17.960
39.006 18.062
38.794 18.086
38.516 18.031
38.462 17.845
38.285 17.773
37.993 17.612
37.701 17.419
37.503 17.168
37.398 16.824
37.309 16.236
37.274 15.832
37.340 15.375
37.340 15.375
37.615 15.344
37.886 15.421
38.114 15.551
38.299 15.639
38.401 15.499
38.292 15.175
38.765 14.514
38.765 14.514
38.695 14.114
38.625 13.812
38.611 13.314
38.600 12.708
38.849 12.434
38.878 12.057
38.934 11.778
39.033 11.659
39.075 11.363
39.067 11.118
38.994 10.827
38.821 10.609
38.685 10.373
38.685 10.373
38.572 10.089
38.470 9.700
38.341 9.264
38.212 8.942
37.790 8.627
37.468 8.265
37.358 7.805
37.320 7.215
37.322 6.784
37.322 6.784
37.154 5.974
37.082 5.142
36.969 4.297
36.851 3.454
36.594 2.380
36.503 1.970
36.282 1.245
36.072 0.667
35.904 0.003
35.776 -0.748
35.771 -1.516
35.898 -1.992
36.105 -2.573
36.018 -2.893
35.858 -3.296
35.596 -3.749
35.014 -3.782
34.199 -4.056
34.068 -4.706
34.078 -5.072
33.985 -5.397
34.019 -5.808
34.263 -6.000
34.517 -6.040
34.784 -6.064
35.063 -6.730
35.273 -7.193
35.667 -8.031
36.051 -8.785
36.430 -9.545
36.651 -9.977
36.392 -10.429
36.098 -10.923
35.851 -11.585
36.328 -12.142
36.864 -12.903
37.395 -13.675
37.210 -14.411
37.021 -15.143
37.212 -15.386
37.297 -15.841
37.435 -16.742
37.503 -17.584
37.466 -18.124
37.307 -18.618
37.025 -19.682
36.954 -20.240
36.881 -20.797
36.820 -21.507
36.754 -22.216
36.702 -22.893
36.646 -23.570
36.755 -24.046
36.788 -24.146
36.781 -24.255
36.792 -24.311
36.863 -24.385
36.910 -24.434
36.971 -24.500
37.017 -24.554
37.095 -24.634
37.127 -24.680
37.217 -24.750
37.273 -24.738
37.352 -24.702
37.411 -24.667
37.467 -24.733
37.500 -24.775
37.533 -24.816
37.552 -24.845
37.584 -24.892
37.609 -24.931
37.644 -24.983
37.646 -25.101
37.769 -25.267
37.663 -25.355
37.718 -25.427
37.752 -25.464
37.818 -25.538
37.722 -25.633
37.790 -25.698
37.816 -25.734
37.878 -25.808
37.839 -25.916
37.935 -26.043
37.965 -26.075
38.036 -26.171
38.047 -26.302
38.116 -26.379
38.149 -26.417
38.222 -26.494
38.255 -26.532
38.324 -26.614
38.358 -26.647
38.420 -26.718
38.278 -26.830
38.360 -26.901
38.400 -26.941
38.464 -27.007
38.491 -27.029
38.571 -27.090
38.607 -27.129
38.666 -27.174
38.700 -27.203
38.780 -27.239
38.782 -27.484
38.836 -27.559
38.864 -27.606
38.914 -27.680
38.942 -27.722
39.000 -27.793
39.004 -27.955
38.983 -28.059
38.968 -28.120
38.952 -28.215
38.939 -28.292
38.993 -28.342
39.020 -28.365
39.058 -28.395
39.093 -28.420
39.134 -28.452
39.156 -28.484
39.130 -28.567
39.121 -28.619
39.179 -28.666
39.214 -28.686
39.263 -28.745
39.299 -28.781
39.373 -28.853
39.412 -28.895
39.379 -28.951
39.366 -28.982
39.338 -29.049
39.323 -29.090
39.294 -29.147
39.279 -29.188
39.250 -29.260
39.255 -29.297
39.315 -29.335
39.400 -29.770
39.400 -29.770
39.387 -29.909
38.888 -30.171
38.388 -30.430
38.403 -30.605
37.680 -31.071
37.705 -31.371
37.282 -31.516
37.392 -32.283
37.137 -32.395
37.176 -32.646
37.033 -32.708
37.065 -32.943
36.916 -33.005
36.941 -33.225
36.691 -33.313
36.742 -33.595
36.185 -33.772
36.221 -33.982
36.071 -34.057
36.079 -34.142
35.616 -34.335
35.625 -34.459
35.010 -34.746
35.148 -35.558
35.280 -36.373
34.693 -36.623
34.712 -36.785
34.554 -36.862
34.567 -37.046
34.124 -37.245
34.136 -37.336
33.705 -37.533
33.736 -37.678
33.501 -37.797
33.637 -38.597
33.768 -39.399
33.067 -39.586
33.084 -39.700
32.444 -40.129
31.802 -40.553
31.817 -40.710
31.194 -41.184
31.237 -41.430
30.606 -41.786
29.973 -42.136
30.070 -42.729
29.471 -43.037
29.469 -43.088
28.802 -43.483
28.811 -43.563
28.105 -43.942
28.107 -44.022
27.671 -44.203
27.235 -44.383
27.254 -44.506
26.767 -44.687
26.280 -44.867
26.270 -44.816
26.055 -44.899
26.081 -45.092
25.637 -45.296
25.192 -45.499
25.254 -45.791
24.590 -46.119
24.597 -46.196
23.917 -46.476
23.784 -45.699
23.646 -44.925
22.963 -45.024
22.973 -45.066
22.390 -45.157
21.806 -45.248
21.822 -45.385
21.247 -45.515
21.222 -45.419
20.596 -45.557
20.618 -45.774
19.802 -45.940
19.823 -46.002
19.377 -46.093
18.932 -46.184
18.935 -46.224
18.422 -46.318
18.422 -46.391
17.588 -46.520
17.566 -46.407
17.087 -46.498
16.607 -46.589
16.587 -46.529
16.019 -46.648
15.451 -46.766
15.451 -46.766
15.360 -45.947
15.267 -45.130
14.647 -45.136
14.026 -45.142
13.992 -45.061
13.336 -45.049
12.680 -45.037
12.626 -44.262
12.101 -44.278
12.085 -43.885
11.506 -43.903
10.927 -43.921
10.905 -43.448
10.883 -42.976
10.860 -42.504
10.836 -42.031
10.812 -41.559
10.787 -41.087
9.979 -41.083
9.973 -40.861
9.389 -40.865
9.373 -40.640
8.841 -40.652
8.815 -40.120
8.215 -40.141
8.197 -39.661
8.179 -39.181
8.159 -38.701
8.140 -38.221
7.703 -38.206
7.679 -37.536
7.654 -36.865
7.401 -36.851
7.363 -36.058
7.023 -36.047
6.935 -35.367
6.614 -35.363
6.616 -34.494
6.618 -33.624
6.104 -33.620
6.076 -33.514
5.649 -33.507
5.647 -32.978
4.804 -32.920
3.960 -32.862
3.986 -32.387
4.011 -31.912
4.036 -31.437
4.061 -30.962
3.255 -30.887
2.449 -30.811
1.643 -30.736
1.607 -30.027
0.797 -29.920
0.849 -29.210
0.953 -28.346
1.007 -27.831
1.062 -27.315
1.159 -26.474
0.498 -26.289
0.556 -25.659
0.614 -25.029
-0.245 -24.821
-1.103 -24.612
-1.034 -24.051
-0.964 -23.490
-0.880 -22.936
-0.796 -22.381
-0.680 -21.544
-0.588 -21.017
-0.497 -20.490
-0.333 -19.675
-0.176 -18.850
-0.073 -18.369
0.031 -17.889
0.150 -17.323
0.269 -16.757
0.299 -16.498
-0.556 -16.252
-0.520 -16.037
-1.143 -15.841
-1.073 -15.565
-1.493 -15.410
-1.301 -14.659
-1.108 -13.909
-0.915 -13.158
-1.507 -12.930
-2.099 -12.701
-1.945 -12.164
-2.400 -11.999
-2.855 -11.834
-3.013 -12.029
-3.493 -11.898
-3.972 -11.765
-4.103 -12.097
-4.587 -12.039
-4.609 -12.145
-5.026 -12.018
-4.942 -11.604
-5.415 -11.516
-5.377 -11.167
-5.930 -11.022
-6.020 -11.267
-6.755 -11.181
-6.961 -11.993
-7.165 -12.807
-7.367 -13.621
-7.889 -13.489
-8.411 -13.357
-8.374 -13.191
-9.225 -13.023
-9.276 -13.248
-9.794 -13.166
-9.825 -13.315
-10.623 -13.174
-11.421 -13.031
-11.539 -13.524
-11.655 -14.018
-11.771 -14.511
-11.885 -15.006
-12.339 -14.908
-12.320 -14.861
-12.656 -14.791
-12.577 -14.550
-13.218 -14.410
-13.265 -14.600
-13.737 -14.539
-14.208 -14.478
-14.036 -13.643
-14.849 -13.435
-15.663 -13.226
-15.688 -13.383
-16.212 -13.239
-16.323 -13.770
-16.433 -14.302
-16.765 -14.238
-16.777 -14.369
-17.386 -14.224
-17.995 -14.079
-17.893 -13.519
-17.790 -12.960
-18.287 -12.860
-18.785 -12.759
-18.747 -12.477
-19.341 -12.370
-19.935 -12.263
-19.825 -11.945
-20.278 -11.852
-20.299 -11.971
-21.176 -11.763
-21.209 -12.007
-21.735 -11.850
-21.752 -11.936
-22.153 -11.819
-22.267 -12.364
-22.379 -12.910
-22.630 -12.851
-22.730 -13.340
-22.829 -13.829
-23.544 -13.664
-23.514 -13.570
-24.146 -13.426
-24.777 -13.280
-24.887 -13.811
-25.648 -13.663
-25.738 -14.049
-26.586 -13.816
-26.564 -13.690
-27.443 -13.482
-28.321 -13.272
-28.213 -12.746
-28.941 -12.533
-28.941 -12.533
-29.098 -13.262
-29.251 -13.990
-29.852 -13.820
-29.828 -13.716
-30.491 -13.543
-31.157 -13.367
-31.179 -13.499
-31.661 -13.371
-32.143 -13.245
-32.275 -13.883
-32.400 -14.523
-32.898 -14.446
-33.499 -14.367
-33.569 -14.702
-34.043 -14.515
-34.238 -15.274
-34.690 -15.083
-34.770 -15.266
-35.182 -15.100
-35.343 -16.027
-35.499 -16.962
-35.663 -17.703
-36.068 -17.419
-36.472 -17.085
-36.562 -17.440
-36.944 -17.333
-37.374 -17.233
-37.472 -17.533
-38.025 -17.388
-38.447 -17.050
-38.401 -16.799
-38.558 -16.361
-38.883 -16.044
-39.352 -15.965
-39.681 -15.922
-39.790 -16.415
-40.273 -16.470
-40.366 -16.867
-40.790 -16.817
-41.176 -16.744
-41.519 -16.678
-41.806 -16.332
-42.338 -16.215
-42.868 -16.430
-42.868 -16.430
-43.387 -16.330
-43.684 -16.244
-44.132 -16.086
-44.580 -15.924
-45.028 -15.760
-45.476 -15.594
-45.371 -14.894
-45.898 -14.716
-45.797 -13.810
-46.688 -13.572
-47.578 -13.325
-47.471 -12.610
-47.361 -11.898
-47.245 -11.189
-47.126 -10.483
-47.649 -10.296
-48.172 -10.104
-48.694 -9.909
-49.216 -9.710
-49.091 -8.922
-48.961 -8.139
-49.283 -8.022
-49.270 -7.961
-50.059 -7.638
-50.001 -7.433
-50.610 -7.159
-50.417 -6.160
-50.216 -5.169
-50.675 -4.943
-51.133 -4.713
-51.591 -4.478
-52.049 -4.238
-51.979 -3.956
-52.764 -3.447
-53.547 -2.920
-54.327 -2.372
-54.053 -1.382
-54.453 -0.915
-54.852 -0.438
-54.852 -0.438
-54.852 -0.438
am
30.754 132.824
30.970 132.965
31.216 133.197
31.515 133.500
31.882 134.042
32.200 134.691
32.326 135.026
32.460 135.356
32.537 135.612
32.686 136.025
32.868 136.524
33.053 137.030
33.405 137.546
33.749 138.066
34.059 138.383
34.582 138.508
35.034 138.674
35.034 138.674
35.360 138.421
35.734 138.259
36.027 138.121
36.311 137.894
36.600 137.854
37.184 137.902
37.856 137.889
38.485 137.848
38.982 137.774
39.404 137.845
39.659 138.085
39.832 138.352
40.072 138.655
40.474 138.655
40.782 138.756
41.103 138.475
41.482 138.489
41.769 138.743
41.995 138.824
42.766 138.811
43.192 138.801
43.939 138.563
44.295 138.577
44.811 138.850
45.412 139.038
45.947 139.158
46.224 139.370
46.516 139.938
46.956 140.553
47.392 141.178
48.051 142.023
48.704 142.878
49.241 142.761
49.778 142.641
50.318 142.521
50.857 142.398
51.700 142.541
52.542 142.692
53.042 142.784
53.384 142.849
54.035 142.409
54.035 142.409
54.074 141.278
54.103 140.145
54.333 139.211
54.588 137.918
54.830 136.610
55.060 135.138
55.273 133.650
55.491 132.674
55.702 131.688
55.861 130.747
56.013 129.798
56.401 128.393
56.774 126.960
57.130 125.499
57.178 124.573
57.219 123.645
57.254 122.715
57.281 121.784
57.302 120.851
57.316 119.918
57.151 119.021
56.980 118.133
56.802 117.253
56.618 116.382
56.526 115.015
56.418 113.656
56.295 112.305
56.221 110.924
55.762 109.758
55.331 109.375
54.899 109.000
54.150 108.691
53.401 108.393
53.081 107.706
52.758 107.029
52.431 106.362
52.099 105.705
51.765 105.058
51.427 104.420
50.786 104.904
50.143 105.375
49.292 105.582
48.441 105.781
47.910 105.916
47.380 106.048
46.849 106.177
46.318 106.304
45.875 106.460
45.431 106.614
44.987 106.765
44.543 106.914
44.099 107.061
43.655 107.205
43.149 108.131
42.636 109.041
42.070 109.693
41.601 110.570
41.126 111.435
40.645 112.287
41.024 112.911
41.399 113.542
41.163 114.392
40.921 115.235
40.596 115.810
40.267 116.379
40.057 117.010
39.843 117.638
40.054 118.245
40.261 118.856
40.654 119.846
41.039 120.848
41.329 121.313
41.617 121.782
41.904 122.255
42.188 122.732
41.530 123.510
40.867 124.272
40.200 125.019
39.742 125.199
39.283 125.376
38.824 125.551
38.365 125.723
37.541 125.914
36.718 126.101
36.169 126.115
35.621 126.128
34.936 126.196
34.252 126.263
34.252 126.263
33.563 125.521
32.870 124.791
32.173 124.072
31.471 123.364
31.471 123.364
31.326 123.867
31.250 124.487
31.196 125.030
31.202 125.729
31.227 126.404
31.273 127.054
31.362 127.655
31.471 128.258
31.601 128.812
31.793 129.442
31.793 129.442
32.042 129.768
32.019 130.185
31.982 130.835
31.877 131.284
31.761 131.717
31.484 132.030
31.257 132.269
30.991 132.581
30.754 132.824
30.754 132.824
an
-54.396 7.772
-54.101 7.237
-53.814 6.625
-54.114 6.184
-54.543 5.495
-54.309 5.084
-54.162 4.827
-54.430 4.415
-54.127 3.956
-53.834 3.369
-53.651 3.025
-54.037 2.360
-54.399 1.695
-54.832 0.965
-54.451 0.443
-54.677 -0.039
-54.852 -0.438
-54.852 -0.438
-55.019 -1.039
-55.129 -1.606
-55.653 -1.614
-55.657 -2.080
-55.707 -2.896
-55.740 -3.720
-55.769 -4.056
-55.807 -4.691
-56.210 -4.675
-56.592 -4.693
-56.627 -5.448
-56.672 -6.057
-56.982 -6.094
-57.240 -6.130
-57.270 -6.538
-57.318 -6.999
-57.617 -7.013
-57.869 -7.009
-57.920 -7.525
-57.989 -8.607
-58.092 -9.885
-58.158 -11.190
-58.241 -12.649
-58.317 -13.954
-58.390 -15.069
-58.439 -15.972
-58.459 -16.005
-58.767 -16.226
-59.098 -16.410
-59.098 -16.917
-59.129 -17.667
-59.153 -18.060
-59.509 -18.123
-59.542 -18.433
-59.938 -18.547
-60.250 -18.646
-60.289 -19.370
-60.811 -19.581
-60.782 -20.651
-60.744 -21.719
-60.723 -22.914
-60.692 -24.107
-60.545 -25.093
-60.391 -26.071
-60.391 -26.071
-60.506 -26.890
-60.617 -27.697
-60.617 -27.697
-60.601 -28.743
-60.575 -29.738
-60.512 -31.014
-60.409 -32.367
-60.409 -32.367
-60.701 -33.446
-60.989 -34.825
-61.392 -36.418
-61.243 -37.560
-61.018 -39.093
-60.634 -39.827
-60.975 -41.214
-60.501 -42.067
-60.376 -43.151
-60.242 -44.226
-60.242 -44.226
-60.092 -45.603
-59.960 -46.963
-59.968 -48.251
-60.044 -49.599
-60.094 -50.887
-60.572 -51.119
-60.753 -52.068
-61.037 -53.122
-61.510 -54.301
-61.510 -54.301
-61.687 -55.436
-62.063 -56.306
-62.304 -57.390
-62.553 -58.614
-62.945 -60.118
-63.293 -61.750
-63.001 -62.420
-62.825 -63.292
-62.422 -63.969
-62.422 -63.969
-62.110 -63.105
-61.841 -62.203
-61.543 -61.332
-61.363 -60.650
-61.177 -59.836
-61.082 -58.891
-60.962 -58.131
-60.855 -57.494
-60.565 -56.925
-60.565 -56.925
-59.999 -58.223
-59.728 -58.970
-59.453 -59.705
-59.011 -61.040
-58.603 -62.571
-58.359 -63.571
-57.959 -64.617
-57.959 -64.617
-57.736 -65.867
-57.502 -67.102
-57.072 -68.097
-56.852 -69.256
-56.622 -70.401
-56.255 -71.548
-55.962 -72.277
-55.665 -72.995
-55.359 -73.480
-55.004 -74.120
-54.645 -74.749
-54.294 -75.239
-53.941 -75.720
-53.435 -76.020
-52.928 -76.312
-52.068 -76.483
-52.068 -76.483
-51.377 -76.626
-50.729 -76.757
-49.845 -76.990
-49.192 -77.024
-48.507 -76.925
-47.875 -76.650
-47.478 -76.321
-47.080 -75.997
-46.422 -75.958
-45.658 -76.006
-45.658 -76.006
-45.643 -76.675
-45.761 -77.661
-45.589 -77.764
-45.092 -77.990
-44.411 -78.207
-44.545 -78.893
-44.666 -79.586
-44.782 -80.281
-44.876 -81.106
-44.964 -81.935
-44.404 -82.138
-43.639 -82.351
-42.861 -82.509
-42.981 -83.448
-42.873 -83.454
-42.222 -83.604
-41.674 -83.716
-41.125 -83.827
-41.191 -84.487
-41.253 -85.148
-41.392 -86.240
-41.521 -87.336
-41.273 -87.417
-41.319 -88.447
-41.378 -89.250
-41.432 -90.054
-41.059 -90.088
-41.082 -90.739
-41.102 -91.391
-40.732 -91.476
-40.282 -91.512
-39.833 -91.548
-39.349 -91.603
-38.866 -91.658
-38.918 -92.340
-38.967 -93.022
-38.429 -93.075
-38.482 -93.996
-37.717 -94.093
-37.001 -94.130
-36.985 -94.909
-36.965 -95.689
-36.921 -96.552
-36.871 -97.413
-36.294 -97.402
-36.193 -98.417
-36.133 -99.532
-36.063 -100.645
-35.997 -101.286
-35.927 -101.926
-35.854 -102.565
-35.778 -103.202
-35.694 -103.998
-35.605 -104.793
-35.524 -105.391
-35.439 -105.988
-35.394 -106.666
-35.344 -107.343
-35.240 -108.071
-35.132 -108.797
-34.545 -109.259
-34.545 -109.259
-34.609 -109.691
-34.702 -109.919
-34.817 -110.141
-34.946 -110.326
-35.061 -110.527
-35.091 -110.827
-35.091 -110.827
-35.319 -110.877
-35.797 -110.895
-35.830 -110.579
-36.219 -110.715
-36.358 -110.739
-36.410 -110.471
-37.042 -110.668
-37.674 -110.869
-38.276 -111.067
-38.878 -111.268
-38.978 -111.270
-38.986 -110.391
-39.575 -110.533
-40.164 -110.677
-40.760 -110.754
-41.355 -110.832
-42.249 -110.954
-42.200 -111.349
-42.683 -111.538
-43.166 -111.730
-43.774 -111.971
-44.381 -112.216
-44.938 -112.381
-45.494 -112.550
-45.833 -112.675
-45.854 -112.426
-46.538 -112.685
-47.222 -112.950
-47.773 -113.131
-48.324 -113.315
-48.841 -113.528
-49.357 -113.745
-49.849 -113.875
-49.721 -114.556
-49.589 -115.233
-49.367 -116.388
-49.893 -116.802
-50.418 -117.225
-50.875 -117.522
-51.331 -117.824
-51.772 -118.120
-52.212 -118.422
-52.752 -118.875
-52.897 -118.977
-53.124 -117.661
-53.691 -118.037
-54.350 -118.313
-54.819 -118.581
-54.642 -119.685
-54.410 -120.663
-55.219 -121.228
-55.832 -121.635
-56.026 -121.862
-55.873 -122.655
-55.715 -123.442
-55.587 -124.262
-55.454 -125.077
-55.138 -126.197
-55.064 -126.800
-55.565 -127.231
-55.322 -128.624
-55.129 -129.345
-54.931 -130.059
-54.623 -131.375
-54.432 -132.126
-54.237 -132.870
-53.887 -134.205
-53.643 -135.307
-53.396 -136.180
-53.907 -136.590
-53.688 -137.522
-53.568 -137.890
-54.141 -138.338
-54.712 -138.799
-55.251 -139.253
-55.615 -139.578
-55.725 -139.191
-56.268 -139.545
-56.772 -140.041
-57.053 -140.325
-56.839 -141.211
-56.619 -142.086
-56.263 -143.324
-55.910 -144.482
-55.784 -144.857
-56.228 -145.412
-56.669 -145.979
-57.308 -146.681
-57.638 -147.167
-57.555 -147.692
-58.130 -148.276
-58.822 -149.264
-59.314 -149.809
-59.718 -150.382
-59.469 -151.329
-60.157 -152.119
-60.841 -152.943
-61.399 -153.661
-61.836 -154.181
-61.776 -154.324
-62.433 -155.254
-62.953 -156.022
-63.324 -156.717
-63.070 -157.601
-62.788 -158.394
-63.004 -158.703
-62.595 -159.888
-62.923 -160.430
-62.614 -161.338
-62.394 -162.061
-62.968 -163.001
-63.467 -163.921
-63.007 -165.149
-62.606 -166.199
-62.490 -166.608
-63.106 -167.513
-63.730 -168.379
-64.245 -169.109
-64.764 -169.839
-64.859 -170.043
-64.356 -171.300
-64.978 -172.517
-65.506 -173.709
-65.835 -174.418
-65.505 -175.070
-65.183 -175.729
-65.607 -177.072
-65.862 -177.926
-66.163 -178.793
-65.986 -179.197
-65.739 179.963
-65.477 179.381
-65.274 178.759
-65.079 178.240
-64.975 177.889
-64.736 177.338
-64.506 176.819
-64.410 176.549
-64.188 176.063
-63.984 175.582
-64.174 175.162
-64.315 174.814
-64.508 174.242
-64.738 173.631
-64.256 172.520
-64.097 172.164
-63.807 171.640
-63.447 171.009
-63.149 170.441
-62.972 170.068
-62.676 169.605
-62.446 169.238
-62.632 168.708
-62.773 168.277
-62.971 167.550
-63.221 166.858
-63.087 166.620
-62.668 165.969
-62.473 165.653
-62.077 165.103
-62.177 164.768
-62.322 164.275
-62.475 163.773
-62.660 163.202
-62.213 162.579
-61.763 161.975
-61.457 161.228
-61.457 161.228
-61.559 160.865
-62.026 159.440
-62.478 157.970
-62.914 156.457
-62.174 155.701
-61.429 154.981
-60.681 154.294
-59.930 153.639
-60.176 152.473
-60.413 151.290
-59.944 151.008
-59.475 150.733
-59.570 150.006
-58.999 149.652
-58.552 149.398
-58.104 149.150
-57.436 148.806
-57.527 148.076
-57.566 147.902
-57.088 147.721
-56.610 147.545
-56.132 147.373
-55.654 147.206
-55.175 147.043
-54.695 146.881
-54.695 146.881
-54.755 145.401
-54.798 144.282
-54.234 143.778
-54.215 142.250
-54.053 141.451
-53.885 140.659
-53.504 140.584
-52.750 140.478
-52.274 140.400
-51.798 140.323
-51.838 139.813
-51.174 139.733
-50.279 139.645
-50.256 139.110
-50.231 138.401
-50.234 137.700
-50.220 136.946
-50.248 136.226
-50.209 135.246
-50.384 135.026
-50.347 134.245
-50.306 133.465
-50.223 132.261
-50.222 131.515
-50.604 131.256
-50.525 130.569
-50.348 129.412
-50.159 128.312
-49.976 127.143
-49.643 127.196
-49.294 127.243
-48.764 127.313
-48.698 126.861
-48.630 126.434
-49.044 126.264
-49.401 126.074
-49.717 125.896
-49.598 125.262
-49.358 125.125
-49.153 124.992
-48.983 124.607
-48.848 124.213
-48.906 124.007
-49.122 123.771
-49.585 123.328
-49.542 123.013
-49.729 122.797
-49.812 122.553
-49.846 122.224
-49.736 121.866
-49.620 121.437
-49.006 121.555
-48.890 120.842
-49.524 120.516
-50.036 120.273
-49.938 119.366
-49.802 118.547
-49.865 118.194
-49.620 117.523
-49.271 116.635
-49.540 116.256
-49.852 115.988
-49.974 115.500
-49.878 114.362
-50.388 114.024
-50.200 112.967
-50.084 111.666
-49.930 111.363
-49.800 111.129
-49.829 110.868
-49.779 110.472
-49.523 109.351
-49.523 109.351
-49.259 108.240
-49.182 108.285
-49.015 107.486
-48.841 106.692
-49.101 106.554
-48.934 105.898
-48.762 105.247
-48.588 104.601
-48.409 103.959
-48.227 103.321
-48.042 102.688
-47.853 102.060
-47.661 101.436
-47.465 100.817
-47.267 100.202
-47.978 99.624
-47.744 98.979
-47.506 98.340
-47.265 97.707
-47.020 97.080
-46.772 96.458
-46.520 95.842
-45.996 96.274
-45.471 96.698
-45.141 95.806
-44.805 94.926
-44.620 95.040
-44.390 94.470
-44.157 93.904
-43.922 93.343
-43.684 92.786
-43.443 92.234
-43.199 91.686
-42.953 91.142
-42.705 90.603
-42.454 90.068
-42.200 89.537
-41.944 89.011
-41.686 88.488
-41.997 88.060
-41.711 87.502
-41.421 86.950
-41.129 86.402
-40.834 85.859
-41.180 85.466
-41.525 85.070
-41.868 84.669
-42.210 84.263
-42.551 83.853
-42.890 83.439
-42.309 82.588
-41.722 81.752
-41.130 80.931
-41.512 80.463
-41.892 79.990
-41.384 79.319
-40.872 78.659
-40.866 78.484
-40.326 77.825
-39.905 78.425
-39.538 78.002
-39.262 78.384
-39.005 78.073
-38.659 78.529
-38.393 78.181
-38.001 78.706
-37.483 78.021
-36.998 78.606
-36.511 79.184
-36.098 78.690
-35.683 78.201
-35.161 78.803
-34.842 78.442
-34.807 78.488
-34.324 77.917
-33.838 77.352
-33.194 78.086
-32.828 77.658
-32.459 77.233
-32.090 76.812
-31.719 76.395
-31.465 76.689
-30.970 76.148
-30.906 76.204
-30.573 75.797
-30.240 75.393
-30.118 75.515
-30.006 75.364
-29.839 75.554
-29.328 74.938
-29.265 74.994
-28.904 74.592
-28.541 74.192
-28.317 74.406
-27.944 73.969
-27.570 73.534
-27.655 73.400
-27.446 73.123
-27.573 72.920
-27.146 72.463
-26.718 72.008
-26.656 72.066
-26.386 71.717
-26.454 71.580
-26.083 71.135
-26.187 70.994
-25.912 70.665
-26.060 70.409
-25.651 69.960
-25.651 69.960
-25.676 69.490
-25.782 69.460
-25.784 69.138
-25.993 69.150
-26.009 68.829
-26.141 68.820
-26.121 68.598
-26.262 68.622
-26.291 67.979
-26.583 67.962
-26.572 67.433
-26.870 67.424
-26.867 67.156
-27.269 67.129
-27.281 66.373
-27.515 66.359
-27.514 65.347
-27.812 65.332
-27.817 64.467
-27.831 63.604
-28.039 63.621
-28.021 63.194
-28.164 63.211
-28.152 62.703
-28.459 62.746
-28.490 62.135
-28.811 62.162
-28.777 61.518
-28.920 61.532
-28.931 60.810
-29.465 60.786
-29.999 60.762
-30.015 60.747
-30.532 60.763
-30.561 60.005
-30.567 59.188
-31.050 59.167
-31.055 58.530
-31.691 58.456
-31.722 57.800
-31.771 57.153
-32.303 57.122
-32.835 57.091
-33.554 57.061
-33.627 56.401
-33.653 55.738
-34.235 55.699
-34.287 55.301
-34.560 55.275
-34.542 54.255
-35.302 54.216
-35.517 53.471
-36.141 53.467
-36.153 52.902
-36.162 52.338
-36.797 52.311
-37.432 52.283
-37.441 51.555
-37.451 50.827
-37.580 50.823
-37.597 49.962
-37.790 49.945
-37.792 49.037
-38.000 49.034
-38.014 48.633
-38.478 48.017
-38.651 48.023
-38.764 47.135
-38.870 46.244
-39.495 46.160
-40.119 46.074
-40.108 45.332
-40.366 45.303
-40.369 44.716
-40.691 44.686
-40.671 44.023
-40.915 44.009
-40.850 42.873
-41.321 42.774
-41.790 42.674
-42.260 42.572
-42.730 42.469
-42.655 41.812
-43.117 41.686
-43.579 41.558
-43.438 40.506
-43.286 39.459
-43.726 39.267
-44.165 39.073
-44.055 38.338
-44.401 38.194
-44.619 38.083
-44.619 38.083
-44.875 37.508
-44.804 37.086
-44.920 36.677
-44.967 36.303
-44.961 35.973
-44.866 35.660
-44.855 35.182
-45.106 35.014
-45.466 34.868
-45.971 34.704
-46.222 34.504
-46.212 34.267
-46.090 34.087
-46.081 33.982
-45.979 33.818
-46.346 33.540
-46.806 33.358
-47.264 33.174
-47.000 32.126
-47.000 32.126
-47.201 31.865
-47.682 31.588
-48.163 31.306
-48.587 31.008
-49.011 30.705
-49.215 30.362
-49.611 30.006
-49.934 29.712
-50.507 29.343
-51.137 28.969
-51.772 28.605
-52.277 28.403
-52.540 28.312
-52.904 28.111
-52.771 27.480
-52.673 27.370
-52.547 27.322
-52.378 26.713
-52.620 26.513
-53.065 26.338
-53.429 26.181
-53.582 25.987
-53.480 25.861
-53.410 25.648
-53.444 25.180
-53.345 24.873
-53.345 24.873
-53.422 24.685
-53.309 23.886
-53.200 23.021
-53.098 23.075
-53.051 22.504
-52.909 21.250
-52.817 19.994
-52.553 18.712
-52.734 18.537
-52.467 17.806
-52.169 16.907
-51.787 15.822
-52.084 15.428
-52.307 15.112
-51.997 14.463
-52.477 13.788
-52.141 13.204
-51.963 12.895
-52.375 12.299
-52.783 11.708
-53.332 10.975
-53.066 10.542
-52.792 9.993
-53.233 9.429
-53.668 8.799
-54.033 8.288
-54.396 7.772
-54.396 7.772
AP
-15.736 -75.916
-16.330 -75.292
-16.823 -74.609
-17.373 -73.949
-17.747 -73.400
-18.257 -72.737
-18.721 -72.266
-19.298 -71.746
-19.811 -71.487
-20.249 -71.362
-20.758 -71.323
-21.262 -71.249
-21.965 -71.307
-21.965 -71.307
-21.734 -70.683
-21.500 -70.062
-21.500 -69.114
-21.500 -68.166
-21.500 -67.655
-21.500 -67.144
-21.500 -66.634
-21.500 -66.123
-21.465 -65.427
-21.427 -64.732
-21.399 -64.139
-21.368 -63.545
-20.759 -63.360
-20.150 -63.176
-19.511 -63.286
-18.872 -63.396
-18.375 -63.617
-17.878 -63.836
-17.464 -63.856
-17.402 -64.585
-17.110 -65.419
-16.729 -65.795
-16.348 -66.171
-15.714 -66.696
-15.079 -67.218
-14.527 -67.423
-14.028 -68.008
-13.527 -68.590
-13.395 -69.046
-13.261 -69.501
-13.035 -70.125
-12.807 -70.747
-12.578 -71.392
-12.348 -72.036
-12.418 -72.655
-12.486 -73.274
-13.182 -73.850
-13.876 -74.429
-14.497 -74.922
-15.117 -75.418
-15.736 -75.916
-15.736 -75.916
ar
24.382 65.028
24.350 64.162
24.285 63.366
24.283 62.581
24.087 61.955
24.122 61.365
24.177 60.870
24.232 60.374
24.311 59.603
24.363 58.716
24.443 57.832
24.788 57.345
25.552 57.121
26.049 57.057
26.545 56.992
27.301 56.875
27.369 56.423
26.947 55.662
26.668 54.728
26.717 53.860
27.121 53.241
27.561 52.504
27.957 51.912
28.487 51.283
29.072 50.998
29.578 51.057
30.103 50.453
30.453 49.974
30.802 49.492
31.212 49.265
31.621 49.036
32.237 48.489
32.308 48.170
32.311 47.770
32.448 47.411
32.887 46.608
33.391 45.918
33.893 45.505
34.591 45.000
34.591 45.000
35.025 44.836
35.458 44.670
36.015 44.515
36.572 44.357
37.098 44.020
37.407 43.648
37.685 43.176
37.990 42.797
38.213 42.289
38.355 41.839
38.616 41.236
38.849 41.026
39.080 41.002
39.080 41.002
38.857 40.624
38.768 40.163
38.497 39.402
38.314 38.856
38.121 38.365
37.994 38.042
37.834 37.682
37.512 37.083
37.398 36.789
36.730 36.467
36.260 36.389
36.023 36.413
36.023 36.413
35.752 36.431
35.285 36.396
34.482 36.325
34.096 36.024
33.710 35.726
33.233 35.648
32.755 35.571
32.004 35.470
31.383 35.309
30.703 35.142
30.000 34.952
30.000 34.952
29.472 34.776
28.943 34.601
28.414 34.428
27.885 34.257
27.262 34.547
26.808 34.875
26.353 35.200
25.919 35.546
25.484 35.889
25.055 36.066
24.626 36.242
24.133 36.407
23.639 36.571
23.226 37.042
22.494 37.540
21.843 37.825
21.021 37.975
20.389 38.075
19.907 38.396
19.448 38.826
19.030 39.298
19.030 39.298
18.419 39.590
17.949 39.987
17.266 40.331
16.785 40.251
16.304 40.172
15.772 39.671
15.138 39.777
14.719 40.026
14.300 40.275
13.742 40.614
13.209 40.091
12.600 40.507
12.206 40.857
11.811 41.206
12.189 41.649
11.577 42.033
11.577 42.033
11.795 42.841
12.013 43.650
12.008 44.049
12.013 44.513
12.022 44.780
12.019 44.882
12.012 44.913
11.999 45.097
11.998 45.281
12.053 45.328
12.018 45.428
11.983 45.522
12.073 45.602
12.159 45.637
12.152 45.650
12.100 45.851
12.058 46.110
12.112 46.150
12.172 46.198
12.143 46.311
12.088 46.429
12.202 46.511
12.292 46.579
12.248 46.717
12.211 46.849
12.300 46.930
12.403 46.992
12.388 47.049
12.359 47.130
12.463 47.161
12.430 47.319
12.369 47.539
12.441 47.587
12.518 47.649
12.492 47.788
12.461 47.901
12.581 47.991
12.671 48.048
12.641 48.142
12.602 48.267
12.573 48.349
12.729 48.448
12.691 48.567
12.658 48.699
12.770 48.803
12.908 48.882
12.853 49.071
12.802 49.278
12.897 49.349
13.042 49.430
13.008 49.472
13.169 49.593
13.313 49.680
13.251 49.849
13.168 50.061
13.123 50.167
13.229 50.252
13.312 50.310
13.273 50.429
13.218 50.573
13.362 50.661
13.279 50.842
13.192 51.079
13.122 51.253
13.272 51.343
13.458 51.449
13.667 51.570
14.028 51.763
14.353 51.940
14.689 52.139
14.662 52.299
14.597 52.547
14.562 52.667
14.681 52.737
14.622 52.907
14.559 53.122
14.538 53.211
14.562 53.220
14.512 53.358
14.441 53.579
14.361 53.818
14.351 53.862
14.489 53.929
14.657 54.018
14.772 54.069
14.733 54.149
14.710 54.193
14.691 54.249
14.681 54.287
14.671 54.332
14.640 54.387
14.621 54.450
14.760 54.511
14.870 54.549
14.801 54.731
14.727 54.958
14.712 55.047
14.851 55.108
14.789 55.278
14.729 55.480
14.681 55.631
14.722 55.669
14.692 55.822
14.641 56.057
14.621 56.179
14.643 56.208
14.623 56.265
14.623 56.265
14.660 57.002
14.662 57.476
14.599 57.984
14.916 58.213
14.646 58.589
15.088 59.034
14.895 59.410
15.242 59.642
15.572 59.909
16.142 59.964
16.713 60.020
17.458 60.062
18.240 60.215
18.240 60.215
18.798 60.456
19.306 60.712
19.813 60.970
20.230 61.230
20.644 61.492
21.126 61.848
21.425 62.096
22.083 62.133
22.385 62.502
22.683 62.877
23.201 63.631
23.694 64.275
24.038 64.651
24.382 65.028
24.382 65.028
AS
35.427 29.731
35.728 29.389
35.970 29.137
36.361 28.789
36.983 28.411
37.269 28.255
37.520 28.254
37.757 28.278
37.965 28.200
38.227 27.954
38.499 27.672
38.876 27.138
39.298 26.610
39.529 26.256
39.708 25.860
40.156 25.416
40.156 25.416
40.092 24.931
40.055 24.559
39.918 24.002
39.720 23.787
39.287 23.463
38.948 23.212
38.599 22.955
38.271 22.727
38.355 22.164
38.420 21.582
38.439 21.097
38.471 20.437
38.115 20.282
37.804 20.300
37.804 20.300
37.098 20.760
36.629 21.327
36.216 21.599
35.933 21.893
35.742 22.375
35.437 22.866
34.990 23.399
34.628 23.874
34.340 24.593
34.249 25.577
34.198 26.465
34.335 27.227
34.706 27.684
34.870 28.050
35.127 28.478
35.312 28.779
35.378 29.070
35.425 29.345
35.427 29.731
35.427 29.731
AT
40.156 25.416
39.708 25.860
39.529 26.256
39.298 26.610
38.876 27.138
38.499 27.672
38.227 27.954
37.965 28.200
37.757 28.278
37.520 28.254
37.269 28.255
36.983 28.411
36.361 28.789
35.970 29.137
35.728 29.389
35.427 29.731
35.427 29.731
35.154 30.221
34.991 30.793
34.826 31.256
34.634 31.740
34.487 32.172
34.390 32.668
34.290 33.101
34.302 33.735
34.505 34.054
34.785 34.500
35.091 34.900
35.405 35.362
35.689 35.791
36.023 36.413
36.023 36.413
36.260 36.389
36.730 36.467
37.398 36.789
37.512 37.083
37.834 37.682
37.994 38.042
38.121 38.365
38.314 38.856
38.497 39.402
38.768 40.163
38.857 40.624
39.080 41.002
39.080 41.002
39.392 40.449
39.703 39.892
39.909 39.268
40.009 38.795
40.269 38.021
40.600 37.062
40.849 36.169
41.002 35.527
41.123 34.832
41.159 34.286
41.023 33.405
40.860 32.392
40.679 31.482
40.615 31.116
40.601 30.774
40.768 30.007
40.686 29.030
40.668 28.724
40.618 27.987
40.640 27.568
40.789 27.256
40.553 26.597
40.325 26.010
40.156 25.416
40.156 25.416
au
-33.194 78.086
-33.838 77.352
-34.324 77.917
-34.807 78.488
-34.842 78.442
-35.161 78.803
-35.683 78.201
-36.098 78.690
-36.511 79.184
-36.998 78.606
-37.483 78.021
-38.001 78.706
-38.393 78.181
-38.659 78.529
-39.005 78.073
-39.262 78.384
-39.538 78.002
-39.905 78.425
-40.326 77.825
-40.866 78.484
-40.872 78.659
-41.384 79.319
-41.892 79.990
-41.512 80.463
-41.130 80.931
-41.722 81.752
-42.309 82.588
-42.890 83.439
-42.551 83.853
-42.210 84.263
-41.868 84.669
-41.525 85.070
-41.180 85.466
-40.834 85.859
-41.129 86.402
-41.421 86.950
-41.711 87.502
-41.997 88.060
-41.686 88.488
-41.944 89.011
-42.200 89.537
-42.454 90.068
-42.705 90.603
-42.953 91.142
-43.199 91.686
-43.443 92.234
-43.684 92.786
-43.922 93.343
-44.157 93.904
-44.390 94.470
-44.620 95.040
-44.805 94.926
-45.141 95.806
-45.471 96.698
-45.996 96.274
-46.520 95.842
-46.772 96.458
-47.020 97.080
-47.265 97.707
-47.506 98.340
-47.744 98.979
-47.978 99.624
-47.267 100.202
-47.465 100.817
-47.661 101.436
-47.853 102.060
-48.042 102.688
-48.227 103.321
-48.409 103.959
-48.588 104.601
-48.762 105.247
-48.934 105.898
-49.101 106.554
-48.841 106.692
-49.015 107.486
-49.182 108.285
-49.259 108.240
-49.523 109.351
-49.523 109.351
-49.779 110.472
-49.829 110.868
-49.800 111.129
-49.930 111.363
-50.084 111.666
-50.200 112.967
-50.388 114.024
-49.878 114.362
-49.974 115.500
-49.852 115.988
-49.540 116.256
-49.271 116.635
-49.620 117.523
-49.865 118.194
-49.802 118.547
-49.938 119.366
-50.036 120.273
-49.524 120.516
-48.890 120.842
-49.006 121.555
-49.620 121.437
-49.736 121.866
-49.846 122.224
-49.812 122.553
-49.729 122.797
-49.542 123.013
-49.585 123.328
-49.122 123.771
-48.906 124.007
-48.848 124.213
-48.983 124.607
-49.153 124.992
-49.358 125.125
-49.598 125.262
-49.717 125.896
-49.401 126.074
-49.044 126.264
-48.630 126.434
-48.698 126.861
-48.764 127.313
-49.294 127.243
-49.643 127.196
-49.976 127.143
-50.159 128.312
-50.348 129.412
-50.525 130.569
-50.604 131.256
-50.222 131.515
-50.223 132.261
-50.306 133.465
-50.347 134.245
-50.384 135.026
-50.209 135.246
-50.248 136.226
-50.220 136.946
-50.234 137.700
-50.231 138.401
-50.256 139.110
-50.279 139.645
-51.174 139.733
-51.838 139.813
-51.798 140.323
-52.274 140.400
-52.750 140.478
-53.504 140.584
-53.885 140.659
-54.053 141.451
-54.215 142.250
-54.234 143.778
-54.798 144.282
-54.755 145.401
-54.695 146.881
-54.695 146.881
-55.175 147.043
-55.654 147.206
-56.132 147.373
-56.610 147.545
-57.088 147.721
-57.566 147.902
-57.527 148.076
-57.436 148.806
-56.939 150.622
-56.415 152.392
-55.867 154.115
-55.295 155.788
-54.702 157.411
-54.088 158.985
-53.812 159.142
-53.620 159.216
-53.598 159.318
-53.345 159.512
-53.170 159.731
-52.991 159.905
-52.822 160.092
-52.634 160.342
-52.433 160.535
-52.292 160.671
-52.166 160.762
-51.924 161.026
-51.751 161.162
-51.542 161.368
-51.399 161.542
-51.192 161.716
-51.118 161.825
-50.962 162.049
-50.817 162.273
-50.668 162.453
-50.550 162.594
-50.443 162.785
-50.369 162.963
-50.273 163.047
-50.079 163.235
-50.079 163.235
-49.985 163.296
-49.847 163.412
-49.761 163.448
-49.573 163.545
-49.322 163.740
-49.116 163.868
-48.917 163.964
-48.742 164.130
-48.592 164.215
-48.429 164.287
-48.274 164.309
-48.202 164.389
-48.059 164.398
-47.920 164.483
-47.760 164.480
-47.658 164.528
-47.521 164.651
-47.444 164.699
-47.256 164.739
-47.148 164.838
-47.011 164.923
-46.783 164.943
-46.601 165.021
-46.405 165.168
-46.190 165.427
-46.065 165.733
-45.958 165.920
-45.887 166.019
-45.736 166.205
-45.515 166.377
-45.350 166.537
-45.211 166.710
-44.987 166.951
-44.987 166.951
-44.826 167.100
-44.648 167.368
-44.466 167.688
-44.330 168.081
-44.166 168.488
-44.022 168.770
-44.022 168.770
-43.845 169.136
-43.594 169.647
-43.358 170.103
-43.088 170.638
-42.932 170.995
-42.743 171.277
-42.675 171.473
-42.616 171.859
-42.483 172.593
-42.392 173.126
-42.291 173.724
-42.201 174.304
-42.122 174.988
-42.059 175.503
-42.059 175.503
-41.757 174.945
-41.566 174.763
-41.157 174.632
-40.979 175.012
-40.791 175.324
-40.598 175.537
-40.311 175.868
-40.046 176.074
-39.230 175.609
-38.762 175.932
-38.674 175.995
-38.287 176.241
-37.885 176.509
-37.485 176.770
-37.102 177.049
-36.461 177.507
-35.917 177.890
-35.161 178.403
-34.786 178.681
-34.246 178.996
-33.602 179.345
-33.019 179.657
-32.347 179.980
-31.751 -179.740
-31.333 -179.515
-30.997 -179.393
-30.355 -179.226
-29.792 -179.074
-29.498 -178.966
-28.693 -178.713
-27.985 -178.482
-27.377 -178.248
-26.767 -178.017
-25.976 -177.793
-25.197 -177.657
-24.720 -177.552
-24.242 -177.448
-24.105 -177.419
-24.105 -177.419
-23.708 -177.250
-23.414 -177.102
-23.048 -176.913
-22.735 -176.748
-22.500 -176.709
-22.286 -176.691
-22.231 -176.635
-22.007 -176.601
-21.811 -176.520
-21.601 -176.449
-21.487 -176.405
-21.301 -176.372
-21.113 -176.322
-21.000 -176.289
-20.891 -176.264
-20.796 -176.237
-20.655 -176.190
-20.494 -176.176
-20.423 -176.159
-20.265 -176.152
-20.129 -176.116
-20.106 -176.182
-19.884 -176.122
-19.814 -176.079
-19.651 -176.027
-19.387 -175.979
-19.387 -175.979
-19.217 -176.549
-18.975 -176.570
-18.836 -176.587
-18.768 -176.584
-18.686 -176.551
-18.600 -176.511
-18.472 -176.440
-18.307 -176.346
-18.267 -176.330
-18.131 -176.297
-18.055 -176.304
-17.873 -176.403
-17.731 -176.462
-17.574 -176.532
-17.399 -176.625
-17.219 -176.713
-17.034 -176.820
-16.877 -176.921
-16.725 -177.068
-16.575 -177.201
-16.437 -177.364
-16.320 -177.513
-16.177 -177.678
-16.107 -177.664
-16.024 -177.634
-15.961 -177.575
-15.899 -177.493
-15.807 -177.384
-15.710 -177.248
-15.559 -177.130
-15.559 -177.130
-15.398 -177.691
-15.325 -178.264
-15.377 -178.812
-15.527 -179.444
-15.527 -179.444
-15.542 -179.739
-15.542 -179.739
-15.654 179.890
-15.678 179.614
-15.729 179.332
-15.812 178.936
-15.897 178.562
-15.897 178.562
-15.984 178.524
-16.092 178.491
-16.104 178.402
-16.110 178.283
-16.115 178.171
-16.148 178.086
-16.172 178.007
-16.222 177.876
-16.227 177.806
-16.229 177.721
-16.224 177.588
-16.212 177.400
-16.302 177.345
-16.300 177.414
-16.510 177.412
-16.506 177.269
-16.504 177.190
-16.505 177.130
-16.516 177.035
-16.523 176.949
-16.544 176.883
-16.545 176.790
-16.553 176.671
-16.557 176.545
-16.569 176.377
-16.552 176.184
-16.552 176.184
-16.670 176.179
-16.816 176.148
-16.965 176.106
-17.090 176.065
-17.239 176.036
-17.541 175.986
-17.804 175.973
-17.823 176.336
-18.038 176.342
-18.140 176.300
-18.242 176.244
-18.319 176.215
-18.611 176.212
-18.732 176.136
-18.895 176.061
-19.022 175.975
-19.080 175.922
-19.162 175.900
-19.327 175.885
-19.445 175.839
-19.547 175.772
-19.755 175.559
-19.977 175.574
-20.189 175.590
-20.189 175.590
-20.629 175.828
-21.166 176.121
-21.422 175.733
-21.750 175.231
-22.170 174.584
-22.488 174.034
-22.488 174.034
-22.835 173.606
-22.834 173.212
-23.007 173.040
-23.069 172.783
-23.178 172.439
-23.178 172.439
-23.177 172.361
-23.171 172.278
-23.176 172.197
-23.173 172.060
-23.155 171.950
-23.149 171.854
-23.146 171.703
-23.127 171.620
-23.110 171.496
-23.091 171.385
-23.072 171.288
-23.030 171.162
-23.000 171.037
-22.968 170.939
-22.949 170.842
-22.917 170.745
-22.884 170.660
-22.827 170.547
-22.759 170.420
-22.702 170.321
-22.644 170.221
-22.587 170.109
-22.516 170.036
-22.445 169.950
-22.350 169.835
-22.230 169.719
-22.124 169.577
-22.052 169.491
-21.980 169.419
-21.909 169.320
-21.823 169.288
-21.725 169.215
-21.640 169.143
-21.506 169.054
-21.420 168.996
-21.261 168.879
-21.102 168.776
-21.016 168.705
-20.893 168.645
-20.782 168.585
-20.646 168.512
-20.474 168.396
-20.325 168.335
-20.201 168.263
-20.090 168.191
-20.003 168.160
-19.893 168.075
-19.769 168.003
-19.632 167.943
-19.533 167.886
-19.372 167.812
-19.236 167.727
-19.048 167.680
-18.886 167.607
-18.712 167.521
-18.611 167.504
-18.485 167.486
-18.360 167.455
-18.247 167.424
-18.147 167.394
-18.022 167.350
-17.922 167.320
-17.759 167.275
-17.634 167.245
-17.521 167.215
-17.395 167.171
-17.307 167.155
-17.209 167.059
-17.098 166.950
-16.987 166.868
-16.836 166.810
-16.737 166.728
-16.625 166.659
-16.538 166.604
-16.438 166.562
-16.300 166.506
-16.187 166.450
-16.087 166.395
-15.975 166.340
-15.887 166.285
-15.799 166.270
-15.674 166.227
-15.560 166.225
-15.434 166.209
-15.345 166.193
-15.244 166.217
-15.130 166.228
-15.041 166.213
-14.889 166.262
-14.686 166.271
-14.559 166.268
-14.421 166.252
-14.345 166.250
-14.181 166.234
-13.991 166.204
-13.828 166.161
-13.779 166.154
-13.779 166.154
-13.676 166.132
-13.513 166.090
-13.261 166.020
-13.072 165.952
-12.870 165.909
-12.744 165.894
-12.517 165.838
-12.316 165.770
-12.127 165.715
-11.887 165.621
-11.686 165.514
-11.549 165.396
-11.411 165.252
-11.287 165.070
-11.200 164.901
-11.164 164.758
-11.114 164.641
-11.090 164.512
-11.091 164.409
-11.118 164.267
-11.144 164.151
-11.158 163.996
-11.185 163.854
-11.199 163.699
-11.238 163.505
-11.265 163.311
-11.291 163.195
-11.311 163.053
-11.356 162.833
-11.382 162.626
-11.421 162.484
-11.421 162.354
-11.422 162.225
-11.434 162.109
-11.422 162.018
-11.397 161.901
-11.359 161.798
-11.321 161.720
-11.283 161.552
-11.245 161.461
-11.232 161.384
-11.194 161.306
-11.168 161.202
-11.130 161.125
-11.054 161.060
-11.029 160.996
-10.965 160.931
-10.914 160.867
-10.838 160.776
-10.787 160.725
-10.723 160.622
-10.672 160.544
-10.634 160.493
-10.570 160.364
-10.519 160.287
-10.468 160.210
-10.417 160.132
-10.379 160.068
-10.315 159.978
-10.277 159.914
-10.251 159.837
-10.200 159.772
-10.174 159.708
-10.123 159.644
-10.084 159.580
-10.021 159.503
-9.969 159.439
-9.931 159.362
-9.880 159.285
-9.829 159.221
-9.765 159.170
-9.726 159.119
-9.688 159.068
-9.650 159.003
-9.624 158.926
-9.585 158.850
-9.559 158.773
-9.546 158.709
-9.507 158.580
-9.481 158.478
-9.442 158.388
-9.390 158.273
-9.313 158.145
-9.249 158.056
-9.210 157.992
-9.159 157.916
-9.107 157.827
-9.068 157.724
-9.004 157.648
-8.965 157.572
-8.900 157.419
-8.823 157.317
-8.784 157.241
-8.746 157.177
-8.706 157.049
-8.642 156.935
-8.615 156.858
-8.602 156.782
-8.563 156.706
-8.382 156.467
-8.174 156.296
-8.174 156.296
-8.385 156.331
-8.598 156.361
-8.809 156.390
-9.179 156.428
-9.206 156.350
-9.225 156.258
-9.268 156.101
-9.381 156.124
-9.405 156.066
-9.538 156.086
-9.558 155.989
-9.548 155.979
-9.555 155.908
-9.572 155.813
-9.526 155.797
-9.548 155.708
-9.581 155.599
-9.531 155.577
-9.568 155.473
-9.493 155.436
-9.532 155.347
-9.556 155.291
-9.621 155.172
-9.730 155.172
-9.795 155.070
-9.835 154.951
-9.839 154.856
-9.723 154.849
-9.763 154.719
-9.811 154.596
-9.872 154.379
-9.913 154.218
-10.279 154.219
-10.323 154.169
-10.331 154.125
-10.341 154.010
-10.325 153.847
-10.345 153.752
-10.355 153.552
-10.398 153.362
-10.398 153.174
-10.384 152.855
-10.088 152.849
-10.078 152.651
-10.056 152.547
-10.047 152.413
-10.039 152.223
-9.945 152.214
-9.944 152.086
-9.942 152.024
-9.930 151.918
-9.906 151.838
-9.761 151.834
-9.760 151.654
-9.760 151.654
-9.676 151.545
-9.681 151.005
-9.687 150.466
-9.945 150.245
-9.801 149.676
-9.353 149.133
-9.570 148.751
-9.212 148.207
-8.886 147.539
-8.598 146.954
-8.598 146.954
-8.410 146.918
-8.103 146.398
-7.661 145.666
-7.374 145.249
-7.023 144.740
-6.813 144.136
-6.558 143.569
-6.295 142.956
-5.986 142.231
-5.727 141.483
-5.145 140.847
-5.110 140.798
-5.110 140.798
-4.931 140.264
-4.751 139.731
-4.548 138.959
-4.442 138.484
-4.337 138.010
-4.221 137.177
-4.199 136.672
-4.177 136.167
-4.218 135.459
-4.298 134.966
-4.298 134.966
-4.437 134.488
-4.812 133.906
-4.812 133.906
-5.344 133.449
-5.641 133.982
-6.348 133.686
-6.515 133.188
-6.681 132.689
-6.681 132.689
-6.989 132.431
-7.661 131.867
-8.267 131.415
-8.267 131.415
-8.562 130.933
-8.726 130.540
-8.926 129.861
-9.020 129.106
-9.095 128.376
-9.133 127.900
-9.221 127.430
-9.390 126.853
-9.596 126.333
-9.784 125.869
-9.984 125.482
-10.159 125.159
-10.390 124.734
-10.708 123.960
-10.995 123.217
-11.188 122.627
-11.412 121.783
-11.493 121.110
-11.492 120.886
-11.492 120.886
-11.524 120.451
-11.462 119.841
-11.393 119.270
-11.362 118.750
-11.387 118.236
-11.337 117.576
-11.331 116.853
-11.275 116.174
-11.219 115.571
-11.150 115.013
-11.088 114.410
-10.964 113.756
-10.870 113.204
-10.758 112.563
-10.652 112.170
-10.577 111.523
-10.477 111.015
-10.477 110.615
-10.440 110.159
-10.371 109.626
-10.328 109.067
-10.178 108.363
-10.053 107.836
-9.890 107.379
-9.665 106.827
-9.371 106.345
-9.240 106.123
-8.926 105.590
-8.569 104.981
-8.167 104.576
-8.167 104.576
-7.863 103.763
-7.621 103.183
-7.197 102.452
-7.955 101.862
-8.719 101.263
-9.490 100.657
-10.266 100.042
-11.048 99.419
-11.834 98.789
-12.624 98.150
-13.418 97.503
-14.215 96.847
-15.014 96.184
-15.815 95.513
-16.617 94.834
-17.419 94.146
-18.221 93.451
-19.022 92.748
-19.822 92.038
-20.619 91.319
-21.413 90.593
-22.204 89.860
-22.990 89.119
-23.771 88.372
-24.546 87.617
-25.315 86.855
-26.077 86.087
-26.832 85.312
-27.578 84.531
-28.316 83.744
-29.044 82.951
-29.763 82.153
-30.472 81.349
-31.169 80.540
-31.856 79.726
-32.531 78.908
-33.194 78.086
BH
1.059 129.197
1.623 128.752
1.974 128.187
2.290 128.081
2.319 127.446
2.346 126.872
2.346 126.872
1.706 126.426
1.706 126.426
1.001 126.144
0.190 125.969
-0.278 125.969
-0.278 125.969
-0.648 126.393
-1.018 126.817
-1.388 127.241
-1.758 127.666
-1.758 127.666
-2.286 128.383
-2.286 128.383
-2.416 129.258
-2.519 130.107
-2.694 130.585
-2.868 131.063
-3.149 131.489
-3.429 131.915
-3.935 132.316
-4.440 132.717
-4.440 132.717
-4.626 133.311
-4.812 133.906
-4.812 133.906
-4.437 134.488
-4.298 134.966
-4.298 134.966
-3.849 135.262
-3.403 135.771
-3.100 136.167
-2.796 136.562
-2.493 136.931
-2.295 137.282
-2.080 137.634
-1.900 138.003
-1.754 138.488
-1.607 138.972
-1.607 138.972
-1.159 138.793
-1.159 138.793
-0.820 138.674
-0.718 138.054
-0.616 137.435
-0.422 136.943
-0.228 136.451
-0.023 135.656
0.421 134.938
0.259 134.471
0.057 133.899
-0.146 133.327
-0.043 132.824
0.017 132.515
0.017 132.515
0.034 132.373
0.150 131.738
0.266 131.102
0.475 130.546
0.684 129.989
1.059 129.197
1.059 129.197
BR
-13.411 172.571
-13.693 172.740
-13.965 172.881
-14.294 173.019
-14.510 173.139
-14.669 173.178
-14.770 173.210
-14.897 173.259
-14.992 173.294
-15.081 173.320
-15.154 173.346
-15.234 173.359
-15.361 173.388
-15.437 173.428
-15.504 173.464
-15.567 173.516
-15.605 173.539
-15.697 173.555
-15.779 173.400
-15.922 173.485
-16.027 173.531
-16.151 173.567
-16.259 173.455
-16.497 173.593
-16.614 173.669
-16.713 173.718
-16.798 173.788
-16.849 173.901
-16.849 173.901
-16.563 174.503
-16.873 174.885
-16.748 175.107
-16.741 175.226
-16.629 175.381
-16.622 175.487
-16.586 175.612
-16.558 175.893
-16.552 176.184
-16.552 176.184
-16.569 176.377
-16.557 176.545
-16.553 176.671
-16.545 176.790
-16.544 176.883
-16.523 176.949
-16.516 177.035
-16.505 177.130
-16.504 177.190
-16.506 177.269
-16.510 177.412
-16.300 177.414
-16.302 177.345
-16.212 177.400
-16.224 177.588
-16.229 177.721
-16.227 177.806
-16.222 177.876
-16.172 178.007
-16.148 178.086
-16.115 178.171
-16.110 178.283
-16.104 178.402
-16.092 178.491
-15.984 178.524
-15.897 178.562
-15.897 178.562
-15.812 178.936
-15.729 179.332
-15.678 179.614
-15.654 179.890
-15.542 -179.739
-15.542 -179.739
-15.218 179.790
-14.975 179.389
-14.784 179.012
-14.501 178.469
-14.309 178.029
-14.055 177.417
-14.055 177.417
-13.948 177.167
-13.853 176.966
-13.731 176.618
-13.672 176.256
-13.643 176.021
-13.422 175.947
-13.326 175.659
-13.244 175.314
-13.335 174.898
-13.395 174.784
-13.415 174.661
-13.396 174.482
-13.295 173.941
-13.517 173.671
-13.489 173.049
-13.411 172.571
-13.411 172.571
BS
-3.719 127.325
-4.188 126.963
-4.471 126.432
-4.754 125.901
-4.789 125.282
-4.824 124.662
-4.701 124.060
-4.576 123.458
-3.941 123.706
-3.094 123.672
-2.846 123.424
-2.598 122.823
-2.350 122.223
-2.154 121.728
-1.959 121.234
-1.710 120.811
-1.461 120.388
-0.859 119.896
-0.081 119.475
-0.081 119.475
-0.680 119.296
-1.491 119.045
-1.950 118.884
-2.408 118.723
-3.255 118.578
-3.610 118.823
-3.610 118.823
-3.966 119.565
-4.303 119.953
-4.640 120.341
-5.276 120.516
-6.122 120.620
-6.968 120.546
-7.812 120.543
-7.812 120.543
-7.990 121.253
-8.062 121.891
-7.853 122.673
-7.784 123.383
-7.784 124.235
-7.644 124.750
-7.503 125.264
-7.433 125.761
-7.309 126.258
-7.185 126.755
-7.184 127.393
-6.990 127.854
-6.795 128.315
-6.565 128.776
-6.334 129.236
-6.526 129.839
-6.717 130.443
-6.680 131.010
-6.642 131.577
-6.662 132.133
-6.681 132.689
-6.681 132.689
-6.515 133.188
-6.348 133.686
-5.641 133.982
-5.344 133.449
-4.812 133.906
-4.812 133.906
-4.626 133.311
-4.440 132.717
-4.440 132.717
-3.935 132.316
-3.429 131.915
-3.149 131.489
-2.868 131.063
-2.694 130.585
-2.519 130.107
-2.416 129.258
-2.286 128.383
-2.286 128.383
-1.758 127.666
-1.758 127.666
-2.447 127.667
-3.163 127.510
-3.719 127.325
-3.719 127.325
BU
14.400 96.480
14.909 96.454
15.136 96.406
15.136 96.406
15.534 95.912
15.813 95.095
15.770 94.209
15.562 93.788
15.353 93.368
14.869 92.941
14.384 92.517
13.715 92.068
13.715 92.068
13.154 91.889
12.283 91.700
11.791 91.643
11.300 91.591
10.514 91.576
10.056 91.559
9.604 91.533
9.130 91.596
8.656 91.651
8.160 91.781
7.663 91.903
6.948 92.278
6.948 92.278
6.333 92.376
5.702 92.537
5.005 92.665
4.384 92.903
3.716 93.227
3.048 93.754
2.457 94.405
2.104 94.979
2.104 94.979
1.882 95.542
1.487 96.089
1.345 96.202
1.345 96.202
1.763 96.743
2.185 96.783
2.979 96.697
3.772 96.601
4.644 96.567
5.114 96.013
5.715 95.435
6.259 94.950
6.837 94.498
7.139 94.883
7.603 94.460
7.847 94.775
8.312 94.429
8.686 94.171
9.019 93.986
9.270 94.415
9.717 94.216
10.170 94.024
10.679 94.415
11.188 94.807
12.053 95.155
12.918 95.505
13.783 95.857
14.129 96.503
14.400 96.480
14.400 96.480
ca
18.959 -61.553
19.275 -62.176
19.574 -62.847
19.692 -63.360
19.724 -63.760
19.779 -64.344
19.833 -65.129
19.829 -65.694
19.825 -66.259
19.754 -67.040
19.721 -67.531
19.687 -68.022
19.589 -68.853
19.696 -69.415
19.802 -69.978
20.002 -70.626
20.201 -71.277
20.267 -71.804
20.331 -72.332
20.291 -73.239
20.166 -73.994
20.037 -74.749
19.990 -75.239
19.942 -75.729
19.845 -76.356
19.747 -76.983
19.623 -77.673
19.497 -78.361
19.381 -79.011
19.264 -79.660
19.160 -80.210
19.054 -80.758
18.960 -81.256
18.865 -81.754
18.333 -81.689
17.802 -81.625
17.691 -82.244
17.626 -82.865
17.481 -83.706
17.344 -84.248
17.107 -84.910
16.911 -85.671
16.695 -86.320
16.476 -86.966
16.251 -87.723
15.958 -88.351
15.622 -88.876
15.215 -89.372
14.815 -89.718
14.392 -90.037
13.917 -90.426
13.394 -90.810
12.584 -90.898
12.584 -90.898
12.543 -90.293
12.295 -89.619
11.999 -88.920
11.697 -88.319
11.397 -87.890
11.096 -87.462
10.547 -86.975
10.235 -86.648
10.235 -86.648
10.388 -86.248
10.489 -85.969
10.567 -85.716
10.627 -85.435
10.653 -85.124
10.593 -84.746
10.537 -84.424
10.448 -84.073
10.321 -83.782
10.209 -83.465
10.053 -83.209
9.873 -83.021
9.770 -82.802
9.599 -82.525
9.509 -82.313
9.440 -82.080
9.444 -81.654
9.587 -81.469
9.778 -81.306
9.935 -81.079
10.058 -80.879
10.058 -80.879
10.154 -80.636
10.271 -80.365
10.305 -80.105
10.389 -79.748
10.431 -79.432
10.415 -79.234
10.479 -79.151
10.579 -78.970
10.653 -78.746
10.639 -78.427
10.615 -78.229
10.547 -78.129
10.432 -77.922
10.270 -77.679
10.098 -77.499
9.900 -77.291
9.631 -77.083
9.376 -76.924
9.065 -76.765
8.731 -76.684
8.731 -76.684
9.017 -76.701
9.379 -76.706
9.761 -76.703
10.090 -76.594
10.329 -76.456
10.574 -76.275
10.765 -76.064
11.087 -75.905
11.390 -75.631
11.595 -75.370
11.764 -75.123
11.914 -74.796
12.021 -74.476
12.224 -74.307
12.386 -74.058
12.743 -73.874
13.058 -73.632
13.290 -73.303
13.367 -72.916
13.410 -72.428
13.465 -71.840
13.503 -71.195
13.438 -70.953
13.310 -70.659
13.310 -70.659
13.162 -70.496
12.930 -70.183
12.668 -69.863
12.450 -69.594
12.175 -69.348
11.844 -69.024
11.513 -68.730
11.174 -68.379
10.815 -68.087
10.499 -67.961
10.499 -67.961
10.592 -67.499
10.667 -66.870
10.662 -66.437
10.653 -65.964
10.615 -65.526
10.600 -65.121
10.539 -64.997
10.474 -64.508
10.519 -64.210
10.532 -63.878
10.532 -63.878
10.509 -63.233
10.482 -62.641
10.459 -62.158
10.427 -61.542
10.395 -60.927
10.345 -60.457
10.295 -59.988
10.220 -59.121
10.190 -58.639
10.160 -58.157
10.160 -58.157
10.634 -57.762
11.144 -57.533
11.661 -57.424
12.427 -57.468
13.102 -57.568
13.874 -57.711
14.499 -57.791
14.864 -57.913
15.150 -58.288
15.284 -58.526
15.412 -58.666
15.770 -58.692
15.991 -58.801
16.397 -58.824
16.912 -59.088
17.243 -59.465
17.548 -59.819
17.823 -60.051
18.191 -60.278
18.513 -60.534
18.595 -60.729
18.889 -60.912
18.959 -61.553
18.959 -61.553
CL
9.379 138.359
9.196 138.309
8.534 137.982
7.871 137.529
7.620 137.144
7.368 136.759
6.989 136.183
6.895 135.415
6.990 134.521
6.990 134.521
6.610 134.269
6.333 133.989
6.156 133.674
5.962 133.429
5.734 133.308
5.349 133.240
5.016 133.189
4.788 133.032
4.454 132.911
4.120 132.790
3.698 132.740
3.312 132.795
2.908 132.850
2.539 132.817
2.257 132.766
1.728 132.734
1.165 132.720
0.812 132.651
0.017 132.515
0.017 132.515
-0.043 132.824
-0.146 133.327
0.057 133.899
0.259 134.471
0.421 134.938
-0.023 135.656
-0.228 136.451
-0.422 136.943
-0.616 137.435
-0.718 138.054
-0.820 138.674
-1.159 138.793
-1.159 138.793
-1.390 139.257
-1.557 139.805
-1.767 140.226
-1.893 140.837
-2.167 141.195
-2.272 141.594
-2.398 141.868
-2.693 142.246
-2.693 142.246
-2.462 142.394
-1.916 142.626
-1.454 142.922
-1.160 143.260
-0.951 143.808
-0.742 144.357
-0.534 145.033
-0.473 145.497
-0.349 145.919
-0.290 146.595
-0.294 147.059
-0.275 147.354
-0.426 147.859
-0.409 148.344
-0.392 148.724
-0.457 148.913
-0.650 149.270
-0.650 149.270
-0.397 149.251
-0.143 149.191
0.406 149.112
0.937 148.863
1.487 148.700
2.058 148.684
2.629 148.668
3.137 148.694
3.776 148.191
4.393 147.772
4.765 147.425
5.138 147.078
5.511 146.730
5.883 146.382
6.160 146.001
6.353 145.471
6.503 145.067
6.611 144.664
6.677 144.026
6.805 143.558
7.166 143.070
7.388 142.666
7.611 142.262
8.118 141.517
8.393 141.048
8.666 140.579
8.866 139.886
9.065 139.192
9.379 138.359
9.379 138.359
co
10.235 -86.648
10.547 -86.975
11.096 -87.462
11.397 -87.890
11.697 -88.319
11.999 -88.920
12.295 -89.619
12.543 -90.293
12.584 -90.898
12.584 -90.898
12.832 -91.308
13.080 -91.719
13.271 -92.063
13.223 -92.272
13.498 -92.599
13.722 -92.962
13.793 -93.309
14.016 -93.656
14.222 -94.055
14.479 -94.542
14.700 -94.873
14.887 -95.117
15.090 -95.466
15.277 -95.799
15.361 -96.219
15.360 -96.727
15.358 -97.217
15.508 -97.691
15.640 -98.166
15.771 -98.588
15.919 -99.028
16.134 -99.435
16.298 -99.806
16.442 -100.336
16.636 -100.867
17.026 -101.703
17.280 -102.432
17.616 -103.200
17.920 -103.792
18.138 -104.191
18.209 -104.406
18.368 -104.725
18.622 -105.043
18.762 -105.247
18.762 -105.247
18.551 -105.352
18.355 -105.442
18.140 -105.510
17.881 -105.586
17.881 -105.586
17.768 -105.399
17.031 -105.367
16.261 -105.398
15.558 -105.357
15.108 -105.320
15.274 -104.690
14.672 -104.563
14.070 -104.437
13.328 -104.181
12.587 -103.927
11.890 -103.772
11.872 -103.875
11.405 -103.807
10.937 -103.739
10.275 -103.628
10.123 -103.598
10.017 -104.296
9.175 -104.296
8.456 -104.258
8.340 -104.229
8.370 -103.595
8.400 -102.961
7.791 -102.810
7.182 -102.659
6.355 -102.558
5.529 -102.457
4.653 -102.320
3.778 -102.184
3.751 -102.259
3.458 -102.199
3.239 -102.219
3.239 -102.219
3.072 -102.193
2.889 -102.145
2.893 -102.118
2.798 -102.096
2.786 -102.109
2.635 -102.068
2.635 -102.068
2.642 -101.878
2.640 -101.697
2.605 -101.490
2.232 -101.512
2.232 -101.512
2.241 -101.203
2.199 -101.196
2.210 -101.067
2.204 -100.644
2.207 -100.394
2.207 -100.066
2.300 -100.047
2.272 -99.913
2.273 -99.811
2.269 -99.739
2.269 -99.739
2.190 -99.657
2.112 -98.918
2.213 -98.889
2.145 -98.367
2.077 -97.846
2.088 -97.551
1.898 -97.585
1.886 -96.880
1.873 -96.175
2.238 -96.120
2.222 -95.224
2.507 -95.198
2.440 -94.404
2.372 -93.611
2.300 -92.928
2.227 -92.245
2.200 -92.090
1.990 -92.118
2.011 -91.538
1.817 -91.561
1.736 -90.697
1.120 -90.663
1.073 -89.784
1.025 -88.904
0.977 -88.025
0.929 -87.145
0.880 -86.266
0.832 -85.386
1.644 -85.349
1.598 -84.576
2.066 -84.571
2.534 -84.567
3.112 -84.467
3.139 -83.922
3.165 -83.378
3.118 -82.806
3.595 -82.875
4.072 -82.875
4.563 -82.875
5.054 -82.875
5.833 -82.875
6.562 -82.875
7.118 -82.875
7.366 -82.875
7.366 -82.875
7.592 -83.074
7.849 -83.233
7.928 -83.360
8.044 -83.605
8.182 -83.838
8.300 -84.007
8.474 -84.158
8.637 -84.419
8.772 -84.686
8.937 -85.044
9.089 -85.380
9.203 -85.612
9.423 -85.910
9.684 -86.204
9.938 -86.449
10.235 -86.648
10.235 -86.648
CR
-16.849 173.901
-17.163 173.880
-17.490 173.744
-17.680 173.660
-17.962 173.550
-18.238 173.409
-18.532 173.251
-18.520 173.425
-18.774 173.447
-18.999 173.453
-19.221 173.439
-19.430 173.429
-19.662 173.398
-19.890 173.360
-20.086 173.335
-20.377 173.351
-20.625 173.384
-20.837 173.380
-20.995 173.383
-21.140 173.379
-21.148 174.119
-21.357 174.115
-21.578 174.112
-21.841 174.090
-22.236 174.056
-22.488 174.034
-22.488 174.034
-22.170 174.584
-21.750 175.231
-21.422 175.733
-21.166 176.121
-20.629 175.828
-20.189 175.590
-20.189 175.590
-19.977 175.574
-19.755 175.559
-19.547 175.772
-19.445 175.839
-19.327 175.885
-19.162 175.900
-19.080 175.922
-19.022 175.975
-18.895 176.061
-18.732 176.136
-18.611 176.212
-18.319 176.215
-18.242 176.244
-18.140 176.300
-18.038 176.342
-17.823 176.336
-17.804 175.973
-17.541 175.986
-17.239 176.036
-17.090 176.065
-16.965 176.106
-16.816 176.148
-16.670 176.179
-16.552 176.184
-16.552 176.184
-16.558 175.893
-16.586 175.612
-16.622 175.487
-16.629 175.381
-16.741 175.226
-16.748 175.107
-16.873 174.885
-16.563 174.503
-16.849 173.901
-16.849 173.901
EA
-22.114 -114.421
-22.196 -114.505
-22.543 -114.498
-23.024 -114.567
-23.040 -114.875
-23.179 -114.962
-23.237 -115.183
-23.398 -115.254
-23.468 -115.599
-23.884 -115.424
-24.017 -115.402
-24.105 -115.482
-24.242 -115.912
-24.383 -115.968
-24.458 -116.184
-24.556 -116.225
-24.848 -116.099
-25.172 -116.490
-25.416 -116.353
-25.674 -116.028
-25.968 -115.769
-26.243 -115.518
-26.466 -115.291
-26.604 -115.105
-26.725 -114.526
-26.790 -113.944
-26.809 -113.608
-26.830 -112.976
-26.830 -112.976
-26.724 -112.947
-26.801 -112.684
-26.554 -112.658
-26.282 -112.683
-26.038 -112.672
-25.934 -112.620
-25.926 -112.550
-25.787 -112.541
-25.786 -112.455
-25.683 -112.437
-25.664 -112.364
-25.564 -112.366
-25.429 -112.388
-25.198 -112.443
-25.059 -112.453
-25.027 -111.978
-24.891 -111.977
-24.659 -112.048
-24.448 -112.103
-24.222 -112.123
-24.110 -112.098
-24.032 -111.713
-23.860 -111.763
-23.727 -111.832
-23.475 -111.864
-23.327 -111.871
-23.209 -111.741
-23.016 -111.924
-22.821 -112.208
-22.619 -112.575
-22.407 -112.934
-22.223 -113.280
-22.126 -113.610
-22.102 -113.906
-22.106 -114.125
-22.114 -114.421
-22.114 -114.421
eu
39.400 -29.770
39.315 -29.335
39.255 -29.297
39.250 -29.260
39.279 -29.188
39.294 -29.147
39.323 -29.090
39.338 -29.049
39.366 -28.982
39.379 -28.951
39.412 -28.895
39.373 -28.853
39.299 -28.781
39.263 -28.745
39.214 -28.686
39.179 -28.666
39.121 -28.619
39.130 -28.567
39.156 -28.484
39.134 -28.452
39.093 -28.420
39.058 -28.395
39.020 -28.365
38.993 -28.342
38.939 -28.292
38.952 -28.215
38.968 -28.120
38.983 -28.059
39.004 -27.955
39.000 -27.793
38.942 -27.722
38.914 -27.680
38.864 -27.606
38.836 -27.559
38.782 -27.484
38.780 -27.239
38.700 -27.203
38.666 -27.174
38.607 -27.129
38.571 -27.090
38.491 -27.029
38.464 -27.007
38.400 -26.941
38.360 -26.901
38.278 -26.830
38.420 -26.718
38.358 -26.647
38.324 -26.614
38.255 -26.532
38.222 -26.494
38.149 -26.417
38.116 -26.379
38.047 -26.302
38.036 -26.171
37.965 -26.075
37.935 -26.043
37.839 -25.916
37.878 -25.808
37.816 -25.734
37.790 -25.698
37.722 -25.633
37.818 -25.538
37.752 -25.464
37.718 -25.427
37.663 -25.355
37.769 -25.267
37.646 -25.101
37.644 -24.983
37.609 -24.931
37.584 -24.892
37.552 -24.845
37.533 -24.816
37.500 -24.775
37.467 -24.733
37.411 -24.667
37.352 -24.702
37.273 -24.738
37.217 -24.750
37.127 -24.680
37.095 -24.634
37.017 -24.554
36.971 -24.500
36.910 -24.434
36.863 -24.385
36.792 -24.311
36.781 -24.255
36.788 -24.146
36.755 -24.046
36.646 -23.570
36.702 -22.893
36.754 -22.216
36.820 -21.507
36.881 -20.797
36.954 -20.240
37.025 -19.682
37.307 -18.618
37.466 -18.124
37.503 -17.584
37.435 -16.742
37.297 -15.841
37.212 -15.386
37.021 -15.143
37.210 -14.411
37.395 -13.675
36.864 -12.903
36.328 -12.142
35.851 -11.585
36.098 -10.923
36.392 -10.429
36.651 -9.977
36.430 -9.545
36.051 -8.785
35.667 -8.031
35.273 -7.193
35.063 -6.730
34.784 -6.064
34.517 -6.040
34.263 -6.000
34.019 -5.808
33.985 -5.397
34.078 -5.072
34.068 -4.706
34.199 -4.056
35.014 -3.782
35.596 -3.749
35.858 -3.296
36.018 -2.893
36.105 -2.573
35.898 -1.992
35.771 -1.516
35.776 -0.748
35.904 0.003
36.072 0.667
36.282 1.245
36.503 1.970
36.594 2.380
36.851 3.454
36.969 4.297
37.082 5.142
37.154 5.974
37.322 6.784
37.322 6.784
37.320 7.215
37.358 7.805
37.468 8.265
37.790 8.627
38.212 8.942
38.341 9.264
38.470 9.700
38.572 10.089
38.685 10.373
38.685 10.373
38.821 10.609
38.994 10.827
39.067 11.118
39.075 11.363
39.033 11.659
38.934 11.778
38.878 12.057
38.849 12.434
38.600 12.708
38.611 13.314
38.625 13.812
38.695 14.114
38.765 14.514
38.765 14.514
38.292 15.175
38.401 15.499
38.299 15.639
38.114 15.551
37.886 15.421
37.615 15.344
37.340 15.375
37.340 15.375
37.274 15.832
37.309 16.236
37.398 16.824
37.503 17.168
37.701 17.419
37.993 17.612
38.285 17.773
38.462 17.845
38.516 18.031
38.794 18.086
39.006 18.062
39.170 17.960
39.170 17.960
38.947 18.364
38.694 18.895
38.272 19.584
37.907 20.000
37.907 20.000
37.804 20.300
37.804 20.300
38.115 20.282
38.471 20.437
38.439 21.097
38.420 21.582
38.355 22.164
38.271 22.727
38.599 22.955
38.948 23.212
39.287 23.463
39.720 23.787
39.918 24.002
40.055 24.559
40.092 24.931
40.156 25.416
40.156 25.416
40.325 26.010
40.553 26.597
40.789 27.256
40.640 27.568
40.618 27.987
40.668 28.724
40.686 29.030
40.768 30.007
40.601 30.774
40.615 31.116
40.679 31.482
40.860 32.392
41.023 33.405
41.159 34.286
41.123 34.832
41.002 35.527
40.849 36.169
40.600 37.062
40.269 38.021
40.009 38.795
39.909 39.268
39.703 39.892
39.392 40.449
39.080 41.002
39.080 41.002
38.849 41.026
38.616 41.236
38.355 41.839
38.213 42.289
37.990 42.797
37.685 43.176
37.407 43.648
37.098 44.020
36.572 44.357
36.015 44.515
35.458 44.670
35.025 44.836
34.591 45.000
34.591 45.000
33.893 45.505
33.391 45.918
32.887 46.608
32.448 47.411
32.311 47.770
32.308 48.170
32.237 48.489
31.621 49.036
31.212 49.265
30.802 49.492
30.453 49.974
30.103 50.453
29.578 51.057
29.072 50.998
28.487 51.283
27.957 51.912
27.561 52.504
27.121 53.241
26.717 53.860
26.668 54.728
26.947 55.662
27.369 56.423
27.301 56.875
26.545 56.992
26.049 57.057
25.552 57.121
24.788 57.345
24.443 57.832
24.363 58.716
24.311 59.603
24.232 60.374
24.177 60.870
24.122 61.365
24.087 61.955
24.283 62.581
24.285 63.366
24.350 64.162
24.382 65.028
24.382 65.028
24.620 65.492
24.856 65.958
25.179 66.530
25.499 67.104
25.984 67.268
26.518 67.253
27.085 67.248
27.912 67.332
28.404 67.342
28.573 67.240
29.377 67.277
29.795 67.301
30.073 67.849
29.878 68.311
29.209 68.680
29.096 69.085
29.262 69.881
29.840 70.100
30.423 70.178
31.006 70.258
31.459 70.101
31.913 69.942
32.431 70.439
32.947 70.942
33.477 71.392
34.005 71.847
34.682 72.459
34.682 72.459
34.176 73.030
33.667 73.593
33.159 74.314
32.881 75.089
32.189 75.675
31.633 75.722
31.154 76.521
30.738 77.007
30.558 77.641
30.226 78.076
29.887 78.422
29.678 78.912
29.393 79.197
29.143 79.790
29.093 80.227
28.975 80.546
28.790 81.043
28.413 81.361
28.167 82.200
27.881 82.935
27.593 83.667
27.452 84.159
27.309 84.649
27.170 85.622
27.095 86.251
26.737 86.481
26.668 86.820
27.022 87.219
26.909 87.745
26.885 88.320
27.027 89.282
26.847 89.772
26.937 90.329
27.008 91.258
27.033 91.781
27.056 92.305
27.116 93.233
27.110 93.570
27.501 94.189
27.918 94.829
28.183 95.466
28.135 96.234
28.110 96.792
28.083 97.348
28.083 97.348
27.702 97.471
27.241 97.347
26.820 97.130
26.287 96.906
25.647 96.581
25.134 96.310
24.480 96.117
23.761 95.969
23.015 95.909
22.352 95.918
21.681 95.918
20.900 95.943
20.040 96.016
19.412 96.225
18.705 96.341
17.982 96.421
17.435 96.466
16.644 96.470
16.003 96.447
15.396 96.419
15.136 96.406
15.136 96.406
14.909 96.454
14.400 96.480
14.400 96.480
14.419 97.390
14.434 98.300
14.446 99.210
14.838 99.766
15.462 100.297
16.084 100.832
16.575 101.141
17.066 101.451
17.350 102.032
17.633 102.615
17.660 103.180
17.685 103.746
17.709 104.312
17.730 104.878
17.750 105.817
17.766 106.756
17.777 107.695
17.784 108.634
17.785 109.573
17.783 110.512
17.870 111.040
17.955 111.569
18.038 112.098
18.121 112.628
18.280 113.313
18.438 114.000
18.438 114.000
18.863 113.759
19.288 113.517
19.713 113.274
20.137 113.030
20.561 112.784
20.985 112.537
21.408 112.288
21.831 112.038
22.165 111.175
22.495 110.308
22.820 109.436
23.141 108.561
23.456 107.681
24.052 107.132
24.646 106.578
25.238 106.018
25.797 105.720
26.355 105.419
27.117 105.182
27.878 104.942
28.334 105.170
28.790 105.399
29.254 106.262
29.713 107.133
30.005 108.043
30.290 108.959
30.569 109.880
30.842 110.806
31.252 111.209
31.660 111.615
32.252 111.633
32.843 111.651
33.465 112.274
34.083 112.905
34.469 113.250
34.854 113.599
34.843 114.280
34.828 114.960
34.213 115.746
33.593 116.521
32.968 117.284
32.572 117.719
32.175 118.150
31.776 118.577
31.376 119.001
31.199 119.711
31.392 120.368
31.581 121.027
31.557 121.611
31.530 122.195
31.502 122.780
31.471 123.364
31.471 123.364
32.173 124.072
32.870 124.791
33.563 125.521
34.252 126.263
34.252 126.263
34.936 126.196
35.621 126.128
36.169 126.115
36.718 126.101
37.541 125.914
38.365 125.723
38.824 125.551
39.283 125.376
39.742 125.199
40.200 125.019
40.867 124.272
41.530 123.510
42.188 122.732
41.904 122.255
41.617 121.782
41.329 121.313
41.039 120.848
40.654 119.846
40.261 118.856
40.054 118.245
39.843 117.638
40.057 117.010
40.267 116.379
40.596 115.810
40.921 115.235
41.163 114.392
41.399 113.542
41.024 112.911
40.645 112.287
41.126 111.435
41.601 110.570
42.070 109.693
42.636 109.041
43.149 108.131
43.655 107.205
44.099 107.061
44.543 106.914
44.987 106.765
45.431 106.614
45.875 106.460
46.318 106.304
46.849 106.177
47.380 106.048
47.910 105.916
48.441 105.781
49.292 105.582
50.143 105.375
50.786 104.904
51.427 104.420
51.765 105.058
52.099 105.705
52.431 106.362
52.758 107.029
53.081 107.706
53.401 108.393
54.150 108.691
54.899 109.000
55.331 109.375
55.762 109.758
56.221 110.924
56.295 112.305
56.418 113.656
56.526 115.015
56.618 116.382
56.802 117.253
56.980 118.133
57.151 119.021
57.316 119.918
57.302 120.851
57.281 121.784
57.254 122.715
57.219 123.645
57.178 124.573
57.130 125.499
56.774 126.960
56.401 128.393
56.013 129.798
55.861 130.747
55.702 131.688
55.491 132.674
55.273 133.650
55.060 135.138
54.830 136.610
54.588 137.918
54.333 139.211
54.103 140.145
54.074 141.278
54.035 142.409
54.035 142.409
54.574 142.179
55.112 141.943
55.650 141.700
56.188 141.451
56.658 141.535
57.128 141.621
57.599 141.709
58.069 141.800
58.539 141.893
59.009 141.988
59.479 142.086
59.948 142.187
60.282 142.943
60.611 143.715
60.935 144.502
61.255 145.306
61.570 146.126
61.880 146.963
62.734 146.499
63.587 146.008
64.438 145.487
65.287 144.932
65.287 144.932
65.803 144.344
66.318 143.731
66.654 142.503
66.979 141.242
67.447 140.330
67.910 139.381
68.477 138.963
69.042 138.523
69.635 137.368
69.954 136.758
70.529 135.962
70.692 135.595
71.268 134.854
71.865 134.017
72.281 133.267
72.695 132.483
73.371 131.263
74.018 130.200
74.479 129.595
74.938 128.955
75.495 128.519
76.050 128.050
76.642 127.634
77.234 127.181
77.684 126.457
78.133 125.679
78.133 125.679
78.990 125.188
79.759 123.408
80.206 122.639
80.643 121.898
81.115 121.004
81.595 119.984
82.087 119.100
82.298 117.755
82.539 117.171
82.740 116.582
83.014 115.793
83.151 115.258
83.321 114.558
83.512 113.723
83.674 112.843
83.824 111.974
83.966 110.959
84.110 109.727
84.194 108.939
84.295 107.709
84.369 106.759
84.486 105.302
84.579 103.943
84.664 102.918
84.911 99.444
84.960 98.568
85.028 97.273
85.102 95.839
85.154 94.155
85.229 92.313
85.296 89.980
85.346 88.486
85.418 86.802
85.500 84.802
85.556 83.142
85.639 81.103
85.768 78.403
85.917 76.326
85.989 75.029
86.106 72.984
86.203 70.926
86.306 68.208
86.472 69.752
86.606 66.301
86.655 66.544
86.755 62.462
86.805 61.506
86.787 58.018
86.746 54.561
86.706 50.770
86.641 47.523
86.598 46.062
86.561 46.314
86.496 43.480
86.432 41.755
86.291 38.301
86.161 35.607
86.053 33.340
85.908 30.972
85.810 29.229
85.874 28.143
85.867 27.427
85.859 25.383
85.817 23.347
85.799 21.343
85.684 19.285
85.591 17.890
85.486 16.063
85.380 14.666
85.281 13.242
85.137 11.704
85.067 10.659
84.958 9.809
85.009 8.938
84.898 8.134
84.762 6.665
84.632 5.178
84.570 4.508
84.597 4.035
84.561 3.848
84.462 3.024
84.344 2.235
84.223 1.301
84.102 0.405
83.996 -0.469
83.864 -1.206
83.690 -2.363
83.570 -3.204
83.430 -4.148
83.249 -5.154
83.000 -6.234
82.868 -7.212
82.691 -5.865
82.519 -5.010
82.328 -3.700
82.290 -3.796
82.050 -4.537
81.913 -5.033
81.620 -3.909
81.552 -4.152
81.370 -4.641
81.251 -3.454
81.126 -2.414
80.993 -2.779
80.792 -3.364
80.755 -2.942
80.625 -1.684
80.370 -2.341
80.308 -1.766
80.213 -0.969
80.142 -0.251
80.026 0.628
79.909 1.487
79.780 2.378
79.657 3.296
79.533 4.390
79.228 3.901
79.030 3.432
78.950 3.857
78.806 4.691
78.641 5.592
78.444 6.776
78.235 7.785
78.090 7.827
77.911 7.771
77.712 7.880
77.479 7.809
77.148 7.672
76.969 7.622
76.799 7.615
76.602 7.563
76.431 7.557
76.279 7.480
76.117 7.515
75.981 7.593
75.729 7.603
75.527 7.842
75.382 7.946
75.188 8.212
75.076 8.460
74.946 8.630
74.763 8.781
74.543 8.984
74.377 9.133
74.233 9.153
74.096 9.208
73.980 9.203
73.882 9.140
73.758 9.037
73.706 8.957
73.628 8.838
73.534 8.652
73.485 8.386
73.427 8.150
73.371 7.791
73.252 7.391
73.204 7.071
73.145 6.782
73.019 6.055
72.924 5.586
72.820 4.970
72.697 4.300
72.580 3.609
72.433 2.781
72.328 1.991
72.134 0.901
72.015 0.281
71.910 -0.392
71.815 -0.975
71.685 -1.743
71.592 -2.399
71.500 -2.937
71.398 -3.692
71.490 -4.072
71.432 -4.360
71.333 -4.741
71.431 -5.157
71.540 -5.699
71.465 -5.917
71.387 -6.333
71.282 -6.900
71.125 -7.375
71.217 -7.941
71.456 -9.393
71.615 -10.356
71.774 -11.370
71.588 -11.714
71.396 -12.106
71.252 -12.359
71.147 -11.865
71.052 -11.356
70.876 -11.669
70.707 -12.009
70.563 -12.255
70.698 -12.905
70.772 -13.396
70.816 -13.892
70.726 -14.036
70.517 -14.237
70.354 -14.448
70.389 -14.734
70.168 -15.024
69.840 -15.425
69.550 -15.716
69.550 -15.716
69.265 -16.034
69.038 -16.263
68.808 -16.487
68.865 -17.154
68.700 -17.392
68.400 -17.829
68.066 -18.220
67.738 -18.490
67.443 -18.756
67.058 -19.099
66.934 -18.118
66.781 -18.247
66.685 -17.474
66.365 -17.718
66.203 -16.507
65.944 -16.656
65.677 -16.859
65.379 -17.025
64.995 -17.141
64.737 -17.367
64.489 -17.822
64.182 -18.626
63.985 -19.041
63.862 -19.238
63.949 -20.097
64.017 -20.731
64.067 -21.298
63.922 -22.066
63.836 -22.537
63.767 -22.872
63.650 -23.059
63.651 -23.330
63.568 -23.487
63.474 -23.741
63.355 -24.009
63.230 -24.255
63.110 -24.519
62.992 -24.721
62.924 -24.888
62.800 -25.035
62.710 -25.156
62.614 -25.311
62.620 -25.449
62.503 -25.643
62.375 -25.875
62.237 -26.107
62.105 -26.309
61.939 -26.526
61.825 -26.768
61.665 -27.032
61.532 -27.226
61.398 -27.389
61.252 -27.582
61.066 -27.855
60.956 -28.024
60.848 -28.192
60.705 -28.408
60.566 -28.642
60.419 -28.829
60.333 -28.927
60.340 -29.029
60.273 -29.118
60.168 -29.224
60.083 -29.372
60.083 -29.372
59.969 -29.508
59.868 -29.636
59.751 -29.849
59.618 -30.043
59.529 -30.163
59.390 -30.305
59.238 -30.453
59.093 -30.647
58.941 -30.791
58.976 -30.977
58.892 -31.039
58.805 -31.178
58.690 -31.303
58.574 -31.427
58.447 -31.556
58.468 -31.745
58.397 -31.800
58.340 -31.872
58.249 -31.983
58.148 -32.123
57.998 -32.281
58.006 -32.472
57.957 -32.492
57.880 -32.619
57.773 -32.708
57.642 -32.806
57.667 -32.918
57.608 -32.964
57.548 -33.010
57.451 -33.070
57.285 -33.203
57.265 -33.377
57.264 -33.497
57.163 -33.509
57.088 -33.535
57.001 -33.566
56.874 -33.587
56.871 -33.682
56.883 -33.796
56.902 -33.978
56.827 -34.004
56.780 -34.043
56.739 -34.072
56.746 -34.218
56.659 -34.247
56.577 -34.321
56.502 -34.346
56.498 -34.440
56.436 -34.460
56.337 -34.493
56.210 -34.510
56.061 -34.558
55.939 -34.620
55.812 -34.638
55.849 -34.877
55.774 -34.901
55.691 -34.972
55.483 -35.080
55.326 -35.173
55.141 -35.251
54.996 -35.339
54.971 -35.212
54.913 -35.274
54.786 -35.289
54.678 -35.365
54.516 -35.412
54.331 -35.488
54.327 -35.313
54.308 -35.121
54.220 -35.147
54.111 -35.201
53.951 -35.270
53.828 -35.327
53.668 -35.395
53.546 -35.452
53.512 -35.246
53.475 -35.257
53.388 -35.282
53.238 -35.325
53.211 -35.183
53.134 -35.184
52.990 -35.161
52.861 -35.156
52.705 -35.138
52.704 -35.011
52.704 -34.884
52.708 -34.925
52.682 -34.572
52.663 -34.175
52.648 -33.712
52.628 -33.335
52.615 -33.020
52.595 -32.857
52.581 -32.649
52.556 -32.359
52.516 -32.053
52.504 -31.866
52.465 -31.582
52.420 -31.257
52.343 -31.265
52.263 -31.253
52.109 -31.268
52.105 -31.058
52.094 -30.807
52.057 -30.376
52.030 -30.026
51.953 -30.036
51.858 -30.011
51.765 -30.006
51.620 -30.001
51.424 -29.996
51.254 -30.001
51.107 -29.977
50.990 -29.982
50.931 -29.942
50.861 -29.909
50.790 -29.875
50.743 -29.831
50.694 -29.768
50.598 -29.662
50.499 -29.537
50.469 -29.508
50.416 -29.427
50.320 -29.322
50.221 -29.198
50.195 -29.127
50.151 -29.022
50.068 -28.995
49.988 -28.987
49.905 -28.960
49.815 -28.895
49.731 -28.869
49.657 -28.818
49.653 -28.718
49.639 -28.562
49.583 -28.545
49.481 -28.486
49.369 -28.452
49.286 -28.426
49.220 -28.353
49.161 -28.317
49.099 -28.263
48.996 -28.206
48.909 -28.162
48.803 -28.087
48.688 -28.035
48.605 -28.011
48.609 -27.890
48.585 -27.760
48.517 -27.749
48.421 -27.731
48.325 -27.712
48.205 -27.704
48.090 -27.654
47.994 -27.635
47.886 -27.622
47.775 -27.590
47.651 -27.564
47.658 -27.463
47.602 -27.448
47.522 -27.443
47.473 -27.464
47.393 -27.459
47.341 -27.461
47.264 -27.474
47.205 -27.441
47.114 -27.382
46.999 -27.334
46.922 -27.347
46.849 -27.377
46.757 -27.378
46.755 -27.436
46.691 -27.444
46.638 -27.446
46.485 -27.472
46.356 -27.487
46.304 -27.489
46.203 -27.512
46.213 -27.565
46.149 -27.572
46.072 -27.585
45.983 -27.602
45.985 -27.677
45.936 -27.697
45.883 -27.699
45.878 -27.739
45.829 -27.759
45.700 -27.773
45.599 -27.795
45.526 -27.825
45.536 -27.877
45.521 -27.864
45.480 -27.862
45.456 -27.871
45.466 -27.924
45.430 -27.938
45.390 -27.935
45.337 -27.937
45.344 -27.972
45.280 -27.979
45.215 -27.986
45.163 -27.988
45.098 -27.994
45.127 -28.076
45.066 -28.100
45.030 -28.115
44.968 -28.139
44.920 -28.157
44.909 -28.106
44.864 -28.142
44.812 -28.144
44.751 -28.168
44.628 -28.215
44.518 -28.257
44.405 -28.282
44.307 -28.320
44.184 -28.367
44.198 -28.435
44.145 -28.436
44.096 -28.455
44.023 -28.483
43.931 -28.481
43.845 -28.513
43.768 -28.524
43.768 -28.796
43.698 -28.840
43.628 -28.884
43.493 -28.934
43.389 -29.008
43.208 -29.091
43.080 -29.174
43.081 -29.317
43.028 -29.317
42.952 -29.327
42.838 -29.349
42.724 -29.372
42.715 -29.321
42.674 -29.318
42.613 -29.339
42.527 -29.370
42.413 -29.392
42.291 -29.435
42.289 -29.223
42.237 -29.223
42.175 -29.245
42.083 -29.242
41.929 -29.261
41.910 -29.162
41.800 -29.200
41.683 -29.206
41.520 -29.245
41.385 -29.292
41.247 -29.322
41.215 -29.229
41.126 -29.242
40.985 -29.256
40.871 -29.278
40.705 -29.300
40.570 -29.346
40.599 -29.561
40.550 -29.577
40.469 -29.570
40.383 -29.598
40.285 -29.631
40.208 -29.640
40.107 -29.657
40.106 -29.588
40.079 -29.580
40.033 -29.613
39.993 -29.609
39.400 -29.770
39.400 -29.770
FT
-15.559 -177.130
-15.604 -176.660
-15.489 -176.526
-15.419 -176.462
-15.312 -176.387
-15.184 -176.341
-15.050 -176.331
-14.904 -176.319
-14.780 -176.339
-14.634 -176.346
-14.634 -176.346
-14.671 -176.880
-14.706 -177.415
-14.646 -177.746
-14.317 -178.240
-13.986 -178.733
-14.230 -178.768
-14.224 -178.888
-14.928 -179.048
-14.936 -179.288
-15.527 -179.444
-15.527 -179.444
-15.377 -178.812
-15.325 -178.264
-15.398 -177.691
-15.559 -177.130
-15.559 -177.130
GP
2.635 -102.068
2.574 -102.082
2.502 -102.077
2.486 -102.085
2.412 -102.085
2.391 -102.090
2.327 -102.088
2.308 -102.080
2.161 -102.075
2.137 -102.067
2.024 -102.075
1.972 -102.076
1.903 -102.088
1.904 -102.104
1.778 -102.133
1.752 -102.262
1.541 -102.230
1.528 -102.257
1.361 -102.222
1.349 -102.243
1.221 -102.203
1.214 -102.223
1.134 -102.181
1.134 -102.181
1.206 -102.082
1.269 -101.959
1.334 -101.825
1.404 -101.644
1.318 -101.580
1.389 -101.487
1.338 -101.423
1.399 -101.348
1.350 -101.315
1.423 -101.195
1.386 -101.153
1.471 -101.047
1.514 -101.074
1.655 -100.964
1.679 -100.973
1.743 -100.908
1.832 -100.974
1.906 -101.049
1.980 -101.149
2.049 -101.270
2.104 -101.356
2.160 -101.438
2.232 -101.512
2.232 -101.512
2.605 -101.490
2.640 -101.697
2.642 -101.878
2.635 -102.068
2.635 -102.068
in
14.623 56.265
14.302 56.819
14.208 56.762
14.141 56.903
14.068 57.037
13.937 56.969
13.848 57.140
13.772 57.299
13.740 57.301
13.643 57.477
13.523 57.689
13.451 57.810
13.309 57.733
13.138 57.639
13.002 57.867
12.745 58.239
12.745 58.239
12.284 58.017
11.821 57.796
11.359 57.576
10.896 57.356
10.434 57.138
9.971 56.919
9.857 56.977
9.857 57.029
9.681 57.261
9.942 57.491
9.532 58.063
9.450 58.018
9.293 58.263
9.090 58.148
8.863 58.430
8.647 58.251
8.401 58.611
8.167 58.918
8.097 58.880
7.768 59.309
7.673 59.220
7.312 59.700
6.951 60.179
6.767 60.038
6.310 60.670
5.910 61.142
5.490 61.657
5.262 61.529
4.911 62.000
4.523 62.457
4.108 63.002
3.893 62.868
3.631 63.331
3.700 63.388
3.482 63.819
3.602 63.890
3.217 64.618
3.299 64.682
2.921 65.213
3.299 65.489
2.971 65.963
2.752 66.379
2.393 66.179
2.052 65.992
1.859 66.333
1.621 66.673
1.331 66.493
1.068 66.870
0.722 66.657
0.337 67.159
-0.039 66.839
-0.340 67.209
-0.578 67.023
-1.040 67.662
-1.440 67.367
-1.913 67.929
-2.088 67.788
-2.540 68.249
-2.888 67.892
-3.351 68.270
-3.771 68.667
-4.118 68.349
-4.549 68.751
-5.042 68.198
-5.472 68.607
-5.891 68.219
-6.259 67.782
-6.811 68.274
-6.811 68.274
-6.538 69.007
-6.445 69.806
-6.474 70.292
-6.502 70.786
-6.599 71.312
-6.696 71.834
-6.867 72.355
-7.038 72.884
-7.039 73.392
-6.191 73.544
-5.778 73.704
-4.927 73.770
-4.307 73.883
-4.411 74.358
-4.514 74.833
-4.776 75.518
-5.038 76.203
-5.046 76.779
-5.055 77.356
-4.994 77.981
-4.932 78.606
-4.752 79.141
-4.573 79.676
-4.393 80.374
-4.213 81.072
-4.031 81.701
-3.848 82.330
-3.641 82.796
-3.433 83.263
-3.225 83.729
-3.017 84.195
-3.181 84.987
-3.344 85.779
-3.716 86.501
-4.088 87.225
-3.529 87.923
-2.969 88.620
-2.271 88.828
-1.574 89.036
-1.179 89.430
-0.783 89.825
-0.450 90.630
-0.117 91.436
0.216 92.241
0.549 93.046
0.882 93.852
1.493 94.415
2.104 94.979
2.104 94.979
2.457 94.405
3.048 93.754
3.716 93.227
4.384 92.903
5.005 92.665
5.702 92.537
6.333 92.376
6.948 92.278
6.948 92.278
7.663 91.903
8.160 91.781
8.656 91.651
9.130 91.596
9.604 91.533
10.056 91.559
10.514 91.576
11.300 91.591
11.791 91.643
12.283 91.700
13.154 91.889
13.715 92.068
13.715 92.068
14.384 92.517
14.869 92.941
15.353 93.368
15.562 93.788
15.770 94.209
15.813 95.095
15.534 95.912
15.136 96.406
15.136 96.406
15.396 96.419
16.003 96.447
16.644 96.470
17.435 96.466
17.982 96.421
18.705 96.341
19.412 96.225
20.040 96.016
20.900 95.943
21.681 95.918
22.352 95.918
23.015 95.909
23.761 95.969
24.480 96.117
25.134 96.310
25.647 96.581
26.287 96.906
26.820 97.130
27.241 97.347
27.702 97.471
28.083 97.348
28.083 97.348
28.110 96.792
28.135 96.234
28.183 95.466
27.918 94.829
27.501 94.189
27.110 93.570
27.116 93.233
27.056 92.305
27.033 91.781
27.008 91.258
26.937 90.329
26.847 89.772
27.027 89.282
26.885 88.320
26.909 87.745
27.022 87.219
26.668 86.820
26.737 86.481
27.095 86.251
27.170 85.622
27.309 84.649
27.452 84.159
27.593 83.667
27.881 82.935
28.167 82.200
28.413 81.361
28.790 81.043
28.975 80.546
29.093 80.227
29.143 79.790
29.393 79.197
29.678 78.912
29.887 78.422
30.226 78.076
30.558 77.641
30.738 77.007
31.154 76.521
31.633 75.722
32.189 75.675
32.881 75.089
33.159 74.314
33.667 73.593
34.176 73.030
34.682 72.459
34.682 72.459
34.005 71.847
33.477 71.392
32.947 70.942
32.431 70.439
31.913 69.942
31.459 70.101
31.006 70.258
30.423 70.178
29.840 70.100
29.262 69.881
29.096 69.085
29.209 68.680
29.878 68.311
30.073 67.849
29.795 67.301
29.377 67.277
28.573 67.240
28.404 67.342
27.912 67.332
27.085 67.248
26.518 67.253
25.984 67.268
25.499 67.104
25.179 66.530
24.856 65.958
24.620 65.492
24.382 65.028
24.382 65.028
24.038 64.651
23.694 64.275
23.201 63.631
22.683 62.877
22.385 62.502
22.083 62.133
21.425 62.096
21.126 61.848
20.644 61.492
20.230 61.230
19.813 60.970
19.306 60.712
18.798 60.456
18.240 60.215
18.240 60.215
17.458 60.062
16.713 60.020
16.142 59.964
15.572 59.909
15.242 59.642
14.895 59.410
15.088 59.034
14.646 58.589
14.916 58.213
14.599 57.984
14.662 57.476
14.660 57.002
14.623 56.265
14.623 56.265
jf
51.612 -130.850
51.185 -131.074
50.908 -130.753
50.465 -130.254
50.298 -130.329
50.217 -130.162
50.055 -130.300
49.983 -130.162
49.479 -130.501
49.177 -129.705
48.869 -128.919
48.476 -129.147
48.324 -128.940
47.835 -129.190
47.727 -128.938
47.065 -129.259
46.401 -129.572
46.433 -129.803
46.229 -129.917
46.196 -130.051
45.943 -130.073
45.896 -129.869
45.736 -129.936
45.414 -130.187
45.285 -130.069
44.929 -130.367
44.589 -130.480
44.208 -129.498
43.818 -128.528
43.419 -127.571
43.014 -126.627
42.357 -127.039
41.692 -127.241
41.641 -127.401
41.555 -127.446
41.589 -127.560
41.081 -127.639
40.573 -127.717
40.538 -127.579
40.450 -127.579
40.422 -126.869
40.390 -126.159
40.354 -125.450
40.313 -124.742
40.313 -124.742
40.633 -124.953
40.884 -124.933
41.135 -125.089
41.380 -125.182
41.652 -125.309
41.818 -125.281
41.986 -125.313
42.142 -125.331
42.285 -125.290
42.359 -125.209
42.492 -125.198
42.561 -125.268
42.862 -125.289
43.051 -125.289
43.143 -125.343
43.267 -125.394
43.426 -125.474
43.737 -125.480
43.925 -125.450
44.002 -125.429
44.066 -125.362
44.323 -125.372
44.523 -125.372
44.667 -125.376
44.725 -125.434
44.881 -125.437
45.104 -125.435
45.474 -125.517
45.946 -125.655
46.295 -125.773
46.643 -125.876
46.970 -125.998
47.350 -126.085
47.748 -126.370
47.996 -126.486
48.291 -126.733
48.565 -127.018
48.750 -127.378
48.877 -127.608
49.080 -127.818
49.491 -127.852
49.781 -128.029
49.885 -128.283
50.086 -128.414
50.310 -128.719
50.479 -129.010
50.647 -129.460
50.836 -129.738
51.101 -129.982
51.278 -130.212
51.398 -130.548
51.612 -130.850
51.612 -130.850
JZ
-31.536 -112.023
-31.774 -112.041
-31.948 -112.063
-32.114 -112.065
-32.343 -112.151
-32.328 -112.356
-32.489 -112.415
-32.794 -112.418
-33.112 -112.442
-33.399 -112.460
-33.650 -112.504
-33.663 -112.604
-33.999 -112.628
-34.300 -112.562
-34.556 -112.417
-34.674 -112.187
-34.811 -111.756
-34.912 -111.399
-34.995 -111.126
-35.091 -110.827
-35.091 -110.827
-35.061 -110.527
-34.946 -110.326
-34.817 -110.141
-34.702 -109.919
-34.609 -109.691
-34.545 -109.259
-34.545 -109.259
-34.204 -109.277
-33.917 -109.270
-33.702 -109.205
-33.392 -109.323
-33.140 -109.410
-33.020 -109.183
-32.937 -108.972
-32.661 -109.206
-32.400 -109.435
-32.115 -109.791
-31.920 -110.210
-31.715 -110.687
-31.564 -111.202
-31.556 -111.660
-31.536 -112.023
-31.536 -112.023
KE
-42.059 175.503
-41.910 176.081
-41.756 176.673
-41.657 177.123
-41.500 177.607
-41.188 178.015
-40.807 178.284
-40.424 178.566
-40.087 178.792
-39.685 178.950
-39.230 179.125
-38.889 179.215
-38.538 179.366
-38.205 179.569
-37.476 179.838
-36.793 -179.811
-36.179 -179.371
-35.542 -179.044
-35.022 -178.641
-34.706 -178.539
-34.485 -178.413
-34.241 -178.294
-33.846 -178.208
-33.580 -177.981
-33.191 -177.810
-32.696 -177.666
-32.203 -177.649
-31.957 -177.538
-31.793 -177.301
-31.452 -177.108
-31.037 -176.919
-30.678 -176.690
-30.322 -176.547
-29.881 -176.339
-29.469 -176.153
-29.065 -176.078
-28.697 -175.995
-28.264 -175.885
-27.784 -175.785
-27.318 -175.545
-26.857 -175.400
-26.437 -175.423
-26.025 -175.415
-25.730 -175.382
-25.426 -175.297
-25.142 -175.261
-24.836 -175.229
-24.472 -175.209
-24.070 -175.102
-23.750 -174.985
-23.750 -174.985
-23.853 -175.691
-23.952 -176.356
-24.029 -176.887
-24.105 -177.419
-24.105 -177.419
-24.242 -177.448
-24.720 -177.552
-25.197 -177.657
-25.976 -177.793
-26.767 -178.017
-27.377 -178.248
-27.985 -178.482
-28.693 -178.713
-29.498 -178.966
-29.792 -179.074
-30.355 -179.226
-30.997 -179.393
-31.333 -179.515
-31.751 -179.740
-32.347 179.980
-33.019 179.657
-33.602 179.345
-34.246 178.996
-34.786 178.681
-35.161 178.403
-35.917 177.890
-36.461 177.507
-37.102 177.049
-37.485 176.770
-37.885 176.509
-38.287 176.241
-38.674 175.995
-38.762 175.932
-39.230 175.609
-40.046 176.074
-40.311 175.868
-40.598 175.537
-40.791 175.324
-40.979 175.012
-41.157 174.632
-41.566 174.763
-41.757 174.945
-42.059 175.503
-42.059 175.503
MA
11.569 143.097
11.494 143.503
11.790 144.157
12.021 144.619
12.211 145.024
12.314 145.349
12.647 145.691
13.002 146.221
13.363 146.752
14.216 147.201
14.966 147.462
15.653 147.684
16.523 147.787
17.283 147.856
18.060 147.811
18.646 147.820
19.172 147.619
19.745 147.460
20.303 147.207
20.805 147.019
21.331 146.822
21.730 146.545
22.201 146.062
22.712 145.292
23.250 144.706
23.764 144.022
24.391 143.522
24.391 143.522
23.701 142.886
23.009 142.257
23.009 142.257
22.662 142.560
22.377 142.774
22.139 142.997
21.928 143.150
21.659 143.218
21.320 143.280
21.061 143.321
20.962 143.281
20.728 143.392
20.532 143.493
20.397 143.575
20.418 143.842
20.111 143.970
19.858 144.083
19.753 144.137
19.725 144.252
19.123 144.527
19.073 144.543
18.756 144.601
18.359 144.626
18.166 144.663
18.020 144.706
17.829 144.773
17.535 144.970
17.420 144.671
16.979 144.798
16.478 144.841
16.123 144.792
15.653 144.799
15.526 144.453
14.917 144.530
14.884 144.334
14.656 144.216
14.639 144.082
14.087 143.976
13.811 143.942
13.623 143.903
13.541 143.871
13.268 143.771
13.058 143.662
12.822 143.510
12.695 143.403
12.478 143.239
12.265 143.143
12.030 143.106
11.792 143.082
11.569 143.097
11.569 143.097
MN
-3.656 151.301
-3.607 151.250
-3.602 151.204
-3.587 151.142
-3.547 151.095
-3.476 151.021
-3.419 150.982
-3.372 150.931
-3.331 150.879
-3.348 150.824
-3.329 150.789
-3.295 150.732
-3.235 150.683
-3.163 150.634
-3.085 150.615
-3.047 150.616
-3.051 150.560
-3.061 150.509
-3.093 150.436
-3.141 150.352
-3.202 150.249
-3.274 150.135
-3.372 150.034
-3.491 149.913
-3.617 149.817
-3.617 149.817
-3.659 149.872
-3.724 149.938
-3.752 150.027
-3.790 150.121
-3.829 150.192
-3.874 150.226
-3.903 150.240
-3.881 150.320
-3.857 150.447
-3.839 150.552
-3.818 150.678
-3.775 150.793
-3.724 150.909
-3.692 150.987
-3.806 151.095
-3.737 151.222
-3.656 151.301
-3.656 151.301
MO
-5.110 140.798
-4.586 140.566
-4.045 140.328
-3.645 140.070
-3.178 139.809
-2.578 139.439
-2.093 139.205
-1.607 138.972
-1.607 138.972
-1.754 138.488
-1.900 138.003
-2.080 137.634
-2.295 137.282
-2.493 136.931
-2.796 136.562
-3.100 136.167
-3.403 135.771
-3.849 135.262
-4.298 134.966
-4.298 134.966
-4.218 135.459
-4.177 136.167
-4.199 136.672
-4.221 137.177
-4.337 138.010
-4.442 138.484
-4.548 138.959
-4.751 139.731
-4.931 140.264
-5.110 140.798
-5.110 140.798
MS
1.706 126.426
1.001 126.144
0.190 125.969
0.190 125.969
-0.128 125.616
-0.446 125.263
-0.446 125.263
-0.269 124.857
0.013 124.416
0.437 124.010
0.843 123.746
1.354 123.535
1.812 123.448
2.006 123.430
2.006 123.430
2.024 123.219
2.377 122.480
2.309 121.669
2.311 120.824
2.208 120.189
2.033 119.696
1.577 119.306
0.714 119.249
-0.081 119.475
-0.081 119.475
-0.859 119.896
-1.461 120.388
-1.710 120.811
-1.959 121.234
-2.154 121.728
-2.350 122.223
-2.598 122.823
-2.846 123.424
-3.094 123.672
-3.941 123.706
-4.576 123.458
-4.701 124.060
-4.824 124.662
-4.789 125.282
-4.754 125.901
-4.471 126.432
-4.188 126.963
-3.719 127.325
-3.719 127.325
-3.163 127.510
-2.447 127.667
-1.758 127.666
-1.758 127.666
-1.388 127.241
-1.018 126.817
-0.648 126.393
-0.278 125.969
-0.278 125.969
0.190 125.969
1.001 126.144
1.706 126.426
1.706 126.426
na
15.451 -46.766
16.019 -46.648
16.587 -46.529
16.607 -46.589
17.087 -46.498
17.566 -46.407
17.588 -46.520
18.422 -46.391
18.422 -46.318
18.935 -46.224
18.932 -46.184
19.377 -46.093
19.823 -46.002
19.802 -45.940
20.618 -45.774
20.596 -45.557
21.222 -45.419
21.247 -45.515
21.822 -45.385
21.806 -45.248
22.390 -45.157
22.973 -45.066
22.963 -45.024
23.646 -44.925
23.784 -45.699
23.917 -46.476
24.597 -46.196
24.590 -46.119
25.254 -45.791
25.192 -45.499
25.637 -45.296
26.081 -45.092
26.055 -44.899
26.270 -44.816
26.280 -44.867
26.767 -44.687
27.254 -44.506
27.235 -44.383
27.671 -44.203
28.107 -44.022
28.105 -43.942
28.811 -43.563
28.802 -43.483
29.469 -43.088
29.471 -43.037
30.070 -42.729
29.973 -42.136
30.606 -41.786
31.237 -41.430
31.194 -41.184
31.817 -40.710
31.802 -40.553
32.444 -40.129
33.084 -39.700
33.067 -39.586
33.768 -39.399
33.637 -38.597
33.501 -37.797
33.736 -37.678
33.705 -37.533
34.136 -37.336
34.124 -37.245
34.567 -37.046
34.554 -36.862
34.712 -36.785
34.693 -36.623
35.280 -36.373
35.148 -35.558
35.010 -34.746
35.625 -34.459
35.616 -34.335
36.079 -34.142
36.071 -34.057
36.221 -33.982
36.185 -33.772
36.742 -33.595
36.691 -33.313
36.941 -33.225
36.916 -33.005
37.065 -32.943
37.033 -32.708
37.176 -32.646
37.137 -32.395
37.392 -32.283
37.282 -31.516
37.705 -31.371
37.680 -31.071
38.403 -30.605
38.388 -30.430
38.888 -30.171
39.387 -29.909
39.400 -29.770
39.400 -29.770
39.993 -29.609
40.033 -29.613
40.079 -29.580
40.106 -29.588
40.107 -29.657
40.208 -29.640
40.285 -29.631
40.383 -29.598
40.469 -29.570
40.550 -29.577
40.599 -29.561
40.570 -29.346
40.705 -29.300
40.871 -29.278
40.985 -29.256
41.126 -29.242
41.215 -29.229
41.247 -29.322
41.385 -29.292
41.520 -29.245
41.683 -29.206
41.800 -29.200
41.910 -29.162
41.929 -29.261
42.083 -29.242
42.175 -29.245
42.237 -29.223
42.289 -29.223
42.291 -29.435
42.413 -29.392
42.527 -29.370
42.613 -29.339
42.674 -29.318
42.715 -29.321
42.724 -29.372
42.838 -29.349
42.952 -29.327
43.028 -29.317
43.081 -29.317
43.080 -29.174
43.208 -29.091
43.389 -29.008
43.493 -28.934
43.628 -28.884
43.698 -28.840
43.768 -28.796
43.768 -28.524
43.845 -28.513
43.931 -28.481
44.023 -28.483
44.096 -28.455
44.145 -28.436
44.198 -28.435
44.184 -28.367
44.307 -28.320
44.405 -28.282
44.518 -28.257
44.628 -28.215
44.751 -28.168
44.812 -28.144
44.864 -28.142
44.909 -28.106
44.920 -28.157
44.968 -28.139
45.030 -28.115
45.066 -28.100
45.127 -28.076
45.098 -27.994
45.163 -27.988
45.215 -27.986
45.280 -27.979
45.344 -27.972
45.337 -27.937
45.390 -27.935
45.430 -27.938
45.466 -27.924
45.456 -27.871
45.480 -27.862
45.521 -27.864
45.536 -27.877
45.526 -27.825
45.599 -27.795
45.700 -27.773
45.829 -27.759
45.878 -27.739
45.883 -27.699
45.936 -27.697
45.985 -27.677
45.983 -27.602
46.072 -27.585
46.149 -27.572
46.213 -27.565
46.203 -27.512
46.304 -27.489
46.356 -27.487
46.485 -27.472
46.638 -27.446
46.691 -27.444
46.755 -27.436
46.757 -27.378
46.849 -27.377
46.922 -27.347
46.999 -27.334
47.114 -27.382
47.205 -27.441
47.264 -27.474
47.341 -27.461
47.393 -27.459
47.473 -27.464
47.522 -27.443
47.602 -27.448
47.658 -27.463
47.651 -27.564
47.775 -27.590
47.886 -27.622
47.994 -27.635
48.090 -27.654
48.205 -27.704
48.325 -27.712
48.421 -27.731
48.517 -27.749
48.585 -27.760
48.609 -27.890
48.605 -28.011
48.688 -28.035
48.803 -28.087
48.909 -28.162
48.996 -28.206
49.099 -28.263
49.161 -28.317
49.220 -28.353
49.286 -28.426
49.369 -28.452
49.481 -28.486
49.583 -28.545
49.639 -28.562
49.653 -28.718
49.657 -28.818
49.731 -28.869
49.815 -28.895
49.905 -28.960
49.988 -28.987
50.068 -28.995
50.151 -29.022
50.195 -29.127
50.221 -29.198
50.320 -29.322
50.416 -29.427
50.469 -29.508
50.499 -29.537
50.598 -29.662
50.694 -29.768
50.743 -29.831
50.790 -29.875
50.861 -29.909
50.931 -29.942
50.990 -29.982
51.107 -29.977
51.254 -30.001
51.424 -29.996
51.620 -30.001
51.765 -30.006
51.858 -30.011
51.953 -30.036
52.030 -30.026
52.057 -30.376
52.094 -30.807
52.105 -31.058
52.109 -31.268
52.263 -31.253
52.343 -31.265
52.420 -31.257
52.465 -31.582
52.504 -31.866
52.516 -32.053
52.556 -32.359
52.581 -32.649
52.595 -32.857
52.615 -33.020
52.628 -33.335
52.648 -33.712
52.663 -34.175
52.682 -34.572
52.708 -34.925
52.704 -34.884
52.704 -35.011
52.705 -35.138
52.861 -35.156
52.990 -35.161
53.134 -35.184
53.211 -35.183
53.238 -35.325
53.388 -35.282
53.475 -35.257
53.512 -35.246
53.546 -35.452
53.668 -35.395
53.828 -35.327
53.951 -35.270
54.111 -35.201
54.220 -35.147
54.308 -35.121
54.327 -35.313
54.331 -35.488
54.516 -35.412
54.678 -35.365
54.786 -35.289
54.913 -35.274
54.971 -35.212
54.996 -35.339
55.141 -35.251
55.326 -35.173
55.483 -35.080
55.691 -34.972
55.774 -34.901
55.849 -34.877
55.812 -34.638
55.939 -34.620
56.061 -34.558
56.210 -34.510
56.337 -34.493
56.436 -34.460
56.498 -34.440
56.502 -34.346
56.577 -34.321
56.659 -34.247
56.746 -34.218
56.739 -34.072
56.780 -34.043
56.827 -34.004
56.902 -33.978
56.883 -33.796
56.871 -33.682
56.874 -33.587
57.001 -33.566
57.088 -33.535
57.163 -33.509
57.264 -33.497
57.265 -33.377
57.285 -33.203
57.451 -33.070
57.548 -33.010
57.608 -32.964
57.667 -32.918
57.642 -32.806
57.773 -32.708
57.880 -32.619
57.957 -32.492
58.006 -32.472
57.998 -32.281
58.148 -32.123
58.249 -31.983
58.340 -31.872
58.397 -31.800
58.468 -31.745
58.447 -31.556
58.574 -31.427
58.690 -31.303
58.805 -31.178
58.892 -31.039
58.976 -30.977
58.941 -30.791
59.093 -30.647
59.238 -30.453
59.390 -30.305
59.529 -30.163
59.618 -30.043
59.751 -29.849
59.868 -29.636
59.969 -29.508
60.083 -29.372
60.083 -29.372
60.168 -29.224
60.273 -29.118
60.340 -29.029
60.333 -28.927
60.419 -28.829
60.566 -28.642
60.705 -28.408
60.848 -28.192
60.956 -28.024
61.066 -27.855
61.252 -27.582
61.398 -27.389
61.532 -27.226
61.665 -27.032
61.825 -26.768
61.939 -26.526
62.105 -26.309
62.237 -26.107
62.375 -25.875
62.503 -25.643
62.620 -25.449
62.614 -25.311
62.710 -25.156
62.800 -25.035
62.924 -24.888
62.992 -24.721
63.110 -24.519
63.230 -24.255
63.355 -24.009
63.474 -23.741
63.568 -23.487
63.651 -23.330
63.650 -23.059
63.767 -22.872
63.836 -22.537
63.922 -22.066
64.067 -21.298
64.017 -20.731
63.949 -20.097
63.862 -19.238
63.985 -19.041
64.182 -18.626
64.489 -17.822
64.737 -17.367
64.995 -17.141
65.379 -17.025
65.677 -16.859
65.944 -16.656
66.203 -16.507
66.365 -17.718
66.685 -17.474
66.781 -18.247
66.934 -18.118
67.058 -19.099
67.443 -18.756
67.738 -18.490
68.066 -18.220
68.400 -17.829
68.700 -17.392
68.865 -17.154
68.808 -16.487
69.038 -16.263
69.265 -16.034
69.550 -15.716
69.550 -15.716
69.840 -15.425
70.168 -15.024
70.389 -14.734
70.354 -14.448
70.517 -14.237
70.726 -14.036
70.816 -13.892
70.772 -13.396
70.698 -12.905
70.563 -12.255
70.707 -12.009
70.876 -11.669
71.052 -11.356
71.147 -11.865
71.252 -12.359
71.396 -12.106
71.588 -11.714
71.774 -11.370
71.615 -10.356
71.456 -9.393
71.217 -7.941
71.125 -7.375
71.282 -6.900
71.387 -6.333
71.465 -5.917
71.540 -5.699
71.431 -5.157
71.333 -4.741
71.432 -4.360
71.490 -4.072
71.398 -3.692
71.500 -2.937
71.592 -2.399
71.685 -1.743
71.815 -0.975
71.910 -0.392
72.015 0.281
72.134 0.901
72.328 1.991
72.433 2.781
72.580 3.609
72.697 4.300
72.820 4.970
72.924 5.586
73.019 6.055
73.145 6.782
73.204 7.071
73.252 7.391
73.371 7.791
73.427 8.150
73.485 8.386
73.534 8.652
73.628 8.838
73.706 8.957
73.758 9.037
73.882 9.140
73.980 9.203
74.096 9.208
74.233 9.153
74.377 9.133
74.543 8.984
74.763 8.781
74.946 8.630
75.076 8.460
75.188 8.212
75.382 7.946
75.527 7.842
75.729 7.603
75.981 7.593
76.117 7.515
76.279 7.480
76.431 7.557
76.602 7.563
76.799 7.615
76.969 7.622
77.148 7.672
77.479 7.809
77.712 7.880
77.911 7.771
78.090 7.827
78.235 7.785
78.444 6.776
78.641 5.592
78.806 4.691
78.950 3.857
79.030 3.432
79.228 3.901
79.533 4.390
79.657 3.296
79.780 2.378
79.909 1.487
80.026 0.628
80.142 -0.251
80.213 -0.969
80.308 -1.766
80.370 -2.341
80.625 -1.684
80.755 -2.942
80.792 -3.364
80.993 -2.779
81.126 -2.414
81.251 -3.454
81.370 -4.641
81.552 -4.152
81.620 -3.909
81.913 -5.033
82.050 -4.537
82.290 -3.796
82.328 -3.700
82.519 -5.010
82.691 -5.865
82.868 -7.212
83.000 -6.234
83.249 -5.154
83.430 -4.148
83.570 -3.204
83.690 -2.363
83.864 -1.206
83.996 -0.469
84.102 0.405
84.223 1.301
84.344 2.235
84.462 3.024
84.561 3.848
84.597 4.035
84.570 4.508
84.632 5.178
84.762 6.665
84.898 8.134
85.009 8.938
84.958 9.809
85.067 10.659
85.137 11.704
85.281 13.242
85.380 14.666
85.486 16.063
85.591 17.890
85.684 19.285
85.799 21.343
85.817 23.347
85.859 25.383
85.867 27.427
85.874 28.143
85.810 29.229
85.908 30.972
86.053 33.340
86.161 35.607
86.291 38.301
86.432 41.755
86.496 43.480
86.561 46.314
86.598 46.062
86.641 47.523
86.706 50.770
86.746 54.561
86.787 58.018
86.805 61.506
86.755 62.462
86.655 66.544
86.606 66.301
86.472 69.752
86.306 68.208
86.203 70.926
86.106 72.984
85.989 75.029
85.917 76.326
85.768 78.403
85.639 81.103
85.556 83.142
85.500 84.802
85.418 86.802
85.346 88.486
85.296 89.980
85.229 92.313
85.154 94.155
85.102 95.839
85.028 97.273
84.960 98.568
84.911 99.444
84.664 102.918
84.579 103.943
84.486 105.302
84.369 106.759
84.295 107.709
84.194 108.939
84.110 109.727
83.966 110.959
83.824 111.974
83.674 112.843
83.512 113.723
83.321 114.558
83.151 115.258
83.014 115.793
82.740 116.582
82.539 117.171
82.298 117.755
82.087 119.100
81.595 119.984
81.115 121.004
80.643 121.898
80.206 122.639
79.759 123.408
78.990 125.188
78.133 125.679
78.133 125.679
77.684 126.457
77.234 127.181
76.642 127.634
76.050 128.050
75.495 128.519
74.938 128.955
74.479 129.595
74.018 130.200
73.371 131.263
72.695 132.483
72.281 133.267
71.865 134.017
71.268 134.854
70.692 135.595
70.529 135.962
69.954 136.758
69.635 137.368
69.042 138.523
68.477 138.963
67.910 139.381
67.447 140.330
66.979 141.242
66.654 142.503
66.318 143.731
65.803 144.344
65.287 144.932
65.287 144.932
64.733 146.595
64.162 148.191
63.574 149.721
62.971 151.189
62.353 152.596
61.721 153.946
61.607 155.337
61.478 156.717
61.407 158.045
61.322 159.367
61.313 160.363
61.296 161.359
61.272 162.353
61.241 163.345
61.338 165.013
61.414 166.691
61.505 167.696
61.590 168.706
61.667 169.722
61.736 170.743
61.736 170.743
61.017 169.865
60.293 169.027
59.842 167.623
59.376 166.258
58.897 164.930
58.487 164.518
58.076 164.115
57.664 163.721
57.251 163.336
56.836 162.960
56.420 162.592
55.817 163.340
55.209 164.066
55.209 164.066
54.957 164.847
54.588 165.771
54.237 166.407
53.906 167.413
53.569 168.188
53.208 168.836
52.855 169.752
52.498 170.700
52.026 171.847
51.684 172.964
51.403 174.219
51.108 175.571
50.896 176.720
50.698 177.680
50.619 178.498
50.505 179.688
50.496 -179.202
50.490 -178.480
50.484 -177.758
50.496 -177.088
50.588 -176.223
50.745 -175.629
50.826 -174.907
50.896 -174.119
50.964 -173.328
51.069 -172.484
51.171 -171.634
51.306 -170.897
51.440 -170.159
51.632 -169.378
51.740 -168.972
52.001 -167.990
52.257 -166.819
52.453 -166.108
52.644 -165.390
52.818 -164.665
52.988 -163.934
53.180 -163.177
53.367 -162.413
53.496 -161.664
53.621 -160.910
53.741 -160.129
53.855 -159.344
54.101 -157.986
54.318 -157.067
54.527 -156.138
54.785 -155.239
55.239 -154.160
55.610 -153.164
56.058 -152.227
56.309 -151.218
56.499 -150.547
56.623 -150.081
56.925 -149.220
57.347 -148.257
57.832 -147.449
58.352 -146.759
58.814 -146.264
59.273 -145.756
59.273 -145.756
59.576 -144.977
59.918 -144.316
60.206 -143.332
60.465 -142.405
60.401 -141.598
60.310 -141.074
60.381 -140.128
60.090 -139.396
59.762 -138.860
59.336 -138.353
58.925 -137.819
58.438 -137.107
58.090 -136.895
57.634 -136.522
57.118 -136.209
56.621 -135.903
56.102 -135.429
55.819 -135.180
55.316 -134.669
54.812 -134.151
54.377 -133.840
53.924 -133.426
53.522 -133.093
53.127 -132.714
52.697 -132.169
52.259 -131.592
51.886 -131.177
51.612 -130.850
51.612 -130.850
51.398 -130.548
51.278 -130.212
51.101 -129.982
50.836 -129.738
50.647 -129.460
50.479 -129.010
50.310 -128.719
50.086 -128.414
49.885 -128.283
49.781 -128.029
49.491 -127.852
49.080 -127.818
48.877 -127.608
48.750 -127.378
48.565 -127.018
48.291 -126.733
47.996 -126.486
47.748 -126.370
47.350 -126.085
46.970 -125.998
46.643 -125.876
46.295 -125.773
45.946 -125.655
45.474 -125.517
45.104 -125.435
44.881 -125.437
44.725 -125.434
44.667 -125.376
44.523 -125.372
44.323 -125.372
44.066 -125.362
44.002 -125.429
43.925 -125.450
43.737 -125.480
43.426 -125.474
43.267 -125.394
43.143 -125.343
43.051 -125.289
42.862 -125.289
42.561 -125.268
42.492 -125.198
42.359 -125.209
42.285 -125.290
42.142 -125.331
41.986 -125.313
41.818 -125.281
41.652 -125.309
41.380 -125.182
41.135 -125.089
40.884 -124.933
40.633 -124.953
40.313 -124.742
40.313 -124.742
40.311 -124.416
39.914 -124.163
39.439 -123.890
38.997 -123.597
38.541 -123.305
37.874 -122.696
37.527 -122.380
37.205 -122.005
36.698 -121.305
36.338 -120.897
35.910 -120.438
35.450 -119.936
34.981 -119.329
34.837 -118.912
34.658 -118.400
34.564 -118.072
34.441 -117.746
34.350 -117.507
34.181 -117.159
34.042 -116.660
33.771 -116.209
33.421 -115.773
33.421 -115.773
33.237 -115.596
33.130 -115.717
33.040 -115.594
32.958 -115.508
32.876 -115.581
32.710 -115.412
32.512 -115.212
32.418 -115.330
32.236 -115.085
31.995 -114.765
31.786 -114.522
31.602 -114.332
31.459 -114.207
31.356 -114.118
31.194 -114.330
31.097 -114.439
30.912 -114.303
30.680 -114.129
30.513 -113.986
30.314 -113.807
30.120 -114.041
29.982 -113.909
29.834 -113.758
29.730 -113.870
29.646 -113.969
29.440 -113.775
29.205 -113.521
29.008 -113.281
28.950 -113.339
28.715 -113.087
28.499 -112.812
28.322 -112.589
28.125 -112.321
27.906 -112.015
27.694 -111.711
27.570 -111.506
27.497 -111.382
27.215 -111.569
27.105 -111.373
26.927 -111.506
26.723 -111.228
26.535 -110.957
26.416 -110.758
26.360 -110.680
26.225 -110.778
26.066 -110.572
25.890 -110.291
25.706 -110.024
25.607 -109.872
25.557 -109.806
25.339 -110.007
25.180 -109.788
25.016 -109.591
24.857 -109.350
24.735 -109.178
24.658 -109.062
24.396 -109.276
24.151 -109.002
23.984 -108.806
23.814 -108.610
23.674 -108.439
23.613 -108.357
23.241 -108.651
23.082 -108.388
22.986 -108.010
22.712 -108.232
22.712 -108.232
22.613 -108.273
22.440 -108.407
22.277 -108.527
22.201 -108.516
22.102 -108.589
21.960 -108.676
21.905 -108.582
21.905 -108.582
21.835 -108.397
21.720 -108.114
21.686 -107.928
21.740 -107.774
21.742 -107.586
21.748 -107.393
21.752 -107.171
21.754 -107.046
21.799 -106.890
21.799 -106.890
21.716 -106.862
21.640 -106.808
21.483 -106.757
21.311 -106.624
21.235 -106.551
21.184 -106.525
21.121 -106.442
20.840 -106.381
20.638 -106.387
20.428 -106.385
20.203 -106.352
19.916 -106.271
19.644 -106.121
19.402 -105.949
19.164 -105.739
18.981 -105.546
18.762 -105.247
18.762 -105.247
18.622 -105.043
18.368 -104.725
18.209 -104.406
18.138 -104.191
17.920 -103.792
17.616 -103.200
17.280 -102.432
17.026 -101.703
16.636 -100.867
16.442 -100.336
16.298 -99.806
16.134 -99.435
15.919 -99.028
15.771 -98.588
15.640 -98.166
15.508 -97.691
15.358 -97.217
15.360 -96.727
15.361 -96.219
15.277 -95.799
15.090 -95.466
14.887 -95.117
14.700 -94.873
14.479 -94.542
14.222 -94.055
14.016 -93.656
13.793 -93.309
13.722 -92.962
13.498 -92.599
13.223 -92.272
13.271 -92.063
13.080 -91.719
12.832 -91.308
12.584 -90.898
12.584 -90.898
13.394 -90.810
13.917 -90.426
14.392 -90.037
14.815 -89.718
15.215 -89.372
15.622 -88.876
15.958 -88.351
16.251 -87.723
16.476 -86.966
16.695 -86.320
16.911 -85.671
17.107 -84.910
17.344 -84.248
17.481 -83.706
17.626 -82.865
17.691 -82.244
17.802 -81.625
18.333 -81.689
18.865 -81.754
18.960 -81.256
19.054 -80.758
19.160 -80.210
19.264 -79.660
19.381 -79.011
19.497 -78.361
19.623 -77.673
19.747 -76.983
19.845 -76.356
19.942 -75.729
19.990 -75.239
20.037 -74.749
20.166 -73.994
20.291 -73.239
20.331 -72.332
20.267 -71.804
20.201 -71.277
20.002 -70.626
19.802 -69.978
19.696 -69.415
19.589 -68.853
19.687 -68.022
19.721 -67.531
19.754 -67.040
19.825 -66.259
19.829 -65.694
19.833 -65.129
19.779 -64.344
19.724 -63.760
19.692 -63.360
19.574 -62.847
19.275 -62.176
18.959 -61.553
18.959 -61.553
19.208 -60.753
19.455 -59.949
19.325 -59.130
19.192 -58.309
19.052 -57.493
18.694 -56.804
18.258 -56.118
17.784 -55.484
17.309 -54.852
17.136 -54.156
16.956 -53.460
16.761 -52.881
16.567 -52.304
16.321 -51.661
16.073 -51.024
15.870 -50.467
15.983 -49.803
16.035 -49.207
16.013 -48.515
15.957 -47.693
15.804 -47.398
15.451 -46.766
15.451 -46.766
NB
-6.265 153.930
-6.507 154.225
-6.818 154.540
-7.293 154.927
-7.293 154.927
-6.858 154.730
-6.423 154.533
-5.901 154.545
-5.581 154.592
-5.240 154.978
-4.887 154.992
-4.550 154.955
-4.283 154.700
-3.948 154.359
-3.612 154.256
-3.327 154.035
-3.041 153.882
-2.688 153.711
-2.604 153.542
-2.436 153.390
-2.200 153.119
-2.150 152.916
-2.134 152.578
-1.865 152.155
-1.646 151.816
-1.460 151.427
-1.308 151.089
-1.224 150.717
-1.123 150.344
-1.021 150.023
-1.005 149.769
-0.818 149.481
-0.650 149.270
-0.650 149.270
-0.457 148.913
-0.392 148.724
-0.409 148.344
-0.426 147.859
-0.275 147.354
-0.294 147.059
-0.290 146.595
-0.349 145.919
-0.473 145.497
-0.534 145.033
-0.742 144.357
-0.951 143.808
-1.160 143.260
-1.454 142.922
-1.916 142.626
-2.462 142.394
-2.693 142.246
-2.693 142.246
-2.814 142.449
-2.932 142.633
-3.018 142.936
-3.053 143.172
-3.156 143.508
-3.460 143.743
-3.460 143.743
-3.531 144.368
-3.550 144.807
-3.485 145.399
-3.471 146.110
-3.438 146.415
-3.755 146.836
-3.641 146.918
-3.514 146.999
-3.385 147.083
-3.261 147.162
-3.152 147.241
-3.053 147.325
-2.962 147.407
-2.909 147.478
-2.881 147.539
-2.879 147.605
-2.813 147.816
-2.922 147.983
-3.026 148.123
-3.141 148.329
-3.222 148.499
-3.306 148.675
-3.395 148.878
-3.466 149.089
-3.522 149.295
-3.544 149.453
-3.570 149.603
-3.580 149.717
-3.592 149.773
-3.618 149.816
-3.617 149.817
-3.491 149.913
-3.372 150.034
-3.274 150.135
-3.202 150.249
-3.141 150.352
-3.093 150.436
-3.061 150.509
-3.051 150.560
-3.047 150.616
-3.085 150.615
-3.163 150.634
-3.235 150.683
-3.295 150.732
-3.329 150.789
-3.348 150.824
-3.331 150.879
-3.372 150.931
-3.419 150.982
-3.476 151.021
-3.547 151.095
-3.587 151.142
-3.602 151.204
-3.607 151.250
-3.656 151.301
-3.656 151.301
-3.706 151.375
-3.754 151.428
-3.665 151.563
-3.769 151.675
-3.720 151.814
-3.677 151.929
-3.649 151.987
-3.636 152.038
-3.666 152.132
-3.739 152.226
-3.822 152.328
-3.903 152.415
-3.974 152.478
-4.039 152.557
-4.130 152.616
-4.188 152.662
-4.603 152.927
-5.018 153.193
-5.361 153.403
-5.704 153.614
-6.046 153.823
-6.265 153.930
-6.265 153.930
ND
6.005 -78.008
5.505 -77.910
4.832 -78.080
4.066 -78.342
3.392 -78.662
2.780 -79.165
2.427 -79.478
2.074 -79.791
1.549 -80.292
1.053 -80.574
0.432 -80.887
-0.284 -81.229
-1.095 -81.415
-1.814 -81.599
-2.437 -81.532
-3.000 -81.652
-3.245 -81.599
-3.245 -81.599
-3.268 -81.302
-3.264 -80.977
-3.074 -80.575
-2.883 -80.206
-2.643 -79.803
-2.472 -79.497
-2.279 -79.225
-1.994 -78.929
-1.421 -78.667
-0.748 -78.437
-0.234 -78.193
0.148 -78.005
0.148 -78.005
0.586 -77.707
0.899 -77.332
1.101 -76.922
1.276 -76.574
1.506 -76.254
1.618 -75.989
1.932 -75.774
2.281 -75.433
2.498 -75.210
2.791 -74.875
3.022 -74.589
3.294 -74.345
3.420 -74.101
3.560 -73.927
3.819 -73.815
3.979 -73.780
4.168 -73.592
4.308 -73.326
4.413 -73.130
4.741 -72.920
4.936 -72.773
5.118 -72.633
5.264 -72.353
5.537 -72.198
5.788 -72.149
6.046 -72.079
6.262 -71.924
6.465 -71.903
6.681 -71.889
7.030 -72.050
7.198 -72.071
7.323 -72.064
7.568 -72.359
7.700 -72.437
7.819 -72.246
7.903 -72.091
8.105 -71.915
8.195 -71.795
8.342 -71.696
8.453 -71.456
8.571 -71.208
8.661 -71.081
8.807 -70.925
8.876 -70.727
9.014 -70.514
9.139 -70.358
9.388 -70.081
9.582 -69.875
9.797 -69.696
9.976 -69.511
10.121 -69.297
10.196 -69.140
10.299 -68.976
10.455 -68.670
10.502 -68.507
10.535 -68.350
10.511 -68.131
10.499 -67.961
10.499 -67.961
10.815 -68.087
11.174 -68.379
11.513 -68.730
11.844 -69.024
12.175 -69.348
12.450 -69.594
12.668 -69.863
12.930 -70.183
13.162 -70.496
13.310 -70.659
13.310 -70.659
13.438 -70.953
13.503 -71.195
13.465 -71.840
13.410 -72.428
13.367 -72.916
13.290 -73.303
13.058 -73.632
12.743 -73.874
12.386 -74.058
12.224 -74.307
12.021 -74.476
11.914 -74.796
11.764 -75.123
11.595 -75.370
11.390 -75.631
11.087 -75.905
10.765 -76.064
10.574 -76.275
10.329 -76.456
10.090 -76.594
9.761 -76.703
9.379 -76.706
9.017 -76.701
8.731 -76.684
8.731 -76.684
8.443 -76.906
8.190 -77.149
8.105 -77.331
8.012 -77.534
7.829 -77.707
7.637 -78.013
7.510 -78.228
7.337 -78.646
7.337 -78.646
7.232 -78.715
7.100 -78.762
7.031 -78.747
6.997 -78.698
6.942 -78.599
6.853 -78.542
6.757 -78.443
6.660 -78.400
6.564 -78.336
6.502 -78.265
6.461 -78.195
6.343 -78.151
6.239 -78.129
6.122 -78.086
6.053 -78.050
6.005 -78.008
6.005 -78.008
NH
-13.779 166.154
-13.828 166.161
-13.991 166.204
-14.181 166.234
-14.345 166.250
-14.421 166.252
-14.559 166.268
-14.686 166.271
-14.889 166.262
-15.041 166.213
-15.130 166.228
-15.244 166.217
-15.345 166.193
-15.434 166.209
-15.560 166.225
-15.674 166.227
-15.799 166.270
-15.887 166.285
-15.975 166.340
-16.087 166.395
-16.187 166.450
-16.300 166.506
-16.438 166.562
-16.538 166.604
-16.625 166.659
-16.737 166.728
-16.836 166.810
-16.987 166.868
-17.098 166.950
-17.209 167.059
-17.307 167.155
-17.395 167.171
-17.521 167.215
-17.634 167.245
-17.759 167.275
-17.922 167.320
-18.022 167.350
-18.147 167.394
-18.247 167.424
-18.360 167.455
-18.485 167.486
-18.611 167.504
-18.712 167.521
-18.886 167.607
-19.048 167.680
-19.236 167.727
-19.372 167.812
-19.533 167.886
-19.632 167.943
-19.769 168.003
-19.893 168.075
-20.003 168.160
-20.090 168.191
-20.201 168.263
-20.325 168.335
-20.474 168.396
-20.646 168.512
-20.782 168.585
-20.893 168.645
-21.016 168.705
-21.102 168.776
-21.261 168.879
-21.420 168.996
-21.506 169.054
-21.640 169.143
-21.725 169.215
-21.823 169.288
-21.909 169.320
-21.980 169.419
-22.052 169.491
-22.124 169.577
-22.230 169.719
-22.350 169.835
-22.445 169.950
-22.516 170.036
-22.587 170.109
-22.644 170.221
-22.702 170.321
-22.759 170.420
-22.827 170.547
-22.884 170.660
-22.917 170.745
-22.949 170.842
-22.968 170.939
-23.000 171.037
-23.030 171.162
-23.072 171.288
-23.091 171.385
-23.110 171.496
-23.127 171.620
-23.146 171.703
-23.149 171.854
-23.155 171.950
-23.173 172.060
-23.176 172.197
-23.171 172.278
-23.177 172.361
-23.178 172.439
-23.178 172.439
-23.069 172.783
-23.007 173.040
-22.834 173.212
-22.835 173.606
-22.488 174.034
-22.488 174.034
-22.236 174.056
-21.841 174.090
-21.578 174.112
-21.357 174.115
-21.148 174.119
-21.140 173.379
-20.995 173.383
-20.837 173.380
-20.625 173.384
-20.377 173.351
-20.086 173.335
-19.890 173.360
-19.662 173.398
-19.430 173.429
-19.221 173.439
-18.999 173.453
-18.774 173.447
-18.520 173.425
-18.532 173.251
-18.238 173.409
-17.962 173.550
-17.680 173.660
-17.490 173.744
-17.163 173.880
-16.849 173.901
-16.849 173.901
-16.798 173.788
-16.713 173.718
-16.614 173.669
-16.497 173.593
-16.259 173.455
-16.151 173.567
-16.027 173.531
-15.922 173.485
-15.779 173.400
-15.697 173.555
-15.605 173.539
-15.567 173.516
-15.504 173.464
-15.437 173.428
-15.361 173.388
-15.234 173.359
-15.154 173.346
-15.081 173.320
-14.992 173.294
-14.897 173.259
-14.770 173.210
-14.669 173.178
-14.510 173.139
-14.294 173.019
-13.965 172.881
-13.693 172.740
-13.411 172.571
-13.411 172.571
-13.435 172.434
-13.481 172.300
-13.569 172.163
-13.678 171.972
-13.750 171.619
-13.793 171.296
-14.066 171.295
-14.083 171.181
-14.093 170.945
-14.088 170.642
-13.942 170.638
-13.974 170.150
-13.954 169.739
-13.824 169.739
-13.808 169.622
-13.811 169.456
-13.800 169.231
-13.651 169.234
-13.639 169.026
-13.630 168.792
-13.602 168.577
-13.514 168.596
-13.515 168.159
-13.649 167.157
-13.779 166.154
-13.779 166.154
NI
-14.534 -173.836
-14.379 -174.083
-14.334 -174.754
-14.407 -175.309
-14.478 -175.865
-14.634 -176.346
-14.634 -176.346
-14.780 -176.339
-14.904 -176.319
-15.050 -176.331
-15.184 -176.341
-15.312 -176.387
-15.419 -176.462
-15.489 -176.526
-15.604 -176.660
-15.559 -177.130
-15.559 -177.130
-15.710 -177.248
-15.807 -177.384
-15.899 -177.493
-15.961 -177.575
-16.024 -177.634
-16.107 -177.664
-16.177 -177.678
-16.320 -177.513
-16.437 -177.364
-16.575 -177.201
-16.725 -177.068
-16.877 -176.921
-17.034 -176.820
-17.219 -176.713
-17.399 -176.625
-17.574 -176.532
-17.731 -176.462
-17.873 -176.403
-18.055 -176.304
-18.131 -176.297
-18.267 -176.330
-18.307 -176.346
-18.472 -176.440
-18.600 -176.511
-18.686 -176.551
-18.768 -176.584
-18.836 -176.587
-18.975 -176.570
-19.217 -176.549
-19.387 -175.979
-19.387 -175.979
-19.704 -175.210
-19.459 -175.189
-19.225 -175.155
-19.002 -175.095
-18.788 -175.035
-18.605 -174.956
-18.416 -174.870
-18.231 -174.757
-18.035 -174.659
-17.842 -174.568
-17.630 -174.560
-17.612 -174.597
-17.360 -174.571
-17.320 -174.599
-17.101 -174.565
-17.066 -174.523
-16.874 -174.529
-16.735 -174.535
-16.597 -174.550
-16.355 -174.576
-16.201 -174.569
-16.052 -174.568
-15.936 -174.601
-15.880 -174.870
-15.739 -174.866
-15.616 -174.822
-15.471 -174.731
-15.370 -174.667
-15.251 -174.567
-15.314 -174.264
-15.133 -174.188
-15.015 -174.139
-14.895 -174.077
-14.767 -174.007
-14.629 -173.905
-14.534 -173.836
-14.534 -173.836
nz
-34.545 -109.259
-35.132 -108.797
-35.240 -108.071
-35.344 -107.343
-35.394 -106.666
-35.439 -105.988
-35.524 -105.391
-35.605 -104.793
-35.694 -103.998
-35.778 -103.202
-35.854 -102.565
-35.927 -101.926
-35.997 -101.286
-36.063 -100.645
-36.133 -99.532
-36.193 -98.417
-36.294 -97.402
-36.871 -97.413
-36.921 -96.552
-36.965 -95.689
-36.985 -94.909
-37.001 -94.130
-37.717 -94.093
-38.482 -93.996
-38.429 -93.075
-38.967 -93.022
-38.918 -92.340
-38.866 -91.658
-39.349 -91.603
-39.833 -91.548
-40.282 -91.512
-40.732 -91.476
-41.102 -91.391
-41.082 -90.739
-41.059 -90.088
-41.432 -90.054
-41.378 -89.250
-41.319 -88.447
-41.273 -87.417
-41.521 -87.336
-41.392 -86.240
-41.253 -85.148
-41.191 -84.487
-41.125 -83.827
-41.674 -83.716
-42.222 -83.604
-42.873 -83.454
-42.981 -83.448
-42.861 -82.509
-43.639 -82.351
-44.404 -82.138
-44.964 -81.935
-44.876 -81.106
-44.782 -80.281
-44.666 -79.586
-44.545 -78.893
-44.411 -78.207
-45.092 -77.990
-45.589 -77.764
-45.761 -77.661
-45.643 -76.675
-45.658 -76.006
-45.658 -76.006
-44.849 -75.821
-44.051 -75.782
-43.648 -75.632
-42.972 -75.558
-42.285 -75.402
-41.826 -75.397
-41.367 -75.392
-40.863 -75.189
-40.359 -75.195
-39.813 -75.128
-39.564 -75.150
-39.068 -74.988
-38.542 -74.836
-38.138 -74.655
-37.563 -74.596
-36.725 -74.442
-36.165 -74.262
-35.578 -73.897
-34.888 -73.675
-34.290 -73.246
-33.837 -72.938
-33.358 -72.861
-32.742 -72.889
-32.319 -72.762
-31.531 -72.678
-30.965 -72.618
-30.190 -72.600
-29.536 -72.555
-28.901 -72.433
-28.278 -72.170
-27.755 -71.958
-27.248 -71.847
-26.652 -71.752
-25.840 -71.628
-25.093 -71.524
-24.263 -71.466
-23.523 -71.389
-22.758 -71.347
-21.965 -71.307
-21.965 -71.307
-21.262 -71.249
-20.758 -71.323
-20.249 -71.362
-19.811 -71.487
-19.298 -71.746
-18.721 -72.266
-18.257 -72.737
-17.747 -73.400
-17.373 -73.949
-16.823 -74.609
-16.330 -75.292
-15.736 -75.916
-15.736 -75.916
-15.219 -76.403
-14.843 -76.765
-14.467 -77.125
-13.914 -77.639
-13.387 -78.148
-13.014 -78.407
-12.641 -78.665
-11.890 -79.147
-11.291 -79.618
-10.560 -79.997
-9.921 -80.368
-9.434 -80.701
-8.665 -81.041
-7.988 -81.375
-7.306 -81.549
-6.655 -81.784
-6.003 -81.954
-5.253 -81.999
-4.504 -82.010
-3.721 -81.926
-3.245 -81.599
-3.245 -81.599
-3.000 -81.652
-2.437 -81.532
-1.814 -81.599
-1.095 -81.415
-0.284 -81.229
0.432 -80.887
1.053 -80.574
1.549 -80.292
2.074 -79.791
2.427 -79.478
2.780 -79.165
3.392 -78.662
4.066 -78.342
4.832 -78.080
5.505 -77.910
6.005 -78.008
6.005 -78.008
6.053 -78.050
6.122 -78.086
6.239 -78.129
6.343 -78.151
6.461 -78.195
6.502 -78.265
6.564 -78.336
6.660 -78.400
6.757 -78.443
6.853 -78.542
6.942 -78.599
6.997 -78.698
7.031 -78.747
7.100 -78.762
7.232 -78.715
7.337 -78.646
7.337 -78.646
7.329 -78.751
7.319 -78.982
7.301 -79.240
7.228 -79.470
7.184 -79.658
7.160 -79.846
7.101 -80.096
7.133 -80.250
7.133 -80.250
7.221 -80.363
7.335 -80.539
7.415 -80.687
7.358 -80.784
7.294 -80.894
7.222 -81.038
7.172 -81.163
7.099 -81.342
7.055 -81.487
7.039 -81.584
7.061 -81.741
7.061 -81.741
6.978 -81.889
6.950 -81.944
6.967 -82.090
7.008 -82.125
7.041 -82.202
7.129 -82.273
7.251 -82.338
7.296 -82.492
7.307 -82.617
7.278 -82.686
7.283 -82.748
7.303 -82.811
7.366 -82.875
7.366 -82.875
7.118 -82.875
6.562 -82.875
5.833 -82.875
5.054 -82.875
4.563 -82.875
4.072 -82.875
3.595 -82.875
3.118 -82.806
3.165 -83.378
3.139 -83.922
3.112 -84.467
2.534 -84.567
2.066 -84.571
1.598 -84.576
1.644 -85.349
0.832 -85.386
0.880 -86.266
0.929 -87.145
0.977 -88.025
1.025 -88.904
1.073 -89.784
1.120 -90.663
1.736 -90.697
1.817 -91.561
2.011 -91.538
1.990 -92.118
2.200 -92.090
2.227 -92.245
2.300 -92.928
2.372 -93.611
2.440 -94.404
2.507 -95.198
2.222 -95.224
2.238 -96.120
1.873 -96.175
1.886 -96.880
1.898 -97.585
2.088 -97.551
2.077 -97.846
2.145 -98.367
2.213 -98.889
2.112 -98.918
2.190 -99.657
2.269 -99.739
2.269 -99.739
2.273 -99.811
2.272 -99.913
2.300 -100.047
2.207 -100.066
2.207 -100.394
2.204 -100.644
2.210 -101.067
2.199 -101.196
2.241 -101.203
2.232 -101.512
2.232 -101.512
2.160 -101.438
2.104 -101.356
2.049 -101.270
1.980 -101.149
1.906 -101.049
1.832 -100.974
1.743 -100.908
1.679 -100.973
1.655 -100.964
1.514 -101.074
1.471 -101.047
1.386 -101.153
1.423 -101.195
1.350 -101.315
1.399 -101.348
1.338 -101.423
1.389 -101.487
1.318 -101.580
1.404 -101.644
1.334 -101.825
1.269 -101.959
1.206 -102.082
1.134 -102.181
1.134 -102.181
0.713 -102.240
0.706 -102.210
0.372 -102.253
0.157 -102.294
-0.015 -102.319
-0.015 -102.319
-0.503 -102.397
-1.283 -102.524
-1.283 -102.399
-1.533 -102.462
-1.596 -102.307
-1.907 -102.402
-1.906 -102.621
-2.436 -102.687
-2.934 -102.754
-2.936 -102.566
-3.435 -102.571
-4.056 -102.735
-3.951 -103.637
-3.844 -104.539
-4.152 -104.699
-4.078 -105.380
-4.569 -105.544
-4.494 -106.253
-5.043 -106.450
-5.624 -106.587
-5.620 -106.741
-6.019 -106.752
-6.016 -106.845
-6.443 -106.950
-6.367 -107.441
-6.759 -107.607
-7.186 -107.653
-7.514 -107.880
-8.240 -108.063
-8.357 -108.192
-9.145 -108.320
-9.035 -109.038
-8.925 -109.756
-9.677 -109.857
-9.665 -110.071
-10.080 -110.218
-10.802 -110.292
-10.822 -110.447
-11.394 -110.485
-11.472 -110.675
-11.968 -110.926
-12.742 -111.077
-12.755 -110.892
-13.411 -111.007
-13.396 -111.191
-13.541 -111.266
-13.464 -111.846
-13.386 -112.426
-13.865 -112.439
-14.062 -112.581
-14.718 -112.613
-14.704 -112.766
-15.248 -112.869
-15.792 -112.973
-16.351 -113.066
-16.361 -112.973
-16.670 -113.165
-16.683 -113.041
-17.052 -113.241
-17.065 -113.117
-17.521 -113.329
-17.538 -113.174
-17.994 -113.388
-18.008 -113.264
-18.444 -113.383
-18.758 -113.520
-18.777 -113.364
-19.285 -113.623
-19.301 -113.498
-19.968 -113.697
-20.321 -113.796
-20.575 -113.931
-20.599 -114.087
-21.121 -114.229
-21.564 -114.318
-21.627 -114.379
-22.114 -114.421
-22.114 -114.421
-22.106 -114.125
-22.102 -113.906
-22.126 -113.610
-22.223 -113.280
-22.407 -112.934
-22.619 -112.575
-22.821 -112.208
-23.016 -111.924
-23.209 -111.741
-23.327 -111.871
-23.475 -111.864
-23.727 -111.832
-23.860 -111.763
-24.032 -111.713
-24.110 -112.098
-24.222 -112.123
-24.448 -112.103
-24.659 -112.048
-24.891 -111.977
-25.027 -111.978
-25.059 -112.453
-25.198 -112.443
-25.429 -112.388
-25.564 -112.366
-25.664 -112.364
-25.683 -112.437
-25.786 -112.455
-25.787 -112.541
-25.926 -112.550
-25.934 -112.620
-26.038 -112.672
-26.282 -112.683
-26.554 -112.658
-26.801 -112.684
-26.724 -112.947
-26.830 -112.976
-26.830 -112.976
-27.014 -113.112
-27.273 -113.129
-27.577 -113.133
-27.607 -113.001
-27.849 -112.971
-28.129 -112.955
-28.379 -112.934
-28.383 -113.010
-28.549 -113.021
-28.787 -113.020
-29.009 -112.956
-29.160 -112.367
-29.266 -111.806
-29.579 -111.749
-30.025 -111.773
-30.187 -111.775
-30.425 -111.797
-30.624 -111.851
-30.666 -111.885
-31.045 -111.951
-31.386 -111.978
-31.390 -111.964
-31.536 -112.023
-31.536 -112.023
-31.556 -111.660
-31.564 -111.202
-31.715 -110.687
-31.920 -110.210
-32.115 -109.791
-32.400 -109.435
-32.661 -109.206
-32.937 -108.972
-33.020 -109.183
-33.140 -109.410
-33.392 -109.323
-33.702 -109.205
-33.917 -109.270
-34.204 -109.277
-34.545 -109.259
-34.545 -109.259
OK
34.213 141.883
34.666 141.992
34.889 142.029
35.164 142.067
35.217 142.170
35.333 142.221
35.503 142.325
35.673 142.460
35.944 142.555
36.001 142.606
36.064 142.681
36.188 142.761
36.264 142.887
36.339 143.020
36.520 143.151
36.649 143.275
36.860 143.408
37.059 143.518
37.290 143.637
37.479 143.743
37.710 143.843
37.928 143.888
38.166 143.928
38.358 143.973
38.536 144.017
38.709 144.061
38.909 144.119
39.123 144.189
39.374 144.203
39.557 144.236
39.767 144.225
39.928 144.254
40.067 144.283
40.203 144.328
40.367 144.399
40.549 144.479
40.847 144.454
40.847 144.454
41.319 145.077
41.788 145.710
42.076 146.198
42.362 146.690
42.685 147.345
43.208 148.340
43.721 149.311
44.187 150.339
44.447 150.877
44.704 151.419
45.158 152.240
45.529 152.880
45.897 153.528
46.440 154.195
46.853 154.664
47.263 155.141
47.725 155.742
48.183 156.353
48.659 157.024
49.107 157.568
49.552 158.121
49.855 158.644
50.154 159.174
50.855 159.877
51.488 160.599
52.159 160.945
52.654 161.584
53.003 162.458
53.625 162.790
54.347 163.282
54.779 163.670
55.209 164.066
55.209 164.066
55.817 163.340
56.420 162.592
56.836 162.960
57.251 163.336
57.664 163.721
58.076 164.115
58.487 164.518
58.897 164.930
59.376 166.258
59.842 167.623
60.293 169.027
61.017 169.865
61.736 170.743
61.736 170.743
61.667 169.722
61.590 168.706
61.505 167.696
61.414 166.691
61.338 165.013
61.241 163.345
61.272 162.353
61.296 161.359
61.313 160.363
61.322 159.367
61.407 158.045
61.478 156.717
61.607 155.337
61.721 153.946
62.353 152.596
62.971 151.189
63.574 149.721
64.162 148.191
64.733 146.595
65.287 144.932
65.287 144.932
64.438 145.487
63.587 146.008
62.734 146.499
61.880 146.963
61.570 146.126
61.255 145.306
60.935 144.502
60.611 143.715
60.282 142.943
59.948 142.187
59.479 142.086
59.009 141.988
58.539 141.893
58.069 141.800
57.599 141.709
57.128 141.621
56.658 141.535
56.188 141.451
55.650 141.700
55.112 141.943
54.574 142.179
54.035 142.409
54.035 142.409
53.384 142.849
53.042 142.784
52.542 142.692
51.700 142.541
50.857 142.398
50.318 142.521
49.778 142.641
49.241 142.761
48.704 142.878
48.051 142.023
47.392 141.178
46.956 140.553
46.516 139.938
46.224 139.370
45.947 139.158
45.412 139.038
44.811 138.850
44.295 138.577
43.939 138.563
43.192 138.801
42.766 138.811
41.995 138.824
41.769 138.743
41.482 138.489
41.103 138.475
40.782 138.756
40.474 138.655
40.072 138.655
39.832 138.352
39.659 138.085
39.404 137.845
38.982 137.774
38.485 137.848
37.856 137.889
37.184 137.902
36.600 137.854
36.311 137.894
36.027 138.121
35.734 138.259
35.360 138.421
35.034 138.674
35.034 138.674
35.014 139.234
34.860 139.429
34.713 139.923
34.631 140.440
34.529 140.870
34.439 141.104
34.356 141.441
34.213 141.883
34.213 141.883
ON
25.458 128.462
25.859 128.978
26.191 129.360
26.671 129.785
27.213 130.211
27.709 130.523
28.136 130.649
28.318 131.097
28.451 131.309
28.751 131.467
28.859 131.524
28.987 131.628
29.392 131.760
29.818 132.073
30.215 132.402
30.493 132.630
30.754 132.824
30.754 132.824
30.991 132.581
31.257 132.269
31.484 132.030
31.761 131.717
31.877 131.284
31.982 130.835
32.019 130.185
32.042 129.768
31.793 129.442
31.793 129.442
31.409 129.121
31.265 129.059
31.024 128.819
30.585 129.032
30.387 128.848
30.104 128.881
29.893 128.646
29.355 129.055
29.032 128.687
28.708 128.321
28.401 128.557
28.053 128.049
27.790 127.599
27.662 127.347
27.485 127.417
27.149 126.885
27.006 126.745
26.811 126.820
26.540 126.477
26.370 126.383
26.123 126.065
25.927 125.663
25.644 125.736
25.569 125.159
25.475 124.697
25.120 124.705
25.070 124.148
25.017 123.755
24.898 123.721
24.860 123.182
25.065 122.554
24.853 122.024
24.691 121.575
24.691 121.575
24.255 121.779
23.949 122.140
23.643 122.501
23.469 123.010
23.454 123.518
23.438 124.026
23.420 124.534
23.401 125.042
23.380 125.550
23.380 125.550
23.498 125.954
23.761 126.426
24.101 126.901
24.503 127.398
24.969 127.907
25.458 128.462
25.458 128.462
pa
-61.457 161.228
-61.763 161.975
-62.213 162.579
-62.660 163.202
-62.475 163.773
-62.322 164.275
-62.177 164.768
-62.077 165.103
-62.473 165.653
-62.668 165.969
-63.087 166.620
-63.221 166.858
-62.971 167.550
-62.773 168.277
-62.632 168.708
-62.446 169.238
-62.676 169.605
-62.972 170.068
-63.149 170.441
-63.447 171.009
-63.807 171.640
-64.097 172.164
-64.256 172.520
-64.738 173.631
-64.508 174.242
-64.315 174.814
-64.174 175.162
-63.984 175.582
-64.188 176.063
-64.410 176.549
-64.506 176.819
-64.736 177.338
-64.975 177.889
-65.079 178.240
-65.274 178.759
-65.477 179.381
-65.739 179.963
-65.986 -179.197
-66.163 -178.793
-65.862 -177.926
-65.607 -177.072
-65.183 -175.729
-65.505 -175.070
-65.835 -174.418
-65.506 -173.709
-64.978 -172.517
-64.356 -171.300
-64.859 -170.043
-64.764 -169.839
-64.245 -169.109
-63.730 -168.379
-63.106 -167.513
-62.490 -166.608
-62.606 -166.199
-63.007 -165.149
-63.467 -163.921
-62.968 -163.001
-62.394 -162.061
-62.614 -161.338
-62.923 -160.430
-62.595 -159.888
-63.004 -158.703
-62.788 -158.394
-63.070 -157.601
-63.324 -156.717
-62.953 -156.022
-62.433 -155.254
-61.776 -154.324
-61.836 -154.181
-61.399 -153.661
-60.841 -152.943
-60.157 -152.119
-59.469 -151.329
-59.718 -150.382
-59.314 -149.809
-58.822 -149.264
-58.130 -148.276
-57.555 -147.692
-57.638 -147.167
-57.308 -146.681
-56.669 -145.979
-56.228 -145.412
-55.784 -144.857
-55.910 -144.482
-56.263 -143.324
-56.619 -142.086
-56.839 -141.211
-57.053 -140.325
-56.772 -140.041
-56.268 -139.545
-55.725 -139.191
-55.615 -139.578
-55.251 -139.253
-54.712 -138.799
-54.141 -138.338
-53.568 -137.890
-53.688 -137.522
-53.907 -136.590
-53.396 -136.180
-53.643 -135.307
-53.887 -134.205
-54.237 -132.870
-54.432 -132.126
-54.623 -131.375
-54.931 -130.059
-55.129 -129.345
-55.322 -128.624
-55.565 -127.231
-55.064 -126.800
-55.138 -126.197
-55.454 -125.077
-55.587 -124.262
-55.715 -123.442
-55.873 -122.655
-56.026 -121.862
-55.832 -121.635
-55.219 -121.228
-54.410 -120.663
-54.642 -119.685
-54.819 -118.581
-54.350 -118.313
-53.691 -118.037
-53.124 -117.661
-52.897 -118.977
-52.752 -118.875
-52.212 -118.422
-51.772 -118.120
-51.331 -117.824
-50.875 -117.522
-50.418 -117.225
-49.893 -116.802
-49.367 -116.388
-49.589 -115.233
-49.721 -114.556
-49.849 -113.875
-49.357 -113.745
-48.841 -113.528
-48.324 -113.315
-47.773 -113.131
-47.222 -112.950
-46.538 -112.685
-45.854 -112.426
-45.833 -112.675
-45.494 -112.550
-44.938 -112.381
-44.381 -112.216
-43.774 -111.971
-43.166 -111.730
-42.683 -111.538
-42.200 -111.349
-42.249 -110.954
-41.355 -110.832
-40.760 -110.754
-40.164 -110.677
-39.575 -110.533
-38.986 -110.391
-38.978 -111.270
-38.878 -111.268
-38.276 -111.067
-37.674 -110.869
-37.042 -110.668
-36.410 -110.471
-36.358 -110.739
-36.219 -110.715
-35.830 -110.579
-35.797 -110.895
-35.319 -110.877
-35.091 -110.827
-35.091 -110.827
-34.995 -111.126
-34.912 -111.399
-34.811 -111.756
-34.674 -112.187
-34.556 -112.417
-34.300 -112.562
-33.999 -112.628
-33.663 -112.604
-33.650 -112.504
-33.399 -112.460
-33.112 -112.442
-32.794 -112.418
-32.489 -112.415
-32.328 -112.356
-32.343 -112.151
-32.114 -112.065
-31.948 -112.063
-31.774 -112.041
-31.536 -112.023
-31.536 -112.023
-31.390 -111.964
-31.386 -111.978
-31.045 -111.951
-30.666 -111.885
-30.624 -111.851
-30.425 -111.797
-30.187 -111.775
-30.025 -111.773
-29.579 -111.749
-29.266 -111.806
-29.160 -112.367
-29.009 -112.956
-28.787 -113.020
-28.549 -113.021
-28.383 -113.010
-28.379 -112.934
-28.129 -112.955
-27.849 -112.971
-27.607 -113.001
-27.577 -113.133
-27.273 -113.129
-27.014 -113.112
-26.830 -112.976
-26.830 -112.976
-26.809 -113.608
-26.790 -113.944
-26.725 -114.526
-26.604 -115.105
-26.466 -115.291
-26.243 -115.518
-25.968 -115.769
-25.674 -116.028
-25.416 -116.353
-25.172 -116.490
-24.848 -116.099
-24.556 -116.225
-24.458 -116.184
-24.383 -115.968
-24.242 -115.912
-24.105 -115.482
-24.017 -115.402
-23.884 -115.424
-23.468 -115.599
-23.398 -115.254
-23.237 -115.183
-23.179 -114.962
-23.040 -114.875
-23.024 -114.567
-22.543 -114.498
-22.196 -114.505
-22.114 -114.421
-22.114 -114.421
-21.627 -114.379
-21.564 -114.318
-21.121 -114.229
-20.599 -114.087
-20.575 -113.931
-20.321 -113.796
-19.968 -113.697
-19.301 -113.498
-19.285 -113.623
-18.777 -113.364
-18.758 -113.520
-18.444 -113.383
-18.008 -113.264
-17.994 -113.388
-17.538 -113.174
-17.521 -113.329
-17.065 -113.117
-17.052 -113.241
-16.683 -113.041
-16.670 -113.165
-16.361 -112.973
-16.351 -113.066
-15.792 -112.973
-15.248 -112.869
-14.704 -112.766
-14.718 -112.613
-14.062 -112.581
-13.865 -112.439
-13.386 -112.426
-13.464 -111.846
-13.541 -111.266
-13.396 -111.191
-13.411 -111.007
-12.755 -110.892
-12.742 -111.077
-11.968 -110.926
-11.472 -110.675
-11.394 -110.485
-10.822 -110.447
-10.802 -110.292
-10.080 -110.218
-9.665 -110.071
-9.677 -109.857
-8.925 -109.756
-9.035 -109.038
-9.145 -108.320
-8.357 -108.192
-8.240 -108.063
-7.514 -107.880
-7.186 -107.653
-6.759 -107.607
-6.367 -107.441
-6.443 -106.950
-6.016 -106.845
-6.019 -106.752
-5.620 -106.741
-5.624 -106.587
-5.043 -106.450
-4.494 -106.253
-4.569 -105.544
-4.078 -105.380
-4.152 -104.699
-3.844 -104.539
-3.951 -103.637
-4.056 -102.735
-3.435 -102.571
-2.936 -102.566
-2.934 -102.754
-2.436 -102.687
-1.906 -102.621
-1.907 -102.402
-1.596 -102.307
-1.533 -102.462
-1.283 -102.399
-1.283 -102.524
-0.503 -102.397
-0.015 -102.319
-0.015 -102.319
0.157 -102.294
0.372 -102.253
0.706 -102.210
0.713 -102.240
1.134 -102.181
1.134 -102.181
1.214 -102.223
1.221 -102.203
1.349 -102.243
1.361 -102.222
1.528 -102.257
1.541 -102.230
1.752 -102.262
1.778 -102.133
1.904 -102.104
1.903 -102.088
1.972 -102.076
2.024 -102.075
2.137 -102.067
2.161 -102.075
2.308 -102.080
2.327 -102.088
2.391 -102.090
2.412 -102.085
2.486 -102.085
2.502 -102.077
2.574 -102.082
2.635 -102.068
2.635 -102.068
2.786 -102.109
2.798 -102.096
2.893 -102.118
2.889 -102.145
3.072 -102.193
3.239 -102.219
3.239 -102.219
3.458 -102.199
3.751 -102.259
3.778 -102.184
4.653 -102.320
5.529 -102.457
6.355 -102.558
7.182 -102.659
7.791 -102.810
8.400 -102.961
8.370 -103.595
8.340 -104.229
8.456 -104.258
9.175 -104.296
10.017 -104.296
10.123 -103.598
10.275 -103.628
10.937 -103.739
11.405 -103.807
11.872 -103.875
11.890 -103.772
12.587 -103.927
13.328 -104.181
14.070 -104.437
14.672 -104.563
15.274 -104.690
15.108 -105.320
15.558 -105.357
16.261 -105.398
17.031 -105.367
17.768 -105.399
17.881 -105.586
17.881 -105.586
17.929 -106.308
18.016 -106.318
18.120 -106.311
18.281 -106.281
18.520 -106.244
18.544 -106.527
18.590 -106.756
18.647 -107.002
18.756 -107.272
18.863 -107.523
18.936 -107.816
19.107 -108.233
19.224 -108.198
19.384 -108.534
19.550 -108.896
19.625 -108.903
19.806 -109.160
20.027 -109.450
20.142 -109.373
20.176 -109.378
20.242 -109.319
20.397 -109.215
20.500 -109.187
20.558 -109.285
20.643 -109.261
20.739 -109.194
20.824 -109.111
20.949 -109.013
21.068 -108.915
21.253 -108.809
21.347 -108.977
21.451 -108.936
21.536 -108.868
21.643 -108.784
21.774 -108.669
21.905 -108.582
21.905 -108.582
21.960 -108.676
22.102 -108.589
22.201 -108.516
22.277 -108.527
22.440 -108.407
22.613 -108.273
22.712 -108.232
22.712 -108.232
22.986 -108.010
23.082 -108.388
23.241 -108.651
23.613 -108.357
23.674 -108.439
23.814 -108.610
23.984 -108.806
24.151 -109.002
24.396 -109.276
24.658 -109.062
24.735 -109.178
24.857 -109.350
25.016 -109.591
25.180 -109.788
25.339 -110.007
25.557 -109.806
25.607 -109.872
25.706 -110.024
25.890 -110.291
26.066 -110.572
26.225 -110.778
26.360 -110.680
26.416 -110.758
26.535 -110.957
26.723 -111.228
26.927 -111.506
27.105 -111.373
27.215 -111.569
27.497 -111.382
27.570 -111.506
27.694 -111.711
27.906 -112.015
28.125 -112.321
28.322 -112.589
28.499 -112.812
28.715 -113.087
28.950 -113.339
29.008 -113.281
29.205 -113.521
29.440 -113.775
29.646 -113.969
29.730 -113.870
29.834 -113.758
29.982 -113.909
30.120 -114.041
30.314 -113.807
30.513 -113.986
30.680 -114.129
30.912 -114.303
31.097 -114.439
31.194 -114.330
31.356 -114.118
31.459 -114.207
31.602 -114.332
31.786 -114.522
31.995 -114.765
32.236 -115.085
32.418 -115.330
32.512 -115.212
32.710 -115.412
32.876 -115.581
32.958 -115.508
33.040 -115.594
33.130 -115.717
33.237 -115.596
33.421 -115.773
33.421 -115.773
33.771 -116.209
34.042 -116.660
34.181 -117.159
34.350 -117.507
34.441 -117.746
34.564 -118.072
34.658 -118.400
34.837 -118.912
34.981 -119.329
35.450 -119.936
35.910 -120.438
36.338 -120.897
36.698 -121.305
37.205 -122.005
37.527 -122.380
37.874 -122.696
38.541 -123.305
38.997 -123.597
39.439 -123.890
39.914 -124.163
40.311 -124.416
40.313 -124.742
40.313 -124.742
40.354 -125.450
40.390 -126.159
40.422 -126.869
40.450 -127.579
40.538 -127.579
40.573 -127.717
41.081 -127.639
41.589 -127.560
41.555 -127.446
41.641 -127.401
41.692 -127.241
42.357 -127.039
43.014 -126.627
43.419 -127.571
43.818 -128.528
44.208 -129.498
44.589 -130.480
44.929 -130.367
45.285 -130.069
45.414 -130.187
45.736 -129.936
45.896 -129.869
45.943 -130.073
46.196 -130.051
46.229 -129.917
46.433 -129.803
46.401 -129.572
47.065 -129.259
47.727 -128.938
47.835 -129.190
48.324 -128.940
48.476 -129.147
48.869 -128.919
49.177 -129.705
49.479 -130.501
49.983 -130.162
50.055 -130.300
50.217 -130.162
50.298 -130.329
50.465 -130.254
50.908 -130.753
51.185 -131.074
51.612 -130.850
51.612 -130.850
51.886 -131.177
52.259 -131.592
52.697 -132.169
53.127 -132.714
53.522 -133.093
53.924 -133.426
54.377 -133.840
54.812 -134.151
55.316 -134.669
55.819 -135.180
56.102 -135.429
56.621 -135.903
57.118 -136.209
57.634 -136.522
58.090 -136.895
58.438 -137.107
58.925 -137.819
59.336 -138.353
59.762 -138.860
60.090 -139.396
60.381 -140.128
60.310 -141.074
60.401 -141.598
60.465 -142.405
60.206 -143.332
59.918 -144.316
59.576 -144.977
59.273 -145.756
59.273 -145.756
58.814 -146.264
58.352 -146.759
57.832 -147.449
57.347 -148.257
56.925 -149.220
56.623 -150.081
56.499 -150.547
56.309 -151.218
56.058 -152.227
55.610 -153.164
55.239 -154.160
54.785 -155.239
54.527 -156.138
54.318 -157.067
54.101 -157.986
53.855 -159.344
53.741 -160.129
53.621 -160.910
53.496 -161.664
53.367 -162.413
53.180 -163.177
52.988 -163.934
52.818 -164.665
52.644 -165.390
52.453 -166.108
52.257 -166.819
52.001 -167.990
51.740 -168.972
51.632 -169.378
51.440 -170.159
51.306 -170.897
51.171 -171.634
51.069 -172.484
50.964 -173.328
50.896 -174.119
50.826 -174.907
50.745 -175.629
50.588 -176.223
50.496 -177.088
50.484 -177.758
50.490 -178.480
50.496 -179.202
50.505 179.688
50.619 178.498
50.698 177.680
50.896 176.720
51.108 175.571
51.403 174.219
51.684 172.964
52.026 171.847
52.498 170.700
52.855 169.752
53.208 168.836
53.569 168.188
53.906 167.413
54.237 166.407
54.588 165.771
54.957 164.847
55.209 164.066
55.209 164.066
54.779 163.670
54.347 163.282
53.625 162.790
53.003 162.458
52.654 161.584
52.159 160.945
51.488 160.599
50.855 159.877
50.154 159.174
49.855 158.644
49.552 158.121
49.107 157.568
48.659 157.024
48.183 156.353
47.725 155.742
47.263 155.141
46.853 154.664
46.440 154.195
45.897 153.528
45.529 152.880
45.158 152.240
44.704 151.419
44.447 150.877
44.187 150.339
43.721 149.311
43.208 148.340
42.685 147.345
42.362 146.690
42.076 146.198
41.788 145.710
41.319 145.077
40.847 144.454
40.847 144.454
40.549 144.479
40.367 144.399
40.203 144.328
40.067 144.283
39.928 144.254
39.767 144.225
39.557 144.236
39.374 144.203
39.123 144.189
38.909 144.119
38.709 144.061
38.536 144.017
38.358 143.973
38.166 143.928
37.928 143.888
37.710 143.843
37.479 143.743
37.290 143.637
37.059 143.518
36.860 143.408
36.649 143.275
36.520 143.151
36.339 143.020
36.264 142.887
36.188 142.761
36.064 142.681
36.001 142.606
35.944 142.555
35.673 142.460
35.503 142.325
35.333 142.221
35.217 142.170
35.164 142.067
34.889 142.029
34.666 141.992
34.213 141.883
34.213 141.883
33.704 141.858
33.252 142.012
32.558 141.994
31.983 142.099
31.315 142.159
30.711 142.224
30.128 142.473
29.621 142.507
28.975 142.748
28.519 143.002
27.941 143.172
27.463 143.243
26.737 143.260
26.329 143.231
25.612 143.075
24.918 143.098
24.909 143.096
24.391 143.522
24.391 143.522
23.764 144.022
23.250 144.706
22.712 145.292
22.201 146.062
21.730 146.545
21.331 146.822
20.805 147.019
20.303 147.207
19.745 147.460
19.172 147.619
18.646 147.820
18.060 147.811
17.283 147.856
16.523 147.787
15.653 147.684
14.966 147.462
14.216 147.201
13.363 146.752
13.002 146.221
12.647 145.691
12.314 145.349
12.211 145.024
12.021 144.619
11.790 144.157
11.494 143.503
11.569 143.097
11.569 143.097
11.403 142.961
11.285 142.122
11.058 141.608
10.858 140.772
10.946 140.100
10.901 139.483
11.121 138.813
10.649 138.710
9.953 138.574
9.379 138.359
9.379 138.359
9.065 139.192
8.866 139.886
8.666 140.579
8.393 141.048
8.118 141.517
7.611 142.262
7.388 142.666
7.166 143.070
6.805 143.558
6.677 144.026
6.611 144.664
6.503 145.067
6.353 145.471
6.160 146.001
5.883 146.382
5.511 146.730
5.138 147.078
4.765 147.425
4.393 147.772
3.776 148.191
3.137 148.694
2.629 148.668
2.058 148.684
1.487 148.700
0.937 148.863
0.406 149.112
-0.143 149.191
-0.397 149.251
-0.650 149.270
-0.650 149.270
-0.818 149.481
-1.005 149.769
-1.021 150.023
-1.123 150.344
-1.224 150.717
-1.308 151.089
-1.460 151.427
-1.646 151.816
-1.865 152.155
-2.134 152.578
-2.150 152.916
-2.200 153.119
-2.436 153.390
-2.604 153.542
-2.688 153.711
-3.041 153.882
-3.327 154.035
-3.612 154.256
-3.948 154.359
-4.283 154.700
-4.550 154.955
-4.887 154.992
-5.240 154.978
-5.581 154.592
-5.901 154.545
-6.423 154.533
-6.858 154.730
-7.293 154.927
-7.293 154.927
-7.489 155.454
-7.489 155.454
-7.706 155.812
-7.884 156.047
-8.174 156.296
-8.174 156.296
-8.382 156.467
-8.563 156.706
-8.602 156.782
-8.615 156.858
-8.642 156.935
-8.706 157.049
-8.746 157.177
-8.784 157.241
-8.823 157.317
-8.900 157.419
-8.965 157.572
-9.004 157.648
-9.068 157.724
-9.107 157.827
-9.159 157.916
-9.210 157.992
-9.249 158.056
-9.313 158.145
-9.390 158.273
-9.442 158.388
-9.481 158.478
-9.507 158.580
-9.546 158.709
-9.559 158.773
-9.585 158.850
-9.624 158.926
-9.650 159.003
-9.688 159.068
-9.726 159.119
-9.765 159.170
-9.829 159.221
-9.880 159.285
-9.931 159.362
-9.969 159.439
-10.021 159.503
-10.084 159.580
-10.123 159.644
-10.174 159.708
-10.200 159.772
-10.251 159.837
-10.277 159.914
-10.315 159.978
-10.379 160.068
-10.417 160.132
-10.468 160.210
-10.519 160.287
-10.570 160.364
-10.634 160.493
-10.672 160.544
-10.723 160.622
-10.787 160.725
-10.838 160.776
-10.914 160.867
-10.965 160.931
-11.029 160.996
-11.054 161.060
-11.130 161.125
-11.168 161.202
-11.194 161.306
-11.232 161.384
-11.245 161.461
-11.283 161.552
-11.321 161.720
-11.359 161.798
-11.397 161.901
-11.422 162.018
-11.434 162.109
-11.422 162.225
-11.421 162.354
-11.421 162.484
-11.382 162.626
-11.356 162.833
-11.311 163.053
-11.291 163.195
-11.265 163.311
-11.238 163.505
-11.199 163.699
-11.185 163.854
-11.158 163.996
-11.144 164.151
-11.118 164.267
-11.091 164.409
-11.090 164.512
-11.114 164.641
-11.164 164.758
-11.200 164.901
-11.287 165.070
-11.411 165.252
-11.549 165.396
-11.686 165.514
-11.887 165.621
-12.127 165.715
-12.316 165.770
-12.517 165.838
-12.744 165.894
-12.870 165.909
-13.072 165.952
-13.261 166.020
-13.513 166.090
-13.676 166.132
-13.779 166.154
-13.779 166.154
-13.649 167.157
-13.515 168.159
-13.514 168.596
-13.602 168.577
-13.630 168.792
-13.639 169.026
-13.651 169.234
-13.800 169.231
-13.811 169.456
-13.808 169.622
-13.824 169.739
-13.954 169.739
-13.974 170.150
-13.942 170.638
-14.088 170.642
-14.093 170.945
-14.083 171.181
-14.066 171.295
-13.793 171.296
-13.750 171.619
-13.678 171.972
-13.569 172.163
-13.481 172.300
-13.435 172.434
-13.411 172.571
-13.411 172.571
-13.489 173.049
-13.517 173.671
-13.295 173.941
-13.396 174.482
-13.415 174.661
-13.395 174.784
-13.335 174.898
-13.244 175.314
-13.326 175.659
-13.422 175.947
-13.643 176.021
-13.672 176.256
-13.731 176.618
-13.853 176.966
-13.948 177.167
-14.055 177.417
-14.055 177.417
-14.309 178.029
-14.501 178.469
-14.784 179.012
-14.975 179.389
-15.218 179.790
-15.542 -179.739
-15.542 -179.739
-15.527 -179.444
-15.527 -179.444
-14.936 -179.288
-14.928 -179.048
-14.224 -178.888
-14.230 -178.768
-13.986 -178.733
-14.317 -178.240
-14.646 -177.746
-14.706 -177.415
-14.671 -176.880
-14.634 -176.346
-14.634 -176.346
-14.478 -175.865
-14.407 -175.309
-14.334 -174.754
-14.379 -174.083
-14.534 -173.836
-14.534 -173.836
-14.584 -173.407
-14.584 -173.407
-14.697 -173.273
-14.785 -173.130
-14.867 -172.939
-15.033 -172.774
-15.151 -172.602
-15.373 -172.428
-15.561 -172.355
-15.732 -172.331
-16.041 -172.300
-16.332 -172.307
-16.716 -172.311
-16.963 -172.335
-17.271 -172.374
-17.677 -172.445
-17.935 -172.540
-18.152 -172.591
-18.483 -172.698
-18.777 -172.786
-19.071 -172.874
-19.461 -172.970
-19.779 -173.053
-20.204 -173.218
-20.586 -173.403
-20.893 -173.551
-21.248 -173.703
-21.526 -173.818
-21.915 -173.952
-22.290 -174.139
-22.617 -174.323
-22.906 -174.489
-23.221 -174.663
-23.513 -174.842
-23.750 -174.985
-23.750 -174.985
-24.070 -175.102
-24.472 -175.209
-24.836 -175.229
-25.142 -175.261
-25.426 -175.297
-25.730 -175.382
-26.025 -175.415
-26.437 -175.423
-26.857 -175.400
-27.318 -175.545
-27.784 -175.785
-28.264 -175.885
-28.697 -175.995
-29.065 -176.078
-29.469 -176.153
-29.881 -176.339
-30.322 -176.547
-30.678 -176.690
-31.037 -176.919
-31.452 -177.108
-31.793 -177.301
-31.957 -177.538
-32.203 -177.649
-32.696 -177.666
-33.191 -177.810
-33.580 -177.981
-33.846 -178.208
-34.241 -178.294
-34.485 -178.413
-34.706 -178.539
-35.022 -178.641
-35.542 -179.044
-36.179 -179.371
-36.793 -179.811
-37.476 179.838
-38.205 179.569
-38.538 179.366
-38.889 179.215
-39.230 179.125
-39.685 178.950
-40.087 178.792
-40.424 178.566
-40.807 178.284
-41.188 178.015
-41.500 177.607
-41.657 177.123
-41.756 176.673
-41.910 176.081
-42.059 175.503
-42.059 175.503
-42.122 174.988
-42.201 174.304
-42.291 173.724
-42.392 173.126
-42.483 172.593
-42.616 171.859
-42.675 171.473
-42.743 171.277
-42.932 170.995
-43.088 170.638
-43.358 170.103
-43.594 169.647
-43.845 169.136
-44.022 168.770
-44.022 168.770
-44.166 168.488
-44.330 168.081
-44.466 167.688
-44.648 167.368
-44.826 167.100
-44.987 166.951
-44.987 166.951
-45.211 166.710
-45.350 166.537
-45.515 166.377
-45.736 166.205
-45.887 166.019
-45.958 165.920
-46.065 165.733
-46.190 165.427
-46.405 165.168
-46.601 165.021
-46.783 164.943
-47.011 164.923
-47.148 164.838
-47.256 164.739
-47.444 164.699
-47.521 164.651
-47.658 164.528
-47.760 164.480
-47.920 164.483
-48.059 164.398
-48.202 164.389
-48.274 164.309
-48.429 164.287
-48.592 164.215
-48.742 164.130
-48.917 163.964
-49.116 163.868
-49.322 163.740
-49.573 163.545
-49.761 163.448
-49.847 163.412
-49.985 163.296
-50.079 163.235
-50.079 163.235
-50.273 163.047
-50.369 162.963
-50.443 162.785
-50.550 162.594
-50.668 162.453
-50.817 162.273
-50.962 162.049
-51.118 161.825
-51.192 161.716
-51.399 161.542
-51.542 161.368
-51.751 161.162
-51.924 161.026
-52.166 160.762
-52.292 160.671
-52.433 160.535
-52.634 160.342
-52.822 160.092
-52.991 159.905
-53.170 159.731
-53.345 159.512
-53.598 159.318
-53.620 159.216
-53.812 159.142
-54.088 158.985
-54.308 158.885
-54.559 158.740
-54.689 158.674
-54.928 158.618
-55.047 158.596
-55.272 158.540
-55.522 158.465
-55.779 158.332
-56.022 158.226
-56.165 158.153
-56.310 158.042
-56.438 157.944
-56.725 157.823
-56.992 157.703
-57.230 157.640
-57.474 157.615
-57.783 157.620
-58.068 157.751
-58.334 157.920
-58.605 158.121
-58.779 158.267
-58.858 158.385
-59.071 158.650
-59.305 158.972
-59.511 159.186
-59.732 159.413
-59.939 159.691
-60.005 159.803
-60.005 159.803
-60.504 160.327
-61.053 160.740
-61.384 161.129
-61.457 161.228
-61.457 161.228
PM
8.731 -76.684
9.065 -76.765
9.376 -76.924
9.631 -77.083
9.900 -77.291
10.098 -77.499
10.270 -77.679
10.432 -77.922
10.547 -78.129
10.615 -78.229
10.639 -78.427
10.653 -78.746
10.579 -78.970
10.479 -79.151
10.415 -79.234
10.431 -79.432
10.389 -79.748
10.305 -80.105
10.271 -80.365
10.154 -80.636
10.058 -80.879
10.058 -80.879
9.935 -81.079
9.778 -81.306
9.587 -81.469
9.444 -81.654
9.440 -82.080
9.509 -82.313
9.599 -82.525
9.770 -82.802
9.873 -83.021
10.053 -83.209
10.209 -83.465
10.321 -83.782
10.448 -84.073
10.537 -84.424
10.593 -84.746
10.653 -85.124
10.627 -85.435
10.567 -85.716
10.489 -85.969
10.388 -86.248
10.235 -86.648
10.235 -86.648
9.938 -86.449
9.684 -86.204
9.423 -85.910
9.203 -85.612
9.089 -85.380
8.937 -85.044
8.772 -84.686
8.637 -84.419
8.474 -84.158
8.300 -84.007
8.182 -83.838
8.044 -83.605
7.928 -83.360
7.849 -83.233
7.592 -83.074
7.366 -82.875
7.366 -82.875
7.303 -82.811
7.283 -82.748
7.278 -82.686
7.307 -82.617
7.296 -82.492
7.251 -82.338
7.129 -82.273
7.041 -82.202
7.008 -82.125
6.967 -82.090
6.950 -81.944
6.978 -81.889
7.061 -81.741
7.061 -81.741
7.039 -81.584
7.055 -81.487
7.099 -81.342
7.172 -81.163
7.222 -81.038
7.294 -80.894
7.358 -80.784
7.415 -80.687
7.335 -80.539
7.221 -80.363
7.133 -80.250
7.133 -80.250
7.101 -80.096
7.160 -79.846
7.184 -79.658
7.228 -79.470
7.301 -79.240
7.319 -78.982
7.329 -78.751
7.337 -78.646
7.337 -78.646
7.510 -78.228
7.637 -78.013
7.829 -77.707
8.012 -77.534
8.105 -77.331
8.190 -77.149
8.443 -76.906
8.731 -76.684
8.731 -76.684
ps
30.754 132.824
30.493 132.630
30.215 132.402
29.818 132.073
29.392 131.760
28.987 131.628
28.859 131.524
28.751 131.467
28.451 131.309
28.318 131.097
28.136 130.649
27.709 130.523
27.213 130.211
26.671 129.785
26.191 129.360
25.859 128.978
25.458 128.462
25.458 128.462
24.969 127.907
24.503 127.398
24.101 126.901
23.761 126.426
23.498 125.954
23.380 125.550
23.380 125.550
23.401 125.042
23.420 124.534
23.438 124.026
23.454 123.518
23.469 123.010
23.643 122.501
23.949 122.140
24.255 121.779
24.691 121.575
24.691 121.575
24.963 121.335
24.963 121.335
24.654 120.981
23.979 120.546
23.198 120.360
22.581 120.394
22.043 120.425
21.632 120.452
21.632 120.452
21.202 120.344
20.631 120.290
20.255 120.502
19.937 120.441
19.487 120.115
18.878 119.795
18.201 119.279
17.629 119.161
16.840 119.248
16.556 119.255
16.556 119.255
16.407 119.728
16.257 120.201
16.107 120.673
15.955 121.145
15.802 121.616
15.648 122.086
15.493 122.555
15.337 123.024
15.180 123.492
15.023 123.959
14.864 124.425
14.704 124.891
14.704 124.891
14.132 125.150
13.306 125.494
12.818 125.686
12.265 126.137
11.630 126.240
11.060 126.214
10.296 126.573
9.449 126.824
8.750 127.053
8.136 127.219
7.292 127.234
6.447 127.250
5.897 127.459
5.474 127.498
5.224 127.836
4.763 128.151
4.335 128.387
3.700 128.684
3.114 128.998
2.671 129.217
1.928 129.246
1.059 129.197
1.059 129.197
0.684 129.989
0.475 130.546
0.266 131.102
0.150 131.738
0.034 132.373
0.017 132.515
0.017 132.515
0.812 132.651
1.165 132.720
1.728 132.734
2.257 132.766
2.539 132.817
2.908 132.850
3.312 132.795
3.698 132.740
4.120 132.790
4.454 132.911
4.788 133.032
5.016 133.189
5.349 133.240
5.734 133.308
5.962 133.429
6.156 133.674
6.333 133.989
6.610 134.269
6.990 134.521
6.990 134.521
6.895 135.415
6.989 136.183
7.368 136.759
7.620 137.144
7.871 137.529
8.534 137.982
9.196 138.309
9.379 138.359
9.379 138.359
9.953 138.574
10.649 138.710
11.121 138.813
10.901 139.483
10.946 140.100
10.858 140.772
11.058 141.608
11.285 142.122
11.403 142.961
11.569 143.097
11.569 143.097
11.792 143.082
12.030 143.106
12.265 143.143
12.478 143.239
12.695 143.403
12.822 143.510
13.058 143.662
13.268 143.771
13.541 143.871
13.623 143.903
13.811 143.942
14.087 143.976
14.639 144.082
14.656 144.216
14.884 144.334
14.917 144.530
15.526 144.453
15.653 144.799
16.123 144.792
16.478 144.841
16.979 144.798
17.420 144.671
17.535 144.970
17.829 144.773
18.020 144.706
18.166 144.663
18.359 144.626
18.756 144.601
19.073 144.543
19.123 144.527
19.725 144.252
19.753 144.137
19.858 144.083
20.111 143.970
20.418 143.842
20.397 143.575
20.532 143.493
20.728 143.392
20.962 143.281
21.061 143.321
21.320 143.280
21.659 143.218
21.928 143.150
22.139 142.997
22.377 142.774
22.662 142.560
23.009 142.257
23.009 142.257
23.701 142.886
24.391 143.522
24.391 143.522
24.909 143.096
24.918 143.098
25.612 143.075
26.329 143.231
26.737 143.260
27.463 143.243
27.941 143.172
28.519 143.002
28.975 142.748
29.621 142.507
30.128 142.473
30.711 142.224
31.315 142.159
31.983 142.099
32.558 141.994
33.252 142.012
33.704 141.858
34.213 141.883
34.213 141.883
34.356 141.441
34.439 141.104
34.529 140.870
34.631 140.440
34.713 139.923
34.860 139.429
35.014 139.234
35.034 138.674
35.034 138.674
34.582 138.508
34.059 138.383
33.749 138.066
33.405 137.546
33.053 137.030
32.868 136.524
32.686 136.025
32.537 135.612
32.460 135.356
32.326 135.026
32.200 134.691
31.882 134.042
31.515 133.500
31.216 133.197
30.970 132.965
30.754 132.824
30.754 132.824
ri
21.905 -108.582
21.774 -108.669
21.643 -108.784
21.536 -108.868
21.451 -108.936
21.347 -108.977
21.253 -108.809
21.068 -108.915
20.949 -109.013
20.824 -109.111
20.739 -109.194
20.643 -109.261
20.558 -109.285
20.500 -109.187
20.397 -109.215
20.242 -109.319
20.176 -109.378
20.142 -109.373
20.027 -109.450
19.806 -109.160
19.625 -108.903
19.550 -108.896
19.384 -108.534
19.224 -108.198
19.107 -108.233
18.936 -107.816
18.863 -107.523
18.756 -107.272
18.647 -107.002
18.590 -106.756
18.544 -106.527
18.520 -106.244
18.281 -106.281
18.120 -106.311
18.016 -106.318
17.929 -106.308
17.881 -105.586
17.881 -105.586
18.140 -105.510
18.355 -105.442
18.551 -105.352
18.762 -105.247
18.762 -105.247
18.981 -105.546
19.164 -105.739
19.402 -105.949
19.644 -106.121
19.916 -106.271
20.203 -106.352
20.428 -106.385
20.638 -106.387
20.840 -106.381
21.121 -106.442
21.184 -106.525
21.235 -106.551
21.311 -106.624
21.483 -106.757
21.640 -106.808
21.716 -106.862
21.799 -106.890
21.799 -106.890
21.754 -107.046
21.752 -107.171
21.748 -107.393
21.742 -107.586
21.740 -107.774
21.686 -107.928
21.720 -108.114
21.835 -108.397
21.905 -108.582
21.905 -108.582
sa
-28.941 -12.533
-28.213 -12.746
-28.321 -13.272
-27.443 -13.482
-26.564 -13.690
-26.586 -13.816
-25.738 -14.049
-25.648 -13.663
-24.887 -13.811
-24.777 -13.280
-24.146 -13.426
-23.514 -13.570
-23.544 -13.664
-22.829 -13.829
-22.730 -13.340
-22.630 -12.851
-22.379 -12.910
-22.267 -12.364
-22.153 -11.819
-21.752 -11.936
-21.735 -11.850
-21.209 -12.007
-21.176 -11.763
-20.299 -11.971
-20.278 -11.852
-19.825 -11.945
-19.935 -12.263
-19.341 -12.370
-18.747 -12.477
-18.785 -12.759
-18.287 -12.860
-17.790 -12.960
-17.893 -13.519
-17.995 -14.079
-17.386 -14.224
-16.777 -14.369
-16.765 -14.238
-16.433 -14.302
-16.323 -13.770
-16.212 -13.239
-15.688 -13.383
-15.663 -13.226
-14.849 -13.435
-14.036 -13.643
-14.208 -14.478
-13.737 -14.539
-13.265 -14.600
-13.218 -14.410
-12.577 -14.550
-12.656 -14.791
-12.320 -14.861
-12.339 -14.908
-11.885 -15.006
-11.771 -14.511
-11.655 -14.018
-11.539 -13.524
-11.421 -13.031
-10.623 -13.174
-9.825 -13.315
-9.794 -13.166
-9.276 -13.248
-9.225 -13.023
-8.374 -13.191
-8.411 -13.357
-7.889 -13.489
-7.367 -13.621
-7.165 -12.807
-6.961 -11.993
-6.755 -11.181
-6.020 -11.267
-5.930 -11.022
-5.377 -11.167
-5.415 -11.516
-4.942 -11.604
-5.026 -12.018
-4.609 -12.145
-4.587 -12.039
-4.103 -12.097
-3.972 -11.765
-3.493 -11.898
-3.013 -12.029
-2.855 -11.834
-2.400 -11.999
-1.945 -12.164
-2.099 -12.701
-1.507 -12.930
-0.915 -13.158
-1.108 -13.909
-1.301 -14.659
-1.493 -15.410
-1.073 -15.565
-1.143 -15.841
-0.520 -16.037
-0.556 -16.252
0.299 -16.498
0.269 -16.757
0.150 -17.323
0.031 -17.889
-0.073 -18.369
-0.176 -18.850
-0.333 -19.675
-0.497 -20.490
-0.588 -21.017
-0.680 -21.544
-0.796 -22.381
-0.880 -22.936
-0.964 -23.490
-1.034 -24.051
-1.103 -24.612
-0.245 -24.821
0.614 -25.029
0.556 -25.659
0.498 -26.289
1.159 -26.474
1.062 -27.315
1.007 -27.831
0.953 -28.346
0.849 -29.210
0.797 -29.920
1.607 -30.027
1.643 -30.736
2.449 -30.811
3.255 -30.887
4.061 -30.962
4.036 -31.437
4.011 -31.912
3.986 -32.387
3.960 -32.862
4.804 -32.920
5.647 -32.978
5.649 -33.507
6.076 -33.514
6.104 -33.620
6.618 -33.624
6.616 -34.494
6.614 -35.363
6.935 -35.367
7.023 -36.047
7.363 -36.058
7.401 -36.851
7.654 -36.865
7.679 -37.536
7.703 -38.206
8.140 -38.221
8.159 -38.701
8.179 -39.181
8.197 -39.661
8.215 -40.141
8.815 -40.120
8.841 -40.652
9.373 -40.640
9.389 -40.865
9.973 -40.861
9.979 -41.083
10.787 -41.087
10.812 -41.559
10.836 -42.031
10.860 -42.504
10.883 -42.976
10.905 -43.448
10.927 -43.921
11.506 -43.903
12.085 -43.885
12.101 -44.278
12.626 -44.262
12.680 -45.037
13.336 -45.049
13.992 -45.061
14.026 -45.142
14.647 -45.136
15.267 -45.130
15.360 -45.947
15.451 -46.766
15.451 -46.766
15.804 -47.398
15.957 -47.693
16.013 -48.515
16.035 -49.207
15.983 -49.803
15.870 -50.467
16.073 -51.024
16.321 -51.661
16.567 -52.304
16.761 -52.881
16.956 -53.460
17.136 -54.156
17.309 -54.852
17.784 -55.484
18.258 -56.118
18.694 -56.804
19.052 -57.493
19.192 -58.309
19.325 -59.130
19.455 -59.949
19.208 -60.753
18.959 -61.553
18.959 -61.553
18.889 -60.912
18.595 -60.729
18.513 -60.534
18.191 -60.278
17.823 -60.051
17.548 -59.819
17.243 -59.465
16.912 -59.088
16.397 -58.824
15.991 -58.801
15.770 -58.692
15.412 -58.666
15.284 -58.526
15.150 -58.288
14.864 -57.913
14.499 -57.791
13.874 -57.711
13.102 -57.568
12.427 -57.468
11.661 -57.424
11.144 -57.533
10.634 -57.762
10.160 -58.157
10.160 -58.157
10.190 -58.639
10.220 -59.121
10.295 -59.988
10.345 -60.457
10.395 -60.927
10.427 -61.542
10.459 -62.158
10.482 -62.641
10.509 -63.233
10.532 -63.878
10.532 -63.878
10.519 -64.210
10.474 -64.508
10.539 -64.997
10.600 -65.121
10.615 -65.526
10.653 -65.964
10.662 -66.437
10.667 -66.870
10.592 -67.499
10.499 -67.961
10.499 -67.961
10.511 -68.131
10.535 -68.350
10.502 -68.507
10.455 -68.670
10.299 -68.976
10.196 -69.140
10.121 -69.297
9.976 -69.511
9.797 -69.696
9.582 -69.875
9.388 -70.081
9.139 -70.358
9.014 -70.514
8.876 -70.727
8.807 -70.925
8.661 -71.081
8.571 -71.208
8.453 -71.456
8.342 -71.696
8.195 -71.795
8.105 -71.915
7.903 -72.091
7.819 -72.246
7.700 -72.437
7.568 -72.359
7.323 -72.064
7.198 -72.071
7.030 -72.050
6.681 -71.889
6.465 -71.903
6.262 -71.924
6.046 -72.079
5.788 -72.149
5.537 -72.198
5.264 -72.353
5.118 -72.633
4.936 -72.773
4.741 -72.920
4.413 -73.130
4.308 -73.326
4.168 -73.592
3.979 -73.780
3.819 -73.815
3.560 -73.927
3.420 -74.101
3.294 -74.345
3.022 -74.589
2.791 -74.875
2.498 -75.210
2.281 -75.433
1.932 -75.774
1.618 -75.989
1.506 -76.254
1.276 -76.574
1.101 -76.922
0.899 -77.332
0.586 -77.707
0.148 -78.005
0.148 -78.005
-0.234 -78.193
-0.748 -78.437
-1.421 -78.667
-1.994 -78.929
-2.279 -79.225
-2.472 -79.497
-2.643 -79.803
-2.883 -80.206
-3.074 -80.575
-3.264 -80.977
-3.268 -81.302
-3.245 -81.599
-3.245 -81.599
-3.721 -81.926
-4.504 -82.010
-5.253 -81.999
-6.003 -81.954
-6.655 -81.784
-7.306 -81.549
-7.988 -81.375
-8.665 -81.041
-9.434 -80.701
-9.921 -80.368
-10.560 -79.997
-11.291 -79.618
-11.890 -79.147
-12.641 -78.665
-13.014 -78.407
-13.387 -78.148
-13.914 -77.639
-14.467 -77.125
-14.843 -76.765
-15.219 -76.403
-15.736 -75.916
-15.736 -75.916
-15.117 -75.418
-14.497 -74.922
-13.876 -74.429
-13.182 -73.850
-12.486 -73.274
-12.418 -72.655
-12.348 -72.036
-12.578 -71.392
-12.807 -70.747
-13.035 -70.125
-13.261 -69.501
-13.395 -69.046
-13.527 -68.590
-14.028 -68.008
-14.527 -67.423
-15.079 -67.218
-15.714 -66.696
-16.348 -66.171
-16.729 -65.795
-17.110 -65.419
-17.402 -64.585
-17.464 -63.856
-17.878 -63.836
-18.375 -63.617
-18.872 -63.396
-19.511 -63.286
-20.150 -63.176
-20.759 -63.360
-21.368 -63.545
-21.399 -64.139
-21.427 -64.732
-21.465 -65.427
-21.500 -66.123
-21.500 -66.634
-21.500 -67.144
-21.500 -67.655
-21.500 -68.166
-21.500 -69.114
-21.500 -70.062
-21.734 -70.683
-21.965 -71.307
-21.965 -71.307
-22.758 -71.347
-23.523 -71.389
-24.263 -71.466
-25.093 -71.524
-25.840 -71.628
-26.652 -71.752
-27.248 -71.847
-27.755 -71.958
-28.278 -72.170
-28.901 -72.433
-29.536 -72.555
-30.190 -72.600
-30.965 -72.618
-31.531 -72.678
-32.319 -72.762
-32.742 -72.889
-33.358 -72.861
-33.837 -72.938
-34.290 -73.246
-34.888 -73.675
-35.578 -73.897
-36.165 -74.262
-36.725 -74.442
-37.563 -74.596
-38.138 -74.655
-38.542 -74.836
-39.068 -74.988
-39.564 -75.150
-39.813 -75.128
-40.359 -75.195
-40.863 -75.189
-41.367 -75.392
-41.826 -75.397
-42.285 -75.402
-42.972 -75.558
-43.648 -75.632
-44.051 -75.782
-44.849 -75.821
-45.658 -76.006
-45.658 -76.006
-46.422 -75.958
-47.080 -75.997
-47.478 -76.321
-47.875 -76.650
-48.507 -76.925
-49.192 -77.024
-49.845 -76.990
-50.729 -76.757
-51.377 -76.626
-52.068 -76.483
-52.068 -76.483
-52.315 -75.743
-52.556 -74.996
-52.911 -74.035
-53.313 -73.010
-53.718 -72.082
-53.922 -71.291
-54.099 -70.513
-54.231 -69.867
-54.430 -68.989
-54.394 -67.404
-54.318 -65.871
-54.173 -64.788
-54.018 -63.713
-53.917 -62.821
-53.810 -61.933
-53.673 -60.532
-53.598 -59.246
-53.626 -57.750
-53.649 -56.457
-53.530 -55.596
-53.406 -54.741
-53.209 -53.382
-52.873 -52.176
-52.710 -50.671
-52.664 -49.163
-52.691 -47.663
-52.830 -46.414
-52.931 -45.191
-53.270 -44.209
-53.600 -43.212
-53.880 -42.410
-54.154 -41.597
-54.397 -40.660
-54.633 -39.711
-54.853 -38.715
-55.086 -37.810
-55.215 -36.846
-55.642 -36.108
-55.730 -34.591
-55.605 -33.691
-55.458 -33.058
-54.860 -33.355
-54.460 -33.734
-54.585 -32.367
-54.822 -30.906
-55.033 -29.488
-55.033 -29.488
-55.005 -28.647
-55.095 -27.604
-55.232 -26.995
-54.836 -25.383
-54.418 -23.798
-53.978 -22.242
-53.517 -20.717
-53.037 -19.223
-52.539 -17.762
-52.023 -16.334
-51.490 -14.940
-50.942 -13.581
-50.380 -12.256
-49.804 -10.966
-49.216 -9.710
-48.694 -9.909
-48.172 -10.104
-47.649 -10.296
-47.126 -10.483
-47.245 -11.189
-47.361 -11.898
-47.471 -12.610
-47.578 -13.325
-46.688 -13.572
-45.797 -13.810
-45.898 -14.716
-45.371 -14.894
-45.476 -15.594
-45.028 -15.760
-44.580 -15.924
-44.132 -16.086
-43.684 -16.244
-43.387 -16.330
-42.868 -16.430
-42.868 -16.430
-42.338 -16.215
-41.806 -16.332
-41.519 -16.678
-41.176 -16.744
-40.790 -16.817
-40.366 -16.867
-40.273 -16.470
-39.790 -16.415
-39.681 -15.922
-39.352 -15.965
-38.883 -16.044
-38.558 -16.361
-38.401 -16.799
-38.447 -17.050
-38.025 -17.388
-37.472 -17.533
-37.374 -17.233
-36.944 -17.333
-36.562 -17.440
-36.472 -17.085
-36.068 -17.419
-35.663 -17.703
-35.499 -16.962
-35.343 -16.027
-35.182 -15.100
-34.770 -15.266
-34.690 -15.083
-34.238 -15.274
-34.043 -14.515
-33.569 -14.702
-33.499 -14.367
-32.898 -14.446
-32.400 -14.523
-32.275 -13.883
-32.143 -13.245
-31.661 -13.371
-31.179 -13.499
-31.157 -13.367
-30.491 -13.543
-29.828 -13.716
-29.852 -13.820
-29.251 -13.990
-29.098 -13.262
-28.941 -12.533
-28.941 -12.533
SB
-7.395 148.587
-7.032 149.314
-6.939 149.860
-6.881 150.146
-6.694 150.663
-6.443 151.148
-6.210 151.519
-5.926 151.876
-5.755 152.257
-5.640 152.653
-5.741 153.107
-5.946 153.519
-6.265 153.930
-6.265 153.930
-6.046 153.823
-5.704 153.614
-5.361 153.403
-5.018 153.193
-4.603 152.927
-4.188 152.662
-4.130 152.616
-4.039 152.557
-3.974 152.478
-3.903 152.415
-3.822 152.328
-3.739 152.226
-3.666 152.132
-3.636 152.038
-3.649 151.987
-3.677 151.929
-3.720 151.814
-3.769 151.675
-3.665 151.563
-3.754 151.428
-3.706 151.375
-3.656 151.301
-3.656 151.301
-3.737 151.222
-3.806 151.095
-3.692 150.987
-3.724 150.909
-3.775 150.793
-3.818 150.678
-3.839 150.552
-3.857 150.447
-3.881 150.320
-3.903 150.240
-3.874 150.226
-3.829 150.192
-3.790 150.121
-3.752 150.027
-3.724 149.938
-3.659 149.872
-3.617 149.817
-3.618 149.816
-3.592 149.773
-3.580 149.717
-3.570 149.603
-3.544 149.453
-3.522 149.295
-3.466 149.089
-3.395 148.878
-3.306 148.675
-3.222 148.499
-3.141 148.329
-3.026 148.123
-2.922 147.983
-2.813 147.816
-2.879 147.605
-2.881 147.539
-2.909 147.478
-2.962 147.407
-3.053 147.325
-3.152 147.241
-3.261 147.162
-3.385 147.083
-3.514 146.999
-3.641 146.918
-3.755 146.836
-3.438 146.415
-3.471 146.110
-3.485 145.399
-3.550 144.807
-3.531 144.368
-3.460 143.743
-3.460 143.743
-3.766 144.079
-4.004 144.416
-4.376 144.583
-4.697 144.733
-4.968 144.867
-5.202 145.007
-5.762 145.505
-6.112 146.007
-6.513 146.497
-6.718 146.956
-7.103 147.476
-7.312 148.010
-7.395 148.587
-7.395 148.587
sc
-52.068 -76.483
-52.928 -76.312
-53.435 -76.020
-53.941 -75.720
-54.294 -75.239
-54.645 -74.749
-55.004 -74.120
-55.359 -73.480
-55.665 -72.995
-55.962 -72.277
-56.255 -71.548
-56.622 -70.401
-56.852 -69.256
-57.072 -68.097
-57.502 -67.102
-57.736 -65.867
-57.959 -64.617
-57.959 -64.617
-58.359 -63.571
-58.603 -62.571
-59.011 -61.040
-59.453 -59.705
-59.728 -58.970
-59.999 -58.223
-60.565 -56.925
-60.565 -56.925
-60.742 -56.269
-60.700 -55.810
-60.763 -55.067
-60.978 -54.309
-61.510 -54.301
-61.510 -54.301
-61.037 -53.122
-60.753 -52.068
-60.572 -51.119
-60.094 -50.887
-60.044 -49.599
-59.968 -48.251
-59.960 -46.963
-60.092 -45.603
-60.242 -44.226
-60.242 -44.226
-60.376 -43.151
-60.501 -42.067
-60.975 -41.214
-60.634 -39.827
-61.018 -39.093
-61.243 -37.560
-61.392 -36.418
-60.989 -34.825
-60.701 -33.446
-60.409 -32.367
-60.409 -32.367
-60.512 -31.014
-60.575 -29.738
-60.601 -28.743
-60.617 -27.697
-60.617 -27.697
-60.467 -27.705
-60.459 -28.677
-60.435 -29.598
-60.174 -29.881
-59.937 -30.031
-59.515 -30.108
-59.514 -29.555
-58.817 -29.563
-58.805 -29.951
-58.272 -30.007
-58.262 -29.844
-57.598 -29.852
-57.599 -30.069
-57.095 -30.129
-57.094 -30.380
-56.851 -30.469
-56.859 -30.743
-56.570 -30.743
-56.511 -30.727
-56.449 -30.721
-56.443 -30.378
-56.290 -30.334
-56.135 -30.325
-56.052 -30.332
-55.949 -30.334
-55.864 -30.326
-55.754 -30.316
-55.684 -29.817
-55.605 -29.773
-55.501 -29.794
-55.327 -29.815
-55.204 -29.715
-55.033 -29.488
-55.033 -29.488
-54.822 -30.906
-54.585 -32.367
-54.460 -33.734
-54.860 -33.355
-55.458 -33.058
-55.605 -33.691
-55.730 -34.591
-55.642 -36.108
-55.215 -36.846
-55.086 -37.810
-54.853 -38.715
-54.633 -39.711
-54.397 -40.660
-54.154 -41.597
-53.880 -42.410
-53.600 -43.212
-53.270 -44.209
-52.931 -45.191
-52.830 -46.414
-52.691 -47.663
-52.664 -49.163
-52.710 -50.671
-52.873 -52.176
-53.209 -53.382
-53.406 -54.741
-53.530 -55.596
-53.649 -56.457
-53.626 -57.750
-53.598 -59.246
-53.673 -60.532
-53.810 -61.933
-53.917 -62.821
-54.018 -63.713
-54.173 -64.788
-54.318 -65.871
-54.394 -67.404
-54.430 -68.989
-54.231 -69.867
-54.099 -70.513
-53.922 -71.291
-53.718 -72.082
-53.313 -73.010
-52.911 -74.035
-52.556 -74.996
-52.315 -75.743
-52.068 -76.483
-52.068 -76.483
SL
-60.565 -56.925
-60.855 -57.494
-60.962 -58.131
-61.082 -58.891
-61.177 -59.836
-61.363 -60.650
-61.543 -61.332
-61.841 -62.203
-62.110 -63.105
-62.422 -63.969
-62.422 -63.969
-62.825 -63.292
-63.001 -62.420
-63.293 -61.750
-62.945 -60.118
-62.553 -58.614
-62.304 -57.390
-62.063 -56.306
-61.687 -55.436
-61.510 -54.301
-61.510 -54.301
-60.978 -54.309
-60.763 -55.067
-60.700 -55.810
-60.742 -56.269
-60.565 -56.925
-60.565 -56.925
sm
-36.162 52.338
-36.153 52.902
-36.141 53.467
-35.517 53.471
-35.302 54.216
-34.542 54.255
-34.560 55.275
-34.287 55.301
-34.235 55.699
-33.653 55.738
-33.627 56.401
-33.554 57.061
-32.835 57.091
-32.303 57.122
-31.771 57.153
-31.722 57.800
-31.691 58.456
-31.055 58.530
-31.050 59.167
-30.567 59.188
-30.561 60.005
-30.532 60.763
-30.015 60.747
-29.999 60.762
-29.465 60.786
-28.931 60.810
-28.920 61.532
-28.777 61.518
-28.811 62.162
-28.490 62.135
-28.459 62.746
-28.152 62.703
-28.164 63.211
-28.021 63.194
-28.039 63.621
-27.831 63.604
-27.817 64.467
-27.812 65.332
-27.514 65.347
-27.515 66.359
-27.281 66.373
-27.269 67.129
-26.867 67.156
-26.870 67.424
-26.572 67.433
-26.583 67.962
-26.291 67.979
-26.262 68.622
-26.121 68.598
-26.141 68.820
-26.009 68.829
-25.993 69.150
-25.784 69.138
-25.782 69.460
-25.676 69.490
-25.651 69.960
-25.651 69.960
-25.483 70.090
-24.970 69.592
-24.678 69.939
-24.369 69.680
-24.040 69.402
-23.709 69.850
-23.373 69.558
-22.831 69.162
-22.387 68.797
-22.088 69.202
-21.450 68.653
-20.878 68.277
-20.712 68.559
-20.291 68.213
-20.469 67.897
-20.280 67.768
-20.369 67.593
-20.073 67.309
-20.218 67.040
-19.870 66.751
-20.078 66.428
-19.578 66.033
-18.828 65.522
-18.443 65.264
-18.058 65.007
-17.783 65.542
-17.450 66.143
-17.090 66.708
-16.659 67.410
-16.139 67.033
-15.942 67.383
-15.822 67.290
-15.270 66.888
-14.698 66.488
-14.339 66.208
-13.979 65.928
-13.777 66.210
-13.268 65.820
-12.833 66.369
-12.426 66.033
-12.018 65.698
-11.559 66.418
-11.210 66.167
-10.762 66.787
-10.350 66.460
-9.990 66.919
-9.630 67.378
-9.270 67.090
-8.881 67.565
-8.492 68.039
-8.027 67.642
-7.648 68.073
-7.253 67.811
-6.811 68.274
-6.811 68.274
-6.259 67.782
-5.891 68.219
-5.472 68.607
-5.042 68.198
-4.549 68.751
-4.118 68.349
-3.771 68.667
-3.351 68.270
-2.888 67.892
-2.540 68.249
-2.088 67.788
-1.913 67.929
-1.440 67.367
-1.040 67.662
-0.578 67.023
-0.340 67.209
-0.039 66.839
0.337 67.159
0.722 66.657
1.068 66.870
1.331 66.493
1.621 66.673
1.859 66.333
2.052 65.992
2.393 66.179
2.752 66.379
2.971 65.963
3.299 65.489
2.921 65.213
3.299 64.682
3.217 64.618
3.602 63.890
3.482 63.819
3.700 63.388
3.631 63.331
3.893 62.868
4.108 63.002
4.523 62.457
4.911 62.000
5.262 61.529
5.490 61.657
5.910 61.142
6.310 60.670
6.767 60.038
6.951 60.179
7.312 59.700
7.673 59.220
7.768 59.309
8.097 58.880
8.167 58.918
8.401 58.611
8.647 58.251
8.863 58.430
9.090 58.148
9.293 58.263
9.450 58.018
9.532 58.063
9.942 57.491
9.681 57.261
9.857 57.029
9.857 56.977
9.971 56.919
10.434 57.138
10.896 57.356
11.359 57.576
11.821 57.796
12.284 58.017
12.745 58.239
12.745 58.239
13.002 57.867
13.138 57.639
13.309 57.733
13.451 57.810
13.523 57.689
13.643 57.477
13.740 57.301
13.772 57.299
13.848 57.140
13.937 56.969
14.068 57.037
14.141 56.903
14.208 56.762
14.302 56.819
14.623 56.265
14.623 56.265
14.643 56.208
14.621 56.179
14.641 56.057
14.692 55.822
14.722 55.669
14.681 55.631
14.729 55.480
14.789 55.278
14.851 55.108
14.712 55.047
14.727 54.958
14.801 54.731
14.870 54.549
14.760 54.511
14.621 54.450
14.640 54.387
14.671 54.332
14.681 54.287
14.691 54.249
14.710 54.193
14.733 54.149
14.772 54.069
14.657 54.018
14.489 53.929
14.351 53.862
14.361 53.818
14.441 53.579
14.512 53.358
14.562 53.220
14.538 53.211
14.559 53.122
14.622 52.907
14.681 52.737
14.562 52.667
14.597 52.547
14.662 52.299
14.689 52.139
14.353 51.940
14.028 51.763
13.667 51.570
13.458 51.449
13.272 51.343
13.122 51.253
13.192 51.079
13.279 50.842
13.362 50.661
13.218 50.573
13.273 50.429
13.312 50.310
13.229 50.252
13.123 50.167
13.168 50.061
13.251 49.849
13.313 49.680
13.169 49.593
13.008 49.472
13.042 49.430
12.897 49.349
12.802 49.278
12.853 49.071
12.908 48.882
12.770 48.803
12.658 48.699
12.691 48.567
12.729 48.448
12.573 48.349
12.602 48.267
12.641 48.142
12.671 48.048
12.581 47.991
12.461 47.901
12.492 47.788
12.518 47.649
12.441 47.587
12.369 47.539
12.430 47.319
12.463 47.161
12.359 47.130
12.388 47.049
12.403 46.992
12.300 46.930
12.211 46.849
12.248 46.717
12.292 46.579
12.202 46.511
12.088 46.429
12.143 46.311
12.172 46.198
12.112 46.150
12.058 46.110
12.100 45.851
12.152 45.650
12.159 45.637
12.073 45.602
11.983 45.522
12.018 45.428
12.053 45.328
11.998 45.281
11.999 45.097
12.012 44.913
12.019 44.882
12.022 44.780
12.013 44.513
12.008 44.049
12.013 43.650
11.795 42.841
11.577 42.033
11.577 42.033
11.317 41.442
10.732 41.117
10.146 40.792
9.796 40.449
9.446 40.107
9.071 39.790
8.696 39.473
8.296 39.157
7.895 38.841
7.447 38.477
6.998 38.115
6.477 37.849
5.956 37.583
5.958 36.914
5.484 36.601
5.009 36.290
5.099 35.782
5.188 35.275
5.277 34.767
5.366 34.260
5.455 33.752
5.543 33.244
5.630 32.736
5.717 32.227
5.097 31.753
4.477 31.279
4.235 30.471
3.524 30.475
2.812 30.478
2.648 31.049
2.483 31.620
1.960 31.122
1.437 30.625
0.749 30.246
0.060 29.867
-0.626 29.630
-1.313 29.392
-1.809 29.130
-2.306 28.868
-3.134 28.910
-3.962 28.953
-4.557 29.280
-5.151 29.608
-5.625 29.604
-6.099 29.600
-6.791 30.046
-7.483 30.493
-7.631 31.042
-7.778 31.592
-8.162 32.117
-8.546 32.643
-8.643 33.099
-8.741 33.556
-9.598 33.818
-10.455 34.081
-10.974 34.969
-11.491 35.864
-12.008 36.765
-12.523 37.671
-13.036 38.582
-13.545 39.497
-14.052 40.417
-14.555 41.341
-15.054 42.268
-15.549 43.198
-16.038 44.130
-16.522 45.064
-17.000 46.000
-18.122 46.000
-19.247 46.000
-20.373 46.000
-21.500 46.000
-22.627 46.000
-23.753 46.000
-24.878 46.000
-26.000 46.000
-26.931 46.522
-27.863 47.053
-28.795 47.596
-29.726 48.149
-30.656 48.713
-31.583 49.288
-32.508 49.874
-33.429 50.472
-34.345 51.082
-35.257 51.704
-36.162 52.338
SS
-6.265 153.930
-5.946 153.519
-5.741 153.107
-5.640 152.653
-5.755 152.257
-5.926 151.876
-6.210 151.519
-6.443 151.148
-6.694 150.663
-6.881 150.146
-6.939 149.860
-7.032 149.314
-7.395 148.587
-7.395 148.587
-7.475 148.733
-7.607 148.944
-7.665 149.148
-7.665 149.334
-7.624 149.609
-7.612 149.866
-7.629 150.173
-7.687 150.555
-7.757 150.917
-7.852 151.307
-7.955 151.680
-8.104 152.062
-8.260 152.411
-8.388 152.685
-8.544 152.959
-8.684 153.108
-8.783 153.170
-8.890 153.237
-9.186 153.255
-9.186 153.255
-8.966 153.697
-8.633 154.087
-8.296 154.481
-7.962 154.872
-7.629 155.262
-7.489 155.454
-7.489 155.454
-7.293 154.927
-7.293 154.927
-6.818 154.540
-6.507 154.225
-6.265 153.930
-6.265 153.930
su
-8.167 104.576
-8.569 104.981
-8.926 105.590
-9.240 106.123
-9.371 106.345
-9.665 106.827
-9.890 107.379
-10.053 107.836
-10.178 108.363
-10.328 109.067
-10.371 109.626
-10.440 110.159
-10.477 110.615
-10.477 111.015
-10.577 111.523
-10.652 112.170
-10.758 112.563
-10.870 113.204
-10.964 113.756
-11.088 114.410
-11.150 115.013
-11.219 115.571
-11.275 116.174
-11.331 116.853
-11.337 117.576
-11.387 118.236
-11.362 118.750
-11.393 119.270
-11.462 119.841
-11.524 120.451
-11.492 120.886
-11.492 120.886
-10.829 120.995
-10.165 121.033
-9.586 120.821
-9.007 120.610
-8.410 120.576
-7.812 120.543
-7.812 120.543
-6.968 120.546
-6.122 120.620
-5.276 120.516
-4.640 120.341
-4.303 119.953
-3.966 119.565
-3.610 118.823
-3.610 118.823
-3.255 118.578
-2.408 118.723
-1.950 118.884
-1.491 119.045
-0.680 119.296
-0.081 119.475
-0.081 119.475
0.714 119.249
1.577 119.306
2.033 119.696
2.208 120.189
2.311 120.824
2.309 121.669
2.377 122.480
2.024 123.219
2.006 123.430
2.006 123.430
1.812 123.448
1.354 123.535
0.843 123.746
0.437 124.010
0.013 124.416
-0.269 124.857
-0.446 125.263
-0.446 125.263
-0.128 125.616
0.190 125.969
0.190 125.969
1.001 126.144
1.706 126.426
1.706 126.426
2.346 126.872
2.346 126.872
2.319 127.446
2.290 128.081
1.974 128.187
1.623 128.752
1.059 129.197
1.059 129.197
1.928 129.246
2.671 129.217
3.114 128.998
3.700 128.684
4.335 128.387
4.763 128.151
5.224 127.836
5.474 127.498
5.897 127.459
6.447 127.250
7.292 127.234
8.136 127.219
8.750 127.053
9.449 126.824
10.296 126.573
11.060 126.214
11.630 126.240
12.265 126.137
12.818 125.686
13.306 125.494
14.132 125.150
14.704 124.891
14.704 124.891
14.864 124.425
15.023 123.959
15.180 123.492
15.337 123.024
15.493 122.555
15.648 122.086
15.802 121.616
15.955 121.145
16.107 120.673
16.257 120.201
16.407 119.728
16.556 119.255
16.556 119.255
16.840 119.248
17.629 119.161
18.201 119.279
18.878 119.795
19.487 120.115
19.937 120.441
20.255 120.502
20.631 120.290
21.202 120.344
21.632 120.452
21.632 120.452
21.951 120.036
22.269 119.618
22.003 118.958
22.107 118.484
21.498 118.045
20.720 117.864
20.330 117.504
19.939 117.145
19.815 116.319
19.687 115.494
19.340 114.926
18.826 114.419
18.438 114.000
18.438 114.000
18.280 113.313
18.121 112.628
18.038 112.098
17.955 111.569
17.870 111.040
17.783 110.512
17.785 109.573
17.784 108.634
17.777 107.695
17.766 106.756
17.750 105.817
17.730 104.878
17.709 104.312
17.685 103.746
17.660 103.180
17.633 102.615
17.350 102.032
17.066 101.451
16.575 101.141
16.084 100.832
15.462 100.297
14.838 99.766
14.446 99.210
14.434 98.300
14.419 97.390
14.400 96.480
14.400 96.480
14.129 96.503
13.783 95.857
12.918 95.505
12.053 95.155
11.188 94.807
10.679 94.415
10.170 94.024
9.717 94.216
9.270 94.415
9.019 93.986
8.686 94.171
8.312 94.429
7.847 94.775
7.603 94.460
7.139 94.883
6.837 94.498
6.259 94.950
5.715 95.435
5.114 96.013
4.644 96.567
3.772 96.601
2.979 96.697
2.185 96.783
1.763 96.743
1.345 96.202
1.345 96.202
1.123 96.379
0.759 96.670
0.116 97.011
-0.547 97.372
-1.247 97.769
-1.634 98.035
-2.021 98.301
-2.665 98.874
-3.312 99.370
-3.729 99.675
-4.145 99.980
-4.656 100.359
-5.305 100.791
-5.983 101.346
-6.558 101.858
-7.197 102.452
-7.621 103.183
-7.863 103.763
-8.167 104.576
-8.167 104.576
sw
-55.033 -29.488
-55.204 -29.715
-55.327 -29.815
-55.501 -29.794
-55.605 -29.773
-55.684 -29.817
-55.754 -30.316
-55.864 -30.326
-55.949 -30.334
-56.052 -30.332
-56.135 -30.325
-56.290 -30.334
-56.443 -30.378
-56.449 -30.721
-56.511 -30.727
-56.570 -30.743
-56.859 -30.743
-56.851 -30.469
-57.094 -30.380
-57.095 -30.129
-57.599 -30.069
-57.598 -29.852
-58.262 -29.844
-58.272 -30.007
-58.805 -29.951
-58.817 -29.563
-59.514 -29.555
-59.515 -30.108
-59.937 -30.031
-60.174 -29.881
-60.435 -29.598
-60.459 -28.677
-60.467 -27.705
-60.617 -27.697
-60.617 -27.697
-60.506 -26.890
-60.391 -26.071
-60.391 -26.071
-59.973 -25.069
-59.386 -24.456
-58.921 -23.991
-58.195 -23.819
-57.425 -24.130
-57.174 -24.233
-56.734 -24.696
-56.292 -25.149
-55.840 -25.721
-55.424 -26.414
-55.232 -26.995
-55.095 -27.604
-55.005 -28.647
-55.033 -29.488
-55.033 -29.488
TI
-11.492 120.886
-11.493 121.110
-11.412 121.783
-11.188 122.627
-10.995 123.217
-10.708 123.960
-10.390 124.734
-10.159 125.159
-9.984 125.482
-9.784 125.869
-9.596 126.333
-9.390 126.853
-9.221 127.430
-9.133 127.900
-9.095 128.376
-9.020 129.106
-8.926 129.861
-8.726 130.540
-8.562 130.933
-8.267 131.415
-8.267 131.415
-7.661 131.867
-6.989 132.431
-6.681 132.689
-6.681 132.689
-6.662 132.133
-6.642 131.577
-6.680 131.010
-6.717 130.443
-6.526 129.839
-6.334 129.236
-6.565 128.776
-6.795 128.315
-6.990 127.854
-7.184 127.393
-7.185 126.755
-7.309 126.258
-7.433 125.761
-7.503 125.264
-7.644 124.750
-7.784 124.235
-7.784 123.383
-7.853 122.673
-8.062 121.891
-7.990 121.253
-7.812 120.543
-7.812 120.543
-8.410 120.576
-9.007 120.610
-9.586 120.821
-10.165 121.033
-10.829 120.995
-11.492 120.886
-11.492 120.886
TO
-23.750 -174.985
-23.513 -174.842
-23.221 -174.663
-22.906 -174.489
-22.617 -174.323
-22.290 -174.139
-21.915 -173.952
-21.526 -173.818
-21.248 -173.703
-20.893 -173.551
-20.586 -173.403
-20.204 -173.218
-19.779 -173.053
-19.461 -172.970
-19.071 -172.874
-18.777 -172.786
-18.483 -172.698
-18.152 -172.591
-17.935 -172.540
-17.677 -172.445
-17.271 -172.374
-16.963 -172.335
-16.716 -172.311
-16.332 -172.307
-16.041 -172.300
-15.732 -172.331
-15.561 -172.355
-15.373 -172.428
-15.151 -172.602
-15.033 -172.774
-14.867 -172.939
-14.785 -173.130
-14.697 -173.273
-14.584 -173.407
-14.584 -173.407
-14.534 -173.836
-14.534 -173.836
-14.629 -173.905
-14.767 -174.007
-14.895 -174.077
-15.015 -174.139
-15.133 -174.188
-15.314 -174.264
-15.251 -174.567
-15.370 -174.667
-15.471 -174.731
-15.616 -174.822
-15.739 -174.866
-15.880 -174.870
-15.936 -174.601
-16.052 -174.568
-16.201 -174.569
-16.355 -174.576
-16.597 -174.550
-16.735 -174.535
-16.874 -174.529
-17.066 -174.523
-17.101 -174.565
-17.320 -174.599
-17.360 -174.571
-17.612 -174.597
-17.630 -174.560
-17.842 -174.568
-18.035 -174.659
-18.231 -174.757
-18.416 -174.870
-18.605 -174.956
-18.788 -175.035
-19.002 -175.095
-19.225 -175.155
-19.459 -175.189
-19.704 -175.210
-19.387 -175.979
-19.387 -175.979
-19.651 -176.027
-19.814 -176.079
-19.884 -176.122
-20.106 -176.182
-20.129 -176.116
-20.265 -176.152
-20.423 -176.159
-20.494 -176.176
-20.655 -176.190
-20.796 -176.237
-20.891 -176.264
-21.000 -176.289
-21.113 -176.322
-21.301 -176.372
-21.487 -176.405
-21.601 -176.449
-21.811 -176.520
-22.007 -176.601
-22.231 -176.635
-22.286 -176.691
-22.500 -176.709
-22.735 -176.748
-23.048 -176.913
-23.414 -177.102
-23.708 -177.250
-24.105 -177.419
-24.105 -177.419
-24.029 -176.887
-23.952 -176.356
-23.853 -175.691
-23.750 -174.985
-23.750 -174.985
WL
-1.607 138.972
-2.093 139.205
-2.578 139.439
-3.178 139.809
-3.645 140.070
-4.045 140.328
-4.586 140.566
-5.110 140.798
-5.110 140.798
-5.145 140.847
-5.727 141.483
-5.986 142.231
-6.295 142.956
-6.558 143.569
-6.813 144.136
-7.023 144.740
-7.374 145.249
-7.661 145.666
-8.103 146.398
-8.410 146.918
-8.598 146.954
-8.598 146.954
-8.886 147.539
-9.212 148.207
-9.570 148.751
-9.353 149.133
-9.801 149.676
-9.945 150.245
-9.687 150.466
-9.681 151.005
-9.676 151.545
-9.760 151.654
-9.760 151.654
-9.761 151.834
-9.906 151.838
-9.930 151.918
-9.942 152.024
-9.944 152.086
-9.945 152.214
-10.039 152.223
-10.047 152.413
-10.056 152.547
-10.078 152.651
-10.088 152.849
-10.384 152.855
-10.398 153.174
-10.398 153.362
-10.355 153.552
-10.345 153.752
-10.325 153.847
-10.341 154.010
-10.331 154.125
-10.323 154.169
-10.279 154.219
-9.913 154.218
-9.872 154.379
-9.811 154.596
-9.763 154.719
-9.723 154.849
-9.839 154.856
-9.835 154.951
-9.795 155.070
-9.730 155.172
-9.621 155.172
-9.556 155.291
-9.532 155.347
-9.493 155.436
-9.568 155.473
-9.531 155.577
-9.581 155.599
-9.548 155.708
-9.526 155.797
-9.572 155.813
-9.555 155.908
-9.548 155.979
-9.558 155.989
-9.538 156.086
-9.405 156.066
-9.381 156.124
-9.268 156.101
-9.225 156.258
-9.206 156.350
-9.179 156.428
-8.809 156.390
-8.598 156.361
-8.385 156.331
-8.174 156.296
-8.174 156.296
-7.884 156.047
-7.706 155.812
-7.489 155.454
-7.489 155.454
-7.629 155.262
-7.962 154.872
-8.296 154.481
-8.633 154.087
-8.966 153.697
-9.186 153.255
-9.186 153.255
-8.890 153.237
-8.783 153.170
-8.684 153.108
-8.544 152.959
-8.388 152.685
-8.260 152.411
-8.104 152.062
-7.955 151.680
-7.852 151.307
-7.757 150.917
-7.687 150.555
-7.629 150.173
-7.612 149.866
-7.624 149.609
-7.665 149.334
-7.665 149.148
-7.607 148.944
-7.475 148.733
-7.395 148.587
-7.395 148.587
-7.312 148.010
-7.103 147.476
-6.718 146.956
-6.513 146.497
-6.112 146.007
-5.762 145.505
-5.202 145.007
-4.968 144.867
-4.697 144.733
-4.376 144.583
-4.004 144.416
-3.766 144.079
-3.460 143.743
-3.460 143.743
-3.156 143.508
-3.053 143.172
-3.018 142.936
-2.932 142.633
-2.814 142.449
-2.693 142.246
-2.693 142.246
-2.398 141.868
-2.272 141.594
-2.167 141.195
-1.893 140.837
-1.767 140.226
-1.557 139.805
-1.390 139.257
-1.159 138.793
-1.159 138.793
-1.607 138.972
-1.607 138.972
yz
18.438 114.000
18.826 114.419
19.340 114.926
19.687 115.494
19.815 116.319
19.939 117.145
20.330 117.504
20.720 117.864
21.498 118.045
22.107 118.484
22.003 118.958
22.269 119.618
21.951 120.036
21.632 120.452
21.632 120.452
22.043 120.425
22.581 120.394
23.198 120.360
23.979 120.546
24.654 120.981
24.963 121.335
24.963 121.335
24.691 121.575
24.691 121.575
24.853 122.024
25.065 122.554
24.860 123.182
24.898 123.721
25.017 123.755
25.070 124.148
25.120 124.705
25.475 124.697
25.569 125.159
25.644 125.736
25.927 125.663
26.123 126.065
26.370 126.383
26.540 126.477
26.811 126.820
27.006 126.745
27.149 126.885
27.485 127.417
27.662 127.347
27.790 127.599
28.053 128.049
28.401 128.557
28.708 128.321
29.032 128.687
29.355 129.055
29.893 128.646
30.104 128.881
30.387 128.848
30.585 129.032
31.024 128.819
31.265 129.059
31.409 129.121
31.793 129.442
31.793 129.442
31.601 128.812
31.471 128.258
31.362 127.655
31.273 127.054
31.227 126.404
31.202 125.729
31.196 125.030
31.250 124.487
31.326 123.867
31.471 123.364
31.471 123.364
31.502 122.780
31.530 122.195
31.557 121.611
31.581 121.027
31.392 120.368
31.199 119.711
31.376 119.001
31.776 118.577
32.175 118.150
32.572 117.719
32.968 117.284
33.593 116.521
34.213 115.746
34.828 114.960
34.843 114.280
34.854 113.599
34.469 113.250
34.083 112.905
33.465 112.274
32.843 111.651
32.252 111.633
31.660 111.615
31.252 111.209
30.842 110.806
30.569 109.880
30.290 108.959
30.005 108.043
29.713 107.133
29.254 106.262
28.790 105.399
28.334 105.170
27.878 104.942
27.117 105.182
26.355 105.419
25.797 105.720
25.238 106.018
24.646 106.578
24.052 107.132
23.456 107.681
23.141 108.561
22.820 109.436
22.495 110.308
22.165 111.175
21.831 112.038
21.408 112.288
20.985 112.537
20.561 112.784
20.137 113.030
19.713 113.274
19.288 113.517
18.863 113.759
18.438 114.000
18.438 114.000
cp
-6.811 68.274
-7.253 67.811
-7.648 68.073
-8.027 67.642
-8.492 68.039
-8.881 67.565
-9.270 67.090
-9.630 67.378
-9.990 66.919
-10.350 66.460
-10.762 66.787
-11.210 66.167
-11.559 66.418
-12.018 65.698
-12.426 66.033
-12.833 66.369
-13.268 65.820
-13.777 66.210
-13.979 65.928
-14.339 66.208
-14.698 66.488
-15.270 66.888
-15.822 67.290
-15.942 67.383
-16.139 67.033
-16.659 67.410
-17.090 66.708
-17.450 66.143
-17.783 65.542
-18.058 65.007
-18.443 65.264
-18.828 65.522
-19.578 66.033
-20.078 66.428
-19.870 66.751
-20.218 67.040
-20.073 67.309
-20.369 67.593
-20.280 67.768
-20.469 67.897
-20.291 68.213
-20.712 68.559
-20.878 68.277
-21.450 68.653
-22.088 69.202
-22.387 68.797
-22.831 69.162
-23.373 69.558
-23.709 69.850
-24.040 69.402
-24.369 69.680
-24.678 69.939
-24.970 69.592
-25.483 70.090
-25.651 69.960
-25.651 69.960
-26.060 70.409
-25.912 70.665
-26.187 70.994
-26.083 71.135
-26.454 71.580
-26.386 71.717
-26.656 72.066
-26.718 72.008
-27.146 72.463
-27.573 72.920
-27.446 73.123
-27.655 73.400
-27.570 73.534
-27.944 73.969
-28.317 74.406
-28.541 74.192
-28.904 74.592
-29.265 74.994
-29.328 74.938
-29.839 75.554
-30.006 75.364
-30.118 75.515
-30.240 75.393
-30.573 75.797
-30.906 76.204
-30.970 76.148
-31.465 76.689
-31.719 76.395
-32.090 76.812
-32.459 77.233
-32.828 77.658
-33.194 78.086
-32.531 78.908
-31.856 79.726
-31.169 80.540
-30.472 81.349
-29.763 82.153
-29.044 82.951
-28.316 83.744
-27.578 84.531
-26.832 85.312
-26.077 86.087
-25.315 86.855
-24.546 87.617
-23.771 88.372
-22.990 89.119
-22.204 89.860
-21.413 90.593
-20.619 91.319
-19.822 92.038
-19.022 92.748
-18.221 93.451
-17.419 94.146
-16.617 94.834
-15.815 95.513
-15.014 96.184
-14.215 96.847
-13.418 97.503
-12.624 98.150
-11.834 98.789
-11.048 99.419
-10.266 100.042
-9.490 100.657
-8.719 101.263
-7.955 101.862
-7.197 102.452
-6.558 101.858
-5.983 101.346
-5.305 100.791
-4.656 100.359
-4.145 99.980
-3.729 99.675
-3.312 99.370
-2.665 98.874
-2.021 98.301
-1.634 98.035
-1.247 97.769
-0.547 97.372
0.116 97.011
0.759 96.670
1.123 96.379
1.345 96.202
1.345 96.202
1.487 96.089
1.882 95.542
2.104 94.979
2.104 94.979
1.493 94.415
0.882 93.852
0.549 93.046
0.216 92.241
-0.117 91.436
-0.450 90.630
-0.783 89.825
-1.179 89.430
-1.574 89.036
-2.271 88.828
-2.969 88.620
-3.529 87.923
-4.088 87.225
-3.716 86.501
-3.344 85.779
-3.181 84.987
-3.017 84.195
-3.225 83.729
-3.433 83.263
-3.641 82.796
-3.848 82.330
-4.031 81.701
-4.213 81.072
-4.393 80.374
-4.573 79.676
-4.752 79.141
-4.932 78.606
-4.994 77.981
-5.055 77.356
-5.046 76.779
-5.038 76.203
-4.776 75.518
-4.514 74.833
-4.411 74.358
-4.307 73.883
-4.927 73.770
-5.778 73.704
-6.191 73.544
-7.039 73.392
-7.038 72.884
-6.867 72.355
-6.696 71.834
-6.599 71.312
-6.502 70.786
-6.474 70.292
-6.445 69.806
-6.538 69.007
-6.811 68.274
-6.811 68.274
mq
-57.436 148.806
-58.104 149.150
-58.552 149.398
-58.999 149.652
-59.570 150.006
-59.475 150.733
-59.944 151.008
-60.413 151.290
-60.176 152.473
-59.930 153.639
-60.681 154.294
-61.429 154.981
-62.174 155.701
-62.914 156.457
-62.478 157.970
-62.026 159.440
-61.559 160.865
-61.457 161.228
-61.457 161.228
-61.384 161.129
-61.053 160.740
-60.504 160.327
-60.005 159.803
-60.005 159.803
-59.939 159.691
-59.732 159.413
-59.511 159.186
-59.305 158.972
-59.071 158.650
-58.858 158.385
-58.779 158.267
-58.605 158.121
-58.334 157.920
-58.068 157.751
-57.783 157.620
-57.474 157.615
-57.230 157.640
-56.992 157.703
-56.725 157.823
-56.438 157.944
-56.310 158.042
-56.165 158.153
-56.022 158.226
-55.779 158.332
-55.522 158.465
-55.272 158.540
-55.047 158.596
-54.928 158.618
-54.689 158.674
-54.559 158.740
-54.308 158.885
-54.088 158.985
-54.702 157.411
-55.295 155.788
-55.867 154.115
-56.415 152.392
-56.939 150.622
-57.436 148.806
lw
-47.000 32.126
-47.264 33.174
-46.806 33.358
-46.346 33.540
-45.979 33.818
-46.081 33.982
-46.090 34.087
-46.212 34.267
-46.222 34.504
-45.971 34.704
-45.466 34.868
-45.106 35.014
-44.855 35.182
-44.866 35.660
-44.961 35.973
-44.967 36.303
-44.920 36.677
-44.804 37.086
-44.875 37.508
-44.619 38.083
-44.619 38.083
-44.401 38.194
-44.055 38.338
-44.165 39.073
-43.726 39.267
-43.286 39.459
-43.438 40.506
-43.579 41.558
-43.117 41.686
-42.655 41.812
-42.730 42.469
-42.260 42.572
-41.790 42.674
-41.321 42.774
-40.850 42.873
-40.915 44.009
-40.671 44.023
-40.691 44.686
-40.369 44.716
-40.366 45.303
-40.108 45.332
-40.119 46.074
-39.495 46.160
-38.870 46.244
-38.764 47.135
-38.651 48.023
-38.478 48.017
-38.014 48.633
-38.000 49.034
-37.792 49.037
-37.790 49.945
-37.597 49.962
-37.580 50.823
-37.451 50.827
-37.441 51.555
-37.432 52.283
-36.797 52.311
-36.162 52.338
-35.257 51.704
-34.345 51.082
-33.429 50.472
-32.508 49.874
-31.583 49.288
-30.656 48.713
-29.726 48.149
-28.795 47.596
-27.863 47.053
-26.931 46.522
-26.000 46.000
-24.878 46.000
-23.753 46.000
-22.627 46.000
-21.500 46.000
-20.373 46.000
-19.247 46.000
-18.122 46.000
-17.000 46.000
-16.522 45.064
-16.038 44.130
-15.549 43.198
-15.054 42.268
-14.555 41.341
-14.052 40.417
-13.545 39.497
-13.036 38.582
-12.523 37.671
-12.008 36.765
-11.491 35.864
-10.974 34.969
-10.455 34.081
-11.027 34.709
-11.717 34.441
-12.406 34.172
-13.167 34.071
-13.859 34.461
-14.549 34.852
-15.191 34.729
-15.834 34.604
-16.334 34.901
-16.833 35.199
-17.404 35.200
-17.976 35.200
-18.356 34.599
-18.688 34.272
-19.019 33.943
-19.350 33.613
-19.681 33.282
-20.512 33.196
-21.344 33.110
-21.492 32.636
-21.639 32.160
-21.784 31.684
-21.928 31.207
-22.071 30.729
-22.212 30.250
-22.352 29.770
-22.491 29.290
-22.971 28.844
-23.450 28.396
-23.928 27.944
-24.404 27.489
-24.847 27.592
-25.291 27.696
-25.733 27.800
-26.177 27.905
-26.474 27.253
-26.768 26.596
-27.477 26.595
-28.187 26.594
-28.625 27.179
-29.060 27.769
-29.454 28.054
-29.849 28.341
-29.849 28.341
-30.635 28.922
-31.236 29.656
-31.832 30.400
-32.425 31.153
-33.012 31.916
-33.595 32.690
-34.173 33.474
-34.746 34.269
-35.314 35.075
-35.876 35.892
-36.433 36.721
-36.984 37.562
-37.840 37.174
-38.696 36.777
-39.550 36.371
-40.403 35.955
-41.254 35.528
-42.103 35.090
-42.103 35.090
-42.931 34.636
-43.747 34.157
-44.561 33.678
-45.382 33.171
-46.191 32.663
-46.998 32.125
-47.000 32.126
sr
-55.232 -26.995
-55.424 -26.414
-55.840 -25.721
-56.292 -25.149
-56.734 -24.696
-57.174 -24.233
-57.425 -24.130
-58.195 -23.819
-58.921 -23.991
-59.386 -24.456
-59.973 -25.069
-60.391 -26.071
-60.391 -26.071
-60.545 -25.093
-60.692 -24.107
-60.723 -22.914
-60.744 -21.719
-60.782 -20.651
-60.811 -19.581
-60.289 -19.370
-60.250 -18.646
-59.938 -18.547
-59.542 -18.433
-59.509 -18.123
-59.153 -18.060
-59.129 -17.667
-59.098 -16.917
-59.098 -16.410
-58.767 -16.226
-58.459 -16.005
-58.439 -15.972
-58.390 -15.069
-58.317 -13.954
-58.241 -12.649
-58.158 -11.190
-58.092 -9.885
-57.989 -8.607
-57.920 -7.525
-57.869 -7.009
-57.617 -7.013
-57.318 -6.999
-57.270 -6.538
-57.240 -6.130
-56.982 -6.094
-56.672 -6.057
-56.627 -5.448
-56.592 -4.693
-56.210 -4.675
-55.807 -4.691
-55.769 -4.056
-55.740 -3.720
-55.707 -2.896
-55.657 -2.080
-55.653 -1.614
-55.129 -1.606
-55.019 -1.039
-54.852 -0.438
-54.852 -0.438
-54.453 -0.915
-54.053 -1.382
-54.327 -2.372
-53.547 -2.920
-52.764 -3.447
-51.979 -3.956
-52.049 -4.238
-51.591 -4.478
-51.133 -4.713
-50.675 -4.943
-50.216 -5.169
-50.417 -6.160
-50.610 -7.159
-50.001 -7.433
-50.059 -7.638
-49.270 -7.961
-49.283 -8.022
-48.961 -8.139
-49.091 -8.922
-49.216 -9.710
-49.804 -10.966
-50.380 -12.256
-50.942 -13.581
-51.490 -14.940
-52.023 -16.334
-52.539 -17.762
-53.037 -19.223
-53.517 -20.717
-53.978 -22.242
-54.418 -23.798
-54.836 -25.383
-55.232 -26.995
MintPy-1.6.2/src/mintpy/data/plate_boundary/README.md 0000664 0000000 0000000 00000003475 15032632755 0022270 0 ustar 00root root 0000000 0000000 ## Plate boundary files
### GSRM
The Global Strain Rate Map (GSRM) version 2.1 (http://geodesy.unr.edu/GSRM/) is defined in Kreemer et al. (2014). It includes 50 rigid plates. The no-net rotation (NNR) Euler poles for the IGS08 reference frame of all plates are in Table S2 of Kreemer et al. (2014). The boundary file of all plates are in GMT (lon, lat) format and is downloaded as below:
```bash
mkdir -p GSRM
wget http://geodesy.unr.edu/GSRM/GSRM_plate_outlines.gmt -O GSRM/plate_outlines.lola
```
### MORVEL
The Mid-Ocean Ridge VELocity (MORVEL) (http://www.geology.wisc.edu/~chuck/MORVEL/) is defined in DeMets et al. (2010) with the NNR plate motion model (NNR-MORVEL56) defined in Argus et al. (2011). It includes 56 plates. The NNR Euler poles are in Table 1 of Argus et al. (2011). The boundary file of all plates are in GMT (lat, lon) format and is downloaded as below:
```bash
mkdir -p MORVEL
wget http://www.geology.wisc.edu/~chuck/MORVEL/NnrMRVL_PltBndsLatLon.zip
unzip -p NnrMRVL_PltBndsLatLon.zip All_boundaries >MORVEL/plate_outlines.lalo
```
### References
+ Argus, D. F., Gordon, R. G., & DeMets, C. (2011). Geologically current motion of 56 plates relative to the no-net-rotation reference frame. _Geochemistry, Geophysics, Geosystems, 12_(11). https://doi.org/10.1029/2011GC003751
+ Bird, P. (2003). An updated digital model of plate boundaries. _Geochemistry, Geophysics, Geosystems, 4_(3). https://doi.org/10.1029/2001GC000252
+ DeMets, C., Gordon, R. G., & Argus, D. F. (2010). Geologically current plate motions. _Geophysical journal international, 181_(1), 1-80. https://doi.org/10.1111/j.1365-246X.2009.04491.x
+ Kreemer, C., Blewitt, G., & Klein, E. C. (2014). A geodetic plate motion and Global Strain Rate Model. _Geochemistry, Geophysics, Geosystems, 15_(10), 3849-3889. https://doi.org/10.1002/2014GC005407
MintPy-1.6.2/src/mintpy/data/shaded_dot.png 0000664 0000000 0000000 00000002356 15032632755 0020602 0 ustar 00root root 0000000 0000000 PNG
IHDR @ @ `U gAMA a cHRM z&